从 Excel 工作表到列表框显示与其他列的唯一值

问题描述 投票:0回答:1

我这里有数据,我想获取 C 列 = 项目 ID 的唯一值。

Date      || Project ID || Implementation Area  || Start Time   || End Time     || Status
8/28/2023 || 1145544    || Arizona              || 8:00:03 AM   || 9:15:17 AM   || For Approval 1
8/28/2023 || 1157788    || Arizona              || 9:15:20 AM   || 12:00:19 PM  || For Approval 1
8/28/2023 ||LUNCH BREAK ||                      || 12:00:18 PM  || 1:00:00 PM   || LUNCH BREAK
8/29/2023 || 1145544    || Arizona              || 1:00:01 PM   || 3:00:00 PM   || For Approval 2
8/29/2023 || 1145544    || Arizona              || 3:30:07 PM   || 3:40:40 PM   || COMPLETED
8/30/2023 || 1157788    || Arizona              || 3:41:00 PM   || 3:50:00 PM   || For Approval 2
9/1/2023  || 1157788    || Arizona              || 4:00:00 PM   || 4:30:45 PM   || COMPLETED
9/2/2023  || 1233343    || New York             || 9:05:17 AM   || 11:30:20 AM  || For Approval 1
9/2/2023  ||LUNCH BREAK ||                      || 12:00:00 AM  || 1:00:00 PM   || LUNCH BREAK
9/2/2023  || 1233343    || New York             || 1:45:01 PM   || 2:45:30 PM   || For Approval 2
9/2/2023  || 1233343    || New York             || 3:00:00 AM   || 3:22:00 AM   || COMPLETED
9/2/2023  || 1422457    || Louisana             || 3:50:00 PM   || 4:12:00 PM   || For Approval 1
9/3/2023  || 1422457    || Louisana             || 10:18:03 AM  || 11:15:17 AM  || For Approval 2
9/4/2023  || 1422457    || Louisana             || 4:15:20 PM   || 4:35:19 PM   || COMPLETED

现在我获取唯一值的代码是这样的:

Private Sub UserForm_Initialize() 
     
    Dim UniqueList()    As String 
    Dim x               As Long 
    Dim Rng1            As Range 
    Dim c               As Range 
    Dim Unique          As Boolean 
    Dim y               As Long 
     
    Set Rng1 = Sheets("Sheet1").Range("C:C") 
    y = 1 
     
    ReDim UniqueList(1 To Rng1.Rows.Count) 
     
    For Each c In Rng1 
        If Not c.Value = vbNullString Then 
            Unique = True 
            For x = 1 To y 
                If UniqueList(x) = c.Text Then 
                    Unique = False 
                End If 
            Next 
            If Unique Then 
                y = y + 1 
                Me.ListBox1.AddItem (c.Text) 
                UniqueList(y) = c.Text 
            End If 
        End If 
    Next 
     
End Sub

这会返回 C 列的唯一值。

Project ID
1145544
1157788
LUNCH BREAK
1233343
1422457

在我提供的数据中,请注意还有其他列。在列表框中,我想要实现的是这个(不再午餐):

Date         Project ID   Status
8/29/2023    1145544      COMPLETED
9/1/2023     1157788      COMPLETED
9/2/2023     1233343      COMPLETED
9/4/2023     1422457      COMPLETED

提前致谢。

excel vba forms listbox unique
1个回答
0
投票

请尝试

Private Sub UserForm_Initialize()
    Dim Dic As Object, i, sKey, arr, aList
    Set Dic = CreateObject("scripting.dictionary")
    With Sheets("Sheet1")
        arr = .Range(.[g2], .Cells(.Rows.Count, 2).End(xlUp))
        For i = 1 To UBound(arr)
            sKey = arr(i, 2)
            If Not UCase(sKey) = "LUNCH BREAK " Then
                If Dic.exists(sKey) Then
                    If arr(i, 1) >= Dic(sKey)(0) Then
                        Dic(sKey) = Array(arr(i, 1), arr(i, 6))
                    End If
                Else
                    Dic(sKey) = Array(arr(i, 1), arr(i, 6))
                End If
            End If
        Next
    End With
    ReDim aList(Dic.Count, 2)
    aList(0, 0) = "Date"
    aList(0, 1) = "Project ID"
    aList(0, 2) = "Status"
    i = 1
    For Each sKey In Dic.keys
        aList(i, 0) = Dic(sKey)(0)
        aList(i, 1) = sKey
        aList(i, 2) = Dic(sKey)(1)
        i = i + 1
    Next
    With Me.ListBox1
        .ColumnCount = 3
        .List = aList
    End With
End Sub

© www.soinside.com 2019 - 2024. All rights reserved.