VBA Сравнивает строки, подсчитывает, совпадают ли

#excel #vba

Вопрос:

Я очень новичок в программировании, надеюсь, вы, ребята, сможете мне помочь. В столбце A у меня есть несколько строк, и я хотел бы подсчитать все те же строки в столбце L. И он должен перейти к следующей строке, если в столбце G нет ни слова о том, как он должен выглядеть:

       A           G    L
zu=host,out=fr    x     1
zu=host,out=fr    x     2
zu=host,out=de    x     1
zu=host,out=de    x     2
zu=host,out=en    x     1
zu=host,out=sw    x     1
zu=host,out=sw    x     2
zu=host,out=nw 
zu=host,out=tw    x     1 
 

Это моя попытка, которая, к сожалению, не работает:

 Dim i As Integer
Dim ws As Worksheet
Dim counter As Integer
Set ws = ActiveSheet
counter = 1

For i = 1 To 5000

        If IsEmpty(ws.Range("A" amp; i)) Then
            Exit For
        End If
            
            If ws.Range("A" amp; i).Value = ws.Range("A" amp; i   1).Value Then
                    ws.Range("L" amp; i).Value = counter
                    counter = counter   1
                        Exit For
             
            Else: ws.Range("L" amp; i).Value = 1
                  counter = 1
                        Exit For
            End If
           
    Next i
    MsgBox ("Finished ")
 

Комментарии:

1. Добро пожаловать в правление. Что не работает с кодом? Было бы проще использовать формулу рабочего листа.

2. Этого можно достичь простой формулой… Посадили =COUNTIF($A$1:A1,A1) в камеру L1 . Я предполагаю, что ваши данные начинаются с ячейки A1

3. @DarrenBartrup-Кук ставит 1 в L1 и больше ничего не делает

4. @Siddharthout Я пытаюсь изучить VBA, поэтому я хотел бы решить эту проблему с помощью кода 🙂

5. хорошо. также опубликовал ответ с решением VBA

Ответ №1:

Нет необходимости в VBA. Этого можно достичь простой формулой. Поместите =COUNTIF($A$1:A1,A1) в ячейку L1 и перетащите ее вниз. Я предполагаю, что ваши данные начинаются с ячейки A1 .

Если вы все еще хотите VBA, сделайте это:

 Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim LRow As Long
    
    '~~> Set this to the relevant sheet
    Set ws = Sheet1
    
    With ws
        '~~> Find last row in col A
        LRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
        
        '~~> Put the formula in the Col L in 1 go!
        .Range("L1:L" amp; LRow).Formula = "=COUNTIF($A$1:A1,A1)"
        '~~> Convert formula to values
        .Range("L1:L" amp; LRow).Value = .Range("L1:L" amp; LRow).Value
    End With
End Sub
 

Скриншот

введите описание изображения здесь

Комментарии:

1. Это отлично работает, но я хочу отредактировать функциональность, чтобы пропустить строки, в которых столбец G пуст. Как бы я сделал это с решением формулы?

2. Изменить .Range("L1:L" amp; LRow).Formula = "=COUNTIF($A$1:A1,A1)" на .Range("L1:L" amp; LRow).Formula = "=IF(G1="""","""",COUNTIF($A$1:A1,A1))"

3. И если вам нужна только формула, а не VBA, то используйте =IF(G1="","",COUNTIF($A$1:A1,A1)) вместо =COUNTIF($A$1:A1,A1)

Ответ №2:

Наличие пустых строк означает, что это не так просто, как сравнение следующих или предыдущих строк.

 Sub CountUp()

    Dim ws As Worksheet
    Dim LastRow As Long, i As Long, counter As Long
    Dim sLastA As String
    Set ws = ActiveSheet

    LastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
    counter = 1
    For i = 1 To LastRow
        If ws.Cells(i, "G") > 0 Then
            If ws.Cells(i, "A") = sLastA Then
                counter = counter   1
            Else
                counter = 1
            End If
            ws.Cells(i, "L") = counter
            sLastA = ws.Cells(i, "A")
        End If
    Next i
    MsgBox ("Finished ")

End Sub
 

Ответ №3:

Вот несколько советов, как заставить исходный код работать:

 Option Explicit

Sub Count()
    Dim i As Long
    Dim ws As Worksheet
    Dim counter As Integer
    Set ws = ActiveSheet
    counter = 1
    
    ' Start at row 2
    
    For i = 2 To 10
    Debug.Print ("i=" amp; i)
    
    ' This will exit completely if it finds a blank in column G

        If IsEmpty(ws.Range("G" amp; i)) Then
            Exit For
        End If
            
         'Compare the current row to the previous row
         
         If ws.Range("A" amp; i).Value = ws.Range("A" amp; i - 1).Value Then
         Debug.Print ("i1=" amp; i)
                
                 counter = counter   1
                     
         ' Don''t need to compare to previous value in column L - if current row doesn't match previous row, this just resets counter to 1.
         
         Else
         Debug.Print ("i2=" amp; i)
               counter = 1
                     
         End If
        
        ' Always write counter to column L
        
         ws.Range("L" amp; i).Value = counter
         
    Next i
    MsgBox ("Finished ")
    
End Sub
 

введите описание изображения здесь

Комментарии:

1. Это, похоже, не работает для меня, даже если я вставил все это и добавил «End Sub», он не помещает никаких чисел в столбец L

2. Посмотрите, предоставляют ли инструкции debug.print какую — либо информацию-я оставил их намеренно: -) Вам нужно открыть немедленное окно Ctrl-G, чтобы увидеть вывод из них.

3. Где бы я их нашел? 😡