Вопрос

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

Спасибо.

Это было полезно?

Решение

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 до последней ячейки с данными (самая нижняя правая ячейка)

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

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

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

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

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, приложения.ActiveSheet работает, если вам нужен только тот, на который смотрит пользователь.

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

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

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

В принципе, вы можете выполнять цикл по диапазону

Возьми простыню

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, но, надеюсь, это несколько поможет (по крайней мере, даст вам отправную точку для работы).

  • Грудничок
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top