Подтвердить что ты не робот

Как перебирать все ячейки в Excel VBA или VSTO 2005

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

Спасибо.

4b9b3361

Ответ 1

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 Кажется, он очень полезен в качестве функции для иллюстрации средств проверки значений в ячейках в упорядоченном мода.

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

Ответ 2

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

sub IterateCells()

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

End Sub

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Для приложения VB или С# один способ сделать это - использовать 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.

Ответ 6

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

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

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

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

Ответ 7

В основном вы можете перебирать диапазон

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

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

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

Расширение Excel большой "большой сетки" максимальное количество строк в рабочий лист от 65536 до 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();
        }

Ответ 8

В 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) и т.д.

Ответ 9

Мои навыки 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