Цикл по ячейкам в Excel в двух измерениях VBA - PullRequest
2 голосов
/ 03 декабря 2009

Я пытаюсь перебрать набор ячеек, используя VBA на листе, и проверить, содержат ли они какие-либо данные. Моя таблица выглядит так:

   __A_____B_____C_____D____E_____F____G
 1| 3122  -1    -1   3243   
 2| -1    -1    -1   3243   1     1    1
 3| -1    -1    -1   3255         1
 5| 4232 2132   -1   3259
 6| 7544 1333   324  3259
 7| -1    -1    -1   3259   1     2    1
 8| -1    -1    -1   3259   1     1    1
 9| -1    -1    -1   3267
10| 2121  222   -1   3267

Я хочу избавиться от строк, у которых нет данных в столбцах E F и G, но я не уверен, как циклически проходить по строкам и столбцам. Я видел много инструкций для зацикливания столбца, но я не могу найти ничего о том, как зацикливаться в двух измерениях, проверяя ячейки на наличие данных.

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 декабря 2009

Основная идея зацикливания строк и столбцов состоит в том, что вам нужно два for цикла.

Первый цикл по строкам, второй по столбцам.

Я недостаточно использую VBA, чтобы помнить, как удаляются строки, но если вы зациклились в обратном направлении (как в приведенном ниже коде), вы никогда не должны забывать, какая строка удаляется.

Следующий код должен работать для ваших целей (хотя он требует рефакторинга!):
Редактировать: спасибо barrowc за исправление.

Sub remove_some_rows()
    Dim i As Long
    Dim j As Long

    Dim current_cell As Object

    Dim beg_row As Long
    Dim end_row As Long
    Dim beg_col As Long
    Dim end_col As Long

    beg_row = 1
    end_row = 10
    beg_col = 1
    end_col = 7

    Dim empty_col_counter As Integer

    For i = end_row To beg_row Step -1

        empty_col_counter = 0

        For j = end_col To beg_col Step -1
            Set current_cell = ThisWorkbook.ActiveSheet.Cells(i, j)

            If j > 4 And current_cell.Value = "" Then
                empty_col_counter = empty_col_counter + 1
            End If
        Next j

        If empty_col_counter = 3 Then
            current_cell.EntireRow.Select
            Selection.Delete
        End If

    Next i
End Sub
3 голосов
/ 03 декабря 2009

Это должно работать:

Sub main()

Dim maxRow As Integer
Dim currentRow As Integer

With Worksheets("Sheet1")
    maxRow = .Range("A1").CurrentRegion.Rows.Count

    Dim i As Integer
    ' Start at the bottom and work upwards
    For i = maxRow To 1 Step -1
        ' 5 represents column E, 6 is column F and 7 is column G
        If (.Cells(i, 5).Value = "" And .Cells(i, 6).Value = "" And _
            .Cells(i, 7).Value = "") Then
            .Rows(i).Delete
        End If
    Next i
End With

End Sub

Поскольку нужно проверить только три столбца, просто использовать And, чтобы объединить эти три проверки вместе. В более сложной ситуации вложенный цикл For, как в ответе Адама Бернье, был бы лучше

...