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

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

Спасибо.

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

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

 sub IterateCells() For Each Cell in ActiveSheet.UsedRange.Cells 'do some stuff Next End Sub 

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

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

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

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

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

 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 

Для приложения 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 .

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

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

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

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

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

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

 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(); } 

В 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) и так далее.

Мои навыки 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
  • C # AddIn Excel: экспорт файла xls в текстовый файл с разделителем
  • Перекрытие приложения Excel по недавно открытому приложению - C #
  • Как мне программным образом получить адрес скопированного выделения из буфера обмена
  • Как вставить растровое изображение диаграммы Excel с помощью VSTO и C #
  • VSTO: дизайнер Visual Studio повторно использует экземпляр Excel вместо запуска собственного
  • Может ли кто-нибудь предложить пошаговую ссылку о разработке плагина excel
  • Excel не будет открывать / запускать VSTO AddIn при запуске в режиме отладки Visual Studio 2010
  • Запись в ячейку включает ScreenUpdating в моей надстройке VSTO
  • Исключение из HRESULT: 0x800A03EC - Запись массива в диапазон в надстройке Excel
  • Добавление формулы в ячейку Исключение из HRESULT: 0x800A03EC
  • Как отменить кнопку в пользовательском интерфейсе в долгосрочной перспективе в VSTO Addin?
  • Давайте будем гением компьютера.