Selection.rows.count возвращает только 1 строку вместо 3 - PullRequest
0 голосов
/ 23 октября 2019

Я довольно новичок в VBA.

VBA выбирает 3 строки, но только 1? Я не смог найти похожий случай, который я мог понять.

Я не смог вставить весь код, так как stackoverflow не разрешает такую ​​запись.

Код внизу.


For i = 39 To lastRow

    ' Look for identical rows as input
    If Cells(i, 3) = Range("C29") And Cells(i, 4) = Range("D29") And Cells(i, 5) = Range("E29") And Cells(i, 6) = Range("F29") And Cells(i, 7) = Range("G29") And Range("H29") = Cells(i, 8) Then
        If foundRange Is Nothing Then

                'Defines the first row as foundrange, if nothing found earlier
                Set foundRange = Range(Cells(i, 3), Cells(i, 8))
        Else

            'Adds rows to foundRange, if one (or more) rows are found
            Set foundRange = Union(foundRange, Cells(i, 3), Cells(i, 4), Cells(i, 5), Cells(i, 6), Cells(i, 7), Cells(i, 8))
    End If
End If
Next i


If foundRange Is Nothing Then
    MsgBox "No rows found acording to input"
Else

'Count amount of rows to be removed
foundRange.Rows.Select
MsgBox selection.Rows.Count

1 Ответ

2 голосов
/ 23 октября 2019

Если вам не нужно, чтобы ячейки были выделены или сохранены в foundRange для дальнейшего использования, тогда вы можете просто использовать CountIfs, например:

With ActiveSheet.Range(ActiveSheet.Cells(39, 3), ActiveSheet.Cells(lastRow, 8))
    MsgBox WorksheetFunction.CountIfs(.Columns(1), Range("C29").Value, _
        .Columns(2), Range("D29").Value, _
        .Columns(3), Range("E29").Value, _
        .Columns(4), Range("F29").Value, _
        .Columns(5), Range("G29").Value, _
        .Columns(6), Range("H29").Value)
End With

Если вы do необходимо хранить ячейки в диапазоне, тогда вам может понадобиться просмотреть Areas из Range:

'Most of your code here...

If foundRange Is Nothing Then
    MsgBox "No rows found acording to input"
Else
    'Count amount of rows to be removed
    foundRange.Rows.Select 'Is this line necessary?

    Dim RangeArea As Range, TotalRows AS Long: TotalRows = 0

'N.B. If your Areas can be in different Columns of the same Row:
'     use foundRange.EntireRow.Areas to prevent double-counting!
    For Each RangeArea In foundRange.Areas
         TotalRows = TotalRows + RangeArea.Rows.Count
    Next RangeArea

    MsgBox TotalRows
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...