Перебор всех ячеек в Excel VBA или VSTO 2005

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

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
0
114 122
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

Код, который перебирает каждую ячейку в диапазоне, крайне неэффективен. Считайте диапазон в массив, сделайте ваши проверки / изменения в массиве, затем запишите массив обратно в диапазон. Давайте согласимся прекратить использование этого кода и, возможно, он исчезнет.

JimmyPena 13.06.2012 04:37

Вы можете использовать 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, из-за которого моя система вылетела из строя!

Mr Purple 12.08.2014 02:06

да, это целая куча ячеек, которую нужно перебирать.

cori 12.08.2014 03:29

Для этого существует несколько методов, каждый из которых имеет свои преимущества и недостатки; Прежде всего, вам понадобится экземпляр объекта 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, но, надеюсь, это поможет в некоторой степени (по крайней мере, даст вам отправную точку для работы).

  • Brisketeer

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

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

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

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

Абсолютно согласен! Я только что опробовал свой первый прогон, всего для нескольких тысяч ячеек, это заняло более 30 секунд, что невероятно!

Ryan Liang 19.09.2008 00:39

Другие вопросы по теме