Итерация по всем ячейкам в Excel VBA или VSTO 2005 - PullRequest
23 голосов
/ 16 сентября 2008

Мне нужно просто пройти по всем ячейкам электронной таблицы Excel и проверить значения в ячейках. Ячейки могут содержать текст, цифры или быть пустыми. Я не очень знаком / не комфортно работаю с концепцией «Range». Поэтому любые примеры кодов будут с благодарностью. (Я действительно пытался гуглить, но фрагменты кода, которые я нашел, не совсем то, что мне нужно)

Спасибо.

Ответы [ 9 ]

56 голосов
/ 16 сентября 2008

Если вам нужно только посмотреть на ячейки, которые вы используете, вы можете использовать:

sub IterateCells()

   For Each Cell in ActiveSheet.UsedRange.Cells
      'do some stuff
   Next

End Sub

, который поразит все в диапазоне от A1 до последней ячейки с данными (нижняя правая ячейка)

7 голосов
/ 16 сентября 2008
Sub CheckValues1()
    Dim rwIndex As Integer
    Dim colIndex As Integer
    For rwIndex = 1 To 10
            For colIndex = 1 To 5
                If Cells(rwIndex, colIndex).Value <> 0 Then _
                    Cells(rwIndex, colIndex).Value = 0
            Next colIndex
    Next rwIndex
End Sub

Нашел этот фрагмент в http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Кажется, что это довольно полезная функция для иллюстрации способов проверки значений в ячейках упорядоченным образом.

Просто представьте, что это двухмерный массив, и примените ту же логику для циклического перемещения по ячейкам.

5 голосов
/ 18 сентября 2008

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

Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value

Тогда вы можете получить значение ячейки, просто проверив ValArray (строка, столбец)

3 голосов
/ 16 сентября 2008

Вы можете использовать For Each для перебора всех ячеек в определенном диапазоне.

Public Sub IterateThroughRange()

Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range

Set wb = Application.Workbooks(1)
Set ws = wb.Sheets(1)
Set rng = ws.Range("A1", "C3")

For Each cell In rng.Cells
    cell.Value = cell.Address
Next cell

End Sub
2 голосов
/ 16 сентября 2008

Для приложений на VB или C # одним из способов является использование Office Interop. Это зависит от того, с какой версией Excel вы работаете.

Для Excel 2003 эта статья MSDN - хорошее место для начала. Понимание объектной модели Excel с точки зрения разработчика Visual Studio 2005

В основном вам нужно будет сделать следующее:

  • Запустите приложение Excel.
  • Откройте книгу Excel.
  • Извлечение листа из книги по имени или индексу.
  • Итерация по всем ячейкам на листе, которые были извлечены как диапазон.
  • Пример (не проверенный) фрагмент кода ниже для последнего шага.

    Excel.Range allCellsRng;
    string lowerRightCell = "IV65536";
    allCellsRng = ws.get_Range("A1", lowerRightCell).Cells;
    foreach (Range cell in allCellsRng)
    {
        if (null == cell.Value2 || isBlank(cell.Value2))
        {
          // Do something.
        }
        else if (isText(cell.Value2))
        {
          // Do something.
        }
        else if (isNumeric(cell.Value2))
        {
          // Do something.
        }
    }

Для Excel 2007 попробуйте эту ссылку MSDN .

1 голос
/ 16 сентября 2008

Вы можете циклически проходить диапазон

Получить лист

myWs = (Worksheet)MyWb.Worksheets[1];

Получите интересующий диапазон Если вы действительно хотите проверить каждую ячейку, используйте пределы Excel

Excel 2007 "Большая сетка" увеличивается максимальное количество строк в рабочий лист от 65 536 до более 1 миллион, а количество столбцов от 256 (IV) до 16,384 (XFD). отсюда http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

и затем цикл в диапазоне

        Range myBigRange = myWs.get_Range("A1", "A256");

        string myValue;

        foreach(Range myCell in myBigRange )
        {
            myValue = myCell.Value2.ToString();
        }
1 голос
/ 16 сентября 2008

Есть несколько методов для достижения этой цели, каждый из которых имеет свои преимущества и недостатки; Прежде всего, вам понадобится экземпляр объекта Worksheet, Application.ActiveSheet работает, если вам нужен только тот, на который смотрит пользователь.

Объект Worksheet имеет три свойства, которые можно использовать для доступа к данным ячейки (ячейки, строки, столбцы), и метод, который можно использовать для получения блока данных ячейки (get_Range).

Диапазоны могут быть изменены и тому подобное, но вам может понадобиться использовать свойства, упомянутые выше, чтобы выяснить, где находятся границы ваших данных. Преимущество Range становится очевидным, когда вы работаете с большими объемами данных, поскольку надстройки VSTO размещаются за пределами самого приложения Excel, поэтому все вызовы в Excel должны проходить через слой с накладными расходами; получение Range позволяет вам получать / устанавливать все нужные данные за один вызов, что может иметь огромное преимущество в производительности, но для этого необходимо использовать явные детали, а не выполнять итерацию по каждой записи.

В этом сообщении на форуме MSDN показан разработчик VB.Net, задающий вопрос о получении результатов Range в виде массива

0 голосов
/ 16 сентября 2008

Мои навыки VBA немного ржавые, но это общее представление о том, что я буду делать.
Самый простой способ сделать это - выполнить цикл для каждого столбца:

public sub CellProcessing()
on error goto errHandler

    dim MAX_ROW as Integer   'how many rows in the spreadsheet
    dim i as Integer
    dim cols as String

    for i = 1 to MAX_ROW
        'perform checks on the cell here
        'access the cell with Range("A" & i) to get cell A1 where i = 1
    next i

exitHandler:
    exit sub
errHandler:
    msgbox "Error " & err.Number & ": " & err.Description
    resume exitHandler
end sub

кажется, что цветовая подсветка синтаксиса не похожа на vba, но, надеюсь, это поможет (по крайней мере, даст вам отправную точку для работы).

  • Brisketeer
0 голосов
/ 16 сентября 2008

В Excel VBA эта функция предоставит вам содержимое любой ячейки на любом листе.

Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
    getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function

Так что если вы хотите проверить значение ячеек, просто поместите функцию в цикл, дайте ей ссылку на нужный лист, а также индекс строки и индекс столбца ячейки. Индекс строки и индекс столбца начинаются с 1, то есть ячейка A1 будет иметь вид ws.Cells (1,1) и т. Д.

...