在消息框中显示唯一值



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

我在工作表的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中建立一个唯一值的数组,然后只"打印"实际出现的值是可能的吗?

当你有可变数量的参数时,ParamArray是一种处理方法。如果引用是Range或数组,你只需要处理一点不同。

您可以完全在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

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

直接从单元格范围构建消息。

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

最新更新