Уникальные строки в Listview (Userform) VBA - PullRequest
0 голосов
/ 31 октября 2019

У меня есть таблица в Excel, и я хочу, чтобы записи отображались в пользовательской форме, используя элемент управления listview. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы отображались только 5 столбцов и только уникальные строки.

Код, который у меня есть, следующий:

Private Sub LoadListView()

Dim wksSource As Worksheet
Dim rngData, rngCell As Range
Dim LstItem As ListItem
Dim RowCount, ColCount, i, j As Long
Dim CountryCol, ShippingWay, SortCode, FirstException, LastException, Performance_OK_NOK, Container, 
CountSimilar, a As Integer

Set wksSource = Worksheets("Sheet3")
Set rngData = wksSource.Range("A1").CurrentRegion

Me.ListView1.ColumnHeaders.Add Text:="RowNr", Width:=70

For Each rngCell In rngData.Rows(1).Cells
If rngCell = "service_def_code" Or rngCell = "package_sort" Or rngCell = "ship_to_country_id" Or 
    rngCell = "first_tracking_exception_message" _
    Or rngCell = "last_tracking_exception_message" Then
       Me.ListView1.ColumnHeaders.Add Text:=rngCell.Value, Width:=80

End If

Next rngCell

RowCount = rngData.Rows.Count
ColCount = rngData.Columns.Count

For i = 1 To ColCount
If wksSource.Cells(1, i) = "ship_to_country_id" Then
   CountryCol = i
ElseIf wksSource.Cells(1, i) = "service_def_code" Then
   ShippingWay = i
ElseIf wksSource.Cells(1, i) = "package_sort" Then
   SortCode = i
ElseIf wksSource.Cells(1, i) = "first_tracking_exception_message" Then
   FirstException = i
ElseIf wksSource.Cells(1, i) = "last_tracking_exception_message" Then
   LastException = i
ElseIf wksSource.Cells(1, i) = "performance_result" Then
   Performance_OK_NOK = i

End If

Next i

j = 1

For i = 2 To RowCount
If wksSource.Cells(i, Performance_OK_NOK) = "NOK" then
  Set LstItem = Me.ListView1.ListItems.Add(Text:=j)
      LstItem.ListSubItems.Add Text:=rngData(i, CountryCol)
      LstItem.ListSubItems.Add Text:=rngData(i, ShippingWay)
      LstItem.ListSubItems.Add Text:=rngData(i, SortCode)
      LstItem.ListSubItems.Add Text:=rngData(i, FirstException)
      LstItem.ListSubItems.Add Text:=rngData(i, LastException)
      j = j + 1

end if

next i

end sub

Итак, что я хочуДля этого нужно отобразить только уникальные строки, а подэлементы представляют собой строку. Я проверил и искал решение, но не смог найти того, которое понимаю. Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 31 октября 2019

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

В следующем примере создается ключ из столбцов a, b. Адаптируйте его, чтобы создать ключ на основе пяти столбцов. ниже я получаю «b2» только один раз, хотя в таблице он встречается дважды (столбцы a, b)

enter image description here

Public Sub sAddToList()

  'REQUIRES MICROSOFT SCRIPTING RUNTIME LIB, (Add using Tools->References from the VB menu)

  Dim d As Dictionary
  Dim rowKey As String
  Dim i As Integer

  Set d = New Dictionary

  For i = 1 To 4
    rowKey = CStr(Sheet1.Cells(i, 1).Value) + CStr(Sheet1.Cells(i, 2).Value)
    If Not d.Exists(rowKey) Then
      d.Add rowKey, rowKey
      'add to your list view
    End If
  Next

End Sub
...