Фильтр без дубликатов и добавить в список в столбце 1 - PullRequest
0 голосов
/ 24 июня 2019

Этот код работает, чтобы найти первое значение, мне нужно, чтобы он захватил первую ячейку, которая содержит «120», что означает 120, 7120, 31200, каждая из которых содержит дубликаты.Кроме того, ID CODE находится в столбце C, как мне добавить данные в столбце D во второй столбец списка?

Dim AGCN As Long
Dim AGCL As String
Dim AGNN As Long
Dim AGNL As String
Dim i As Long
Dim rng As Range
Dim rownumber As Long
Dim AGC As Range
Dim AGN As Range
Dim firstaddress As Long
Dim nextaddress As Long

'Identify column letter
AGCN = Rows("1:1").Find(what:="ID CODE", lookat:=xlWhole).Column
AGCL = Split(Cells(1, AGCN).Address, "$")(1)

AGNN = Rows("1:1").Find(what:="NAME", lookat:=xlWhole).Column
AGNL = Split(Cells(1, AGNN).Address, "$")(1)


With Sheet1.Range(AGCL & ":" & AGCL)
    Set c = .Find("*" & tbAC & "*", LookIn:=xlValues)
    If Not c Is Nothing Then
        firstaddress = c.Value
        Debug.Print firstaddress
            With Me.ListBox2
           .ColumnCount = 3
           .ColumnWidths = "50;150;70"
           .AddItem
           .List(i, 0) = Str(firstaddress)
           i = o + 1
           End With ' code works up till this part

    Do ' from here, 
        Set c = .FindNext(c)
        If c Is Nothing Then
            GoTo donefinding
        ElseIf firstaddress <> c.Value Then
            nextaddress = c.Value
            Debug.Print nextaddress
            With Me.ListBox2
                .ColumnCount = 3
                .ColumnWidths = "50;150;70"
                .AddItem
                .List(i, 0) = Str(nextaddress)
                Debug.Print nextaddress
                i = o + 1
            End With
        End If
    Loop While c.Address <> firstaddress ' till here, it loops through all the other possible values but does not input onto listbox and it crashes my excel

End If
donefinding: Exit Sub
End With

В настоящее время нет сообщений об ошибках, Excel просто зацикливается и вылетает.

1 Ответ

0 голосов
/ 24 июня 2019

Сбой .List(i, 0) = ... произойдет, если значение o + 1 будет больше, чем количество элементов списка, но это произойдет прямо в 1-м цикле.

В противном случае вы используете i = o + 1 в каждом цикле, поэтому значение i не меняется, поэтому вы продолжаете перезаписывать один и тот же элемент в списке. Таким образом, количество элементов списка увеличивается в каждом цикле, но вы можете видеть только последнее значение в 1-й позиции (я предполагаю, что значение o равно 0).

Другие предложения: Вы можете упростить инициацию .Find следующим образом:

AGCN = Rows("1:1").Find(what:="ID CODE", lookat:=xlWhole).Column
With Sheet1.Columns(AGCN)
     Set c = .Find(tbAC, LookIn:=xlValues, LookAt:=xlPart)   ' you can omit "*" by using xlPart
     ...

Вы можете адресовать 2-й, 3-й и т. Д. Столбцы в списке, считая его «массивом» на основе 0:

.List(i, 1) = "Something"    ' will put "Something" to column 2
.List(i, 2) = "Anything"    ' will put "Anything" to column 3

Вам не нужно повторять установку .ColumnCount и .ColumnWidths в каждом цикле.

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