在 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
函数的参数可以是范围、字符串或数字、数组常量,甚至是它们的组合。
我希望你不介意我问是否有更简单的方法来实现我想要实现的目标。虽然我的代码 '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
函数的参数可以是范围、字符串或数字、数组常量,甚至是它们的组合。