Сравните значение ячеек столбца в VBA - PullRequest
0 голосов
/ 01 января 2019

У меня есть данные в столбце следующим образом:

8856
8867
8876
8856
8898

Моя цель - сравнить каждыйячейка столбца и, если значения совпадают, выполнить оператор if.

Private Sub CommandButton2_Click()

Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim C1row As Long
Dim C2row As Long
Dim C2TotalRows As Long
Dim CustID As String

Set sht1 = Worksheets("Report")

sht1.Activate
C2TotalRows = Application.CountA(Range("A:A"))
C1row = 2

Do While sht1.Cells(C1row, 3).Value <> ""

    CustID = sht1.Cells(C1row, 3).Value

    For C2row = 2 To C2TotalRows

        If CustID = Cells(C2row, 3).Value Then
            MsgBox CustID
            Exit For
        End If

    Next
    C1row = C1row + 1

Loop
End Sub

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Похоже, вы хотели бы знать, как часто в данных встречается CustID (например, 8856) и с каким номером строки.Для этого я создал простой класс cInfo, а затем собрал информацию в словарь .В конце я просто распечатал информацию, но вы могли бы добавить код, который вы хотели бы запустить

Вот класс cInfo

Option Explicit

Public rowNr As String
Public ocur As Long

И это код для сбора информации

Sub UniqueValues()
Dim dict As Scripting.Dictionary
Dim rg As Range, sngCell As Range
Dim i As Long
Dim lRow As Long
Dim cellInfo As cInfo

    lRow = Range("A1").End(xlDown).Row      'Assumption now free rows and at least on entry in row 2
    Set rg = Range("A2:A" & lRow)
    Set dict = New Dictionary

    For Each sngCell In rg
        If dict.Exists(sngCell.Value) Then
            dict.Item(sngCell.Value).ocur = dict.Item(sngCell.Value).ocur + 1
            dict.Item(sngCell.Value).rowNr = dict.Item(sngCell.Value).rowNr & ";" & CStr(sngCell.Row)
        Else
            Set cellInfo = New cInfo
            cellInfo.rowNr = CStr(sngCell.Row)
            cellInfo.ocur = 1
            dict.Add sngCell.Value, cellInfo
        End If
    Next

    ' Do sth here. I will print some info
    For i = 0 To dict.Count - 1
        Debug.Print "CustID:", dict.Keys(i), dict.Items(i).ocur, "occurence(s) in rows", dict.Items(i).rowNr
    Next

End Sub

Это хорошо работало с предоставленными вами примерами данных

enter image description here

Выход

enter image description here

0 голосов
/ 02 января 2019

Попробуйте изменить ваш код:

Private Sub CommandButton2_Click()
  Dim sht1 As Worksheet
  Dim C1row As Long
  Dim CustID As String
  Dim R As Range

  Set sht1 = Worksheets("Report")
  sht1.Activate
  C1row = 2

  Do While sht1.Cells(C1row, 3).Value <> ""
    CustID = sht1.Cells(C1row, 3).Value
    Set R = sht1.Range("C:C").Find(CustID, sht1.Cells(C1row, 3))
    If R.Row > C1row Then
      MsgBox CustID
    End If
    C1row = C1row + 1
  Loop
End Sub

Удачи и спасибо.

Ссылка: Метод Range.Find (Excel)

0 голосов
/ 01 января 2019

Просто предположение, я вижу, что C2TotalRows=C2TotalRows = Application.CountA(Range("A:A")), что равно 1, из-за диапазона "A: A".Итак, For C2row = 2 To C2TotalRows этот цикл никогда не запустится.Попробуйте указать другой диапазон ячеек.

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