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





В 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) и так далее.
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. Он кажется весьма полезным в качестве функции для демонстрации средств упорядоченной проверки значений в ячейках.
Просто представьте его как своего рода двумерный массив и примените ту же логику для циклического перебора ячеек.
Вы можете использовать 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
Если вам нужно только посмотреть на используемые ячейки, вы можете использовать:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
который поразит все в диапазоне от A1 до последней ячейки с данными (самая нижняя правая ячейка)
Вау ... намного лучше, чем workheet.cells, из-за которого моя система вылетела из строя!
да, это целая куча ячеек, которую нужно перебирать.
Для этого существует несколько методов, каждый из которых имеет свои преимущества и недостатки; Прежде всего, вам понадобится экземпляр объекта Worksheet, Application.ActiveSheet работает, если вам просто нужен тот, на который смотрит пользователь.
Объект Worksheet имеет три свойства, которые можно использовать для доступа к данным ячеек (Cells, Rows, Columns), и метод, который можно использовать для получения блока данных ячеек (get_Range).
Можно изменять размеры диапазонов и тому подобное, но вам может потребоваться использовать свойства, упомянутые выше, чтобы узнать, где находятся границы ваших данных. Преимущество Range становится очевидным, когда вы работаете с большими объемами данных, потому что надстройки VSTO размещаются за пределами самого приложения Excel, поэтому все вызовы Excel должны проходить через слой с накладными расходами; получение Range позволяет вам получить / установить все данные, которые вы хотите, за один вызов, что может иметь огромное преимущество в производительности, но требует, чтобы вы использовали явные детали, а не повторяли каждую запись.
Это сообщение на форуме MSDN показывает, как разработчик VB.Net задает вопрос о получении результатов Range в виде массива
Вы в основном можете перебрать диапазон
Получить лист
myWs = (Worksheet)MyWb.Worksheets[1];
Получите интересующий вас диапазон Если вы действительно хотите проверить каждую ячейку, используйте ограничения Excel
The Excel 2007 "Big Grid" increases the maximum number of rows per worksheet from 65,536 to over 1 million, and the number of columns from 256 (IV) to 16,384 (XFD). from here 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();
}
Мои навыки 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, но, надеюсь, это поможет в некоторой степени (по крайней мере, даст вам отправную точку для работы).
Для приложения VB или C# один из способов сделать это - использовать Office Interop. Это зависит от того, с какой версией Excel вы работаете.
Для Excel 2003 эта статья MSDN - хорошее место для начала. Понимание объектной модели Excel с точки зрения разработчика Visual Studio 2005
В основном вам нужно сделать следующее:
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.
Если вы просто просматриваете значения ячеек, вы можете сохранить значения в массиве вариантного типа. Кажется, что получение значения элемента в массиве может быть намного быстрее, чем взаимодействие с Excel, поэтому вы можете увидеть некоторую разницу в производительности с использованием массива всех значений ячеек по сравнению с многократным получением отдельных ячеек.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
Затем вы можете получить значение ячейки, просто проверив ValArray (строка, столбец)
Абсолютно согласен! Я только что опробовал свой первый прогон, всего для нескольких тысяч ячеек, это заняло более 30 секунд, что невероятно!
Код, который перебирает каждую ячейку в диапазоне, крайне неэффективен. Считайте диапазон в массив, сделайте ваши проверки / изменения в массиве, затем запишите массив обратно в диапазон. Давайте согласимся прекратить использование этого кода и, возможно, он исчезнет.