Как читать данные из несмежных ячеек в Excel, используя C # - PullRequest
0 голосов
/ 12 августа 2010

У меня есть лист Excel, в котором выбрано несколько ячеек, которые не соседствуют друг с другом. Когда пользователь нажимает на кнопку, нам нужно прочитать все данные ячеек, обработать их и записать в другую ячейку.

Если ячейки расположены рядом друг с другом, я смог получить диапазон и выполнить операцию. Но если клетки не соседствуют друг с другом, я не могу получить диапазон. Selection.Range всегда дает адрес последней выбранной ячейки.

Но нам нужно получить адреса всех ячеек, что я не могу сделать.

Пожалуйста, кто-нибудь может предложить мне способ справиться с этим сценарием.

Пример кода:

Range objRange = (Range) Globals.ThisAddIn.Application.Selection;
                int nColCount = objRange.Columns.Count;
                int nRowCount = objRange.Rows.Count;

Вини

Я пробовал этот код на основе вашего предложения,

 Range objRange = (Range) Globals.ThisAddIn.Application.Selection;

        foreach (Range cell in objRange)
        {
            MessageBox.Show("" + cell.Value2);
        }

Но это не сработало. Всегда дает последнюю выбранную ячейку. Я выбрал ячейки А1, А4, А13, А16. Но этот код возвращает только значение ячейки A16.

Ответы [ 2 ]

0 голосов
/ 13 августа 2010

После многих попыток я получил ответ.

Вот рабочий код,

Areas objAreas = (Areas)objRange.Areas;
foreach (Range area in objAreas)
{
   string CellAddress = (GetExcelColumnName(area.Column) + "" + area.Row);
   MessageBox.Show(CellAddress);
}

GetExcelColumnName - это пользовательская функция, которую вы написали для преобразования номера столбца в код столбца (например,a, b, ... aa, ab .. и т. д.)

0 голосов
/ 12 августа 2010

Диапазон наследуется от IEnumerable.Таким образом, вы можете использовать для каждого итератора для перечисления через все ячейки.См. Эквивалентный код VBA ниже:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim result As String
  result = ""
  Dim c As Range
  For Each c In Me.Application.Selection
    result = result & ", " & c.Text
  Next c
  Me.Cells.Item(1, 1).Value = result 
End Sub

Вы всегда можете использовать Range.Row, Range.Column для получения адреса ячейки.

Как сказано в комментариях, используйте foreach synatx:

foreach(Range cell in objRange)
{
   // now access cell's properties - c.Value will give value
}
...