在 msgbox 中显示唯一值

Display in msgbox unique values

我希望你不介意我问是否有更简单的方法来实现我想要实现的目标。虽然我的代码 'works',但感觉效率很低,我想了解一种更快的方法:

我的工作表的 A 列中有一个帐户客户编号列表;在 Q 列中,我使用 UNIQUE 公式来确定我的唯一值。唯一的客户号码不能超过 5 个(但可以低至 1 个)所以我写了以下内容:

Option Explicit
Sub list()

Dim value1 As Long, value2 As Long, value3 As Long, value4 As Long, value5 As Long
Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("Data")

 value1 = ws.Cells(5, 17).Value
 value2 = ws.Cells(6, 17).Value
 value3 = ws.Cells(7, 17).Value
 value4 = ws.Cells(8, 17).Value
 value5 = ws.Cells(9, 17).Value
 
MsgBox "Clients numbers used: " & vbCrLf & vbCrLf & value1 & vbCrLf & value2 & vbCrLf & value3 & vbCrLf & value4 & vbCrLf & value5, vbInformation
        

End Sub

我认为可以在 VBA 中构建唯一值数组,然后仅 'print' 实际出现的值?

直接从单元格区域构建消息。

Option Explicit
Sub list()

    Dim ws As Worksheet, s As String, i As Long
    Dim cel As Range
    Set ws = ThisWorkbook.Worksheets("Data")
    For Each cel In ws.Range("Q5:Q9")
        If Len(cel.value2) > 0 Then
            s = s & vbCrLf & cel.value2
        End If
    Next
     
    MsgBox "Clients numbers used: " & s, vbInformation
            
End Sub

当您有可变数量的参数时,ParamArray 是一种解决方法。如果引用是范围或数组,您只需要稍微不同地处理即可。

并且您可以完全在 VBA 内以各种方式确定唯一性。我演示了 ArrayList 的用法(因为如果需要,它也可以轻松排序)。如果排序不是问题,您可以使用字典或集合。

请注意,ArrayList 无法对混合的数字和字符串进行排序,因此如果这可能成为问题,您可能需要使用其他方法。

例如:

Option Explicit
Function list5(ParamArray X() As Variant) As String
    Dim AL As Object
    Dim V As Variant, W As Variant, Y As Variant
    
Set AL = CreateObject("System.Collections.ArrayList")
For Each V In X
    Select Case TypeName(V)
        Case "Range"
            For Each Y In V
                If Not AL.contains(Y.Value2) Then AL.Add (Y.Value2)
            Next Y
        Case "Variant()"
            For Each Y In V
                If Not AL.contains(Y) Then AL.Add (Y)
            Next Y
        Case Else
            If Not AL.contains(V) Then AL.Add (V)
    End Select
Next V

'cannot sort mixture of numbers and strings
On Error Resume Next
    AL.Sort
On Error GoTo 0

V = AL.toarray

MsgBox Join(V, vbLf)

End Function

函数的参数可以是范围、字符串或数字、数组常量,甚至是它们的组合。