【问题标题】:Display in msgbox unique values在 msgbox 中显示唯一值
【发布时间】:2021-07-09 21:04:24
【问题描述】:

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

我的工作表 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 中构建一个唯一值数组,然后只“打印”实际出现的值?

【问题讨论】:

    标签: excel vba unique


    【解决方案1】:

    当您有可变数量的参数时,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
    

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

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多