Как перебирать все ячейки в Excel VBA или VSTO 2005
Мне нужно просто пройти через все ячейки в электронной таблице Excel и проверить значения в ячейках. Ячейки могут содержать текст, цифры или быть пустыми. Я не очень хорошо знаком/комфортно работает с концепцией "Range". Таким образом, любые примеры кодов были бы весьма полезны. (Я попытался это сделать, но обнаруженные фрагменты кода не совсем сделали то, что мне было нужно)
Спасибо.
Ответы
Ответ 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, но, надеюсь, это поможет несколько (по крайней мере, дать вам отправную точку для работы).