Каждая строка в диапазоне пропускает каждое второе значение - PullRequest
0 голосов
/ 29 мая 2020

Я хочу l oop по всем строкам в активном листе и сравнить значения столбца.

Однако он пропускает каждое второе значение.

Рабочий лист выглядит так :

Worksheet

Код:

Sub test()

    Dim ws As Worksheet
    Dim r As Range
    Dim total As Integer
    Dim value As String

    Set ws = ActiveSheet
    total = 0

    For Each r In ws.UsedRange.rows

        value = r.Cells(r.Row, 3).value

        If value = "Test" Then

            'Do something...
            total = total + 1

        End If

       Debug.Print ("Row: " & r.Row & " - Value: " & value)

    Next r

End Sub

Консоль показывает это:

Row: 1 - Value: Col2
Row: 2 - Value: JohnDoe
Row: 3 - Value: JohnDoe
Row: 4 - Value: Test
Row: 5 - Value: Blabla
Row: 6 - Value: Blabla
Row: 7 - Value: 
Row: 8 - Value: 
Row: 9 - Value: 
Row: 10 - Value: 
Row: 11 - Value: 

Как мне исправить это, чтобы не пропускать каждое второе значение?

Причина, по которой я использую UsedRange вместо for i = 1 to x, заключается в том, что я не буду заранее указывать количество строк.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Решение, благодаря @ BigBen

Sub test_solution()

    'Variables
    Dim ws As Worksheet
    Dim r As Range
    Dim total As Integer
    Dim value As String
    Dim lastRow
    Dim i As Integer
    Set ws = ActiveSheet
    total = 0

    With ws
        lastRow = Range("C" & .rows.Count).End(xlUp).Row
    End With

    For i = 1 To lastRow

        value = Cells(i, 3).value

        If value = "Test" Then

            'Do something

            total = total + 1

        End If

       Debug.Print ("Row: " & i & " - Value: " & value)

    Next i

End Sub

Дает правильный вывод:

Row: 1 - Value: Col2
Row: 2 - Value: Test
Row: 3 - Value: JohnDoe
Row: 4 - Value: Test
Row: 5 - Value: JohnDoe
Row: 6 - Value: JohnDoe
Row: 7 - Value: Test
Row: 8 - Value: Blabla
Row: 9 - Value: Blabla
Row: 10 - Value: Test
Row: 11 - Value: Blabla
0 голосов
/ 29 мая 2020

Предложения:

  1. Избегайте использования UsedRange: см. этот вопрос почему.
  2. Избегайте зацикливания на Rows, если вам не нужно to ... также избегайте ссылки на r.Cells, поскольку это будет не ссылка абсолютная (т.е. относительно всего листа), а ссылка относительная на основе r.
With ws
    Dim lastRow as Long
    lastRow = .Cells(.Rows.Count, "C").End(xlUp).Row

    For i = 2 to lastRow
       If .Cells(i, "C").Value = "Test" Then
           ' do your stuff, though this loop is still inefficient
       End If
    Next
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...