Итерации по всем строкам и поиск пустых активных листов VBA

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

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

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

0
задан Rüdiger 13 July 2018 в 11:04
поделиться

2 ответа

перед тем, как использовать

, вы должны определить размер emptyRows(), кроме того, вы можете использовать WorksheetFunction.Count() для проверки любого значения в текущей строке

finally

Function FindAllEmptyRows(sheet As Worksheet) As Variant
    Dim emptyRows() As Variant
    Dim i As Long, rowNumber As Long, rowCounter As Long

    With sheet.UsedRange ' reference passed sheet UsedRange
        rowNumber = .Rows.Count
        ReDim emptyRows(0 To rowNumber - 1) ' dim the array to the maximum possible size
        For i = rowNumber To 1 Step -1 ' step through reference range rows from the last baxkwards to the first
            If WorksheetFunction.Count(.Rows(i)) = 0 Then
                emptyRows(rowCounter) = i + .Rows(1).Row - 1 ' fill array in current index with current row index
                rowCounter = rowCounter + 1 ' update array index
            End If
        Next
    End With
    ReDim Preserve emptyRows(0 To rowCounter) ' redim the array according to the actual number of found empty rows

    FindAllEmptyRows = emptyRows
End Function

обратите внимание, что:

emptyRows(rowCounter) = i + .Rows(1).Row - 1

хранит индекс строки absolute , т. е. индекс строки листа, тогда как

emptyRows(rowCounter) = i 

будет хранить индекс строки relative , т. е. индекс строки с UsedRange, который может начинаться с строки, отличной от строки 1

0
ответ дан DisplayName 17 August 2018 в 13:05
поделиться
  • Если вы хотите итерации от последней строки к первой, вам нужно будет добавить Step -1.
  • emptyRows() необходимо подбирать, чтобы соответствовать данным, используя ReDim
  • .Column = 16384 следует изменить на .Column = sheet.Columns.Count.
  • Я предпочитаю If WorksheetFunction.CountA(sheet.Rows(i)) = 0 Then
  • Cells должен быть квалифицирован для sheet: sheet.Cells(i, 1)

Рефакторированный код

Function FindAllEmptyRows(sheet As Worksheet) As Variant
    Dim emptyRows() As Variant
    Dim i As Long, rowNumber As Long
    Dim rowCounter As Integer

    rowNumber = sheet.UsedRange.Rows.Count
    For i = rowNumber To 1 Step -1
        If sheet.Cells(i, 1).End(xlToRight).Column = sheet.Columns.Count And Cells(i, 1) = "" Then
            If rowCounter = 0 Then
                ReDim emptyRows(0)
            Else
                ReDim Preserve emptyRows(rowCounter)
            End If

            emptyRows(rowCounter) = i
            rowCounter = rowCounter + 1
        End If
    Next

    FindAllEmptyRows = emptyRows
End Function

SpecialCells

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

MSDN - Range.SpecialCells Method (Excel)

Возвращает объект Range, который представляет все ячейки, соответствующие указанному типу и значению

OZ Grid

< blockquote>

Одним из наиболее полезных методов в Excel (по моему опыту) является метод SpecialCells. При использовании он возвращает объект диапазона, который представляет только те типы ячеек, которые мы указываем. Например, можно использовать метод SpecialCells для возврата объекта Range, который содержит только формулы. Фактически, мы можем, если хотим, даже сузить его дальше, чтобы наш объект Range (содержащий только формулы) возвращал только формулы с ошибками.

Изучение вывода этого кода должно дайте вам хорошие идеи о том, как использовать SpecialCells.

Sub SpecialFoo()
    Dim rArea As Range, rBlanks As Range, rFormulas As Range, rConstants As Range, rUnion As Range
    Dim sheet As Worksheet

    Set sheet = ActiveSheet
    On Error Resume Next
    Set rBlanks = sheet.UsedRange.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If Not rBlanks Is Nothing Then
        For Each rArea In rBlanks.Areas
            Debug.Print "rBlanks Areas: "; rArea.Address
        Next
    End If

    On Error Resume Next
    Set rFormulas = sheet.UsedRange.SpecialCells(xlCellTypeFormulas)
    On Error GoTo 0

    If Not rFormulas Is Nothing Then
        For Each rArea In rFormulas.Areas
            Debug.Print "rFormulas Areas: "; rArea.Address
        Next
    End If

    On Error Resume Next
    Set rConstants = sheet.UsedRange.SpecialCells(xlCellTypeConstants)
    On Error GoTo 0

    If Not rConstants Is Nothing Then
        For Each rArea In rConstants.Areas
            Debug.Print "rConstants Areas: "; rArea.Address
        Next
    End If

    If Not rFormulas Is Nothing And Not rConstants Is Nothing Then
        Set rFormulas = Union(rConstants, rFormulas)
        For Each rArea In rFormulas.Areas
            Debug.Print "rUnion Areas: "; rArea.Address
        Next
    End If

End Sub
0
ответ дан TinMan 17 August 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: