首页 > 解决方案 > 使用vba获取excel列中的所有唯一值

问题描述

我正在尝试过滤我的数据以将每个组的数组中的非重复值写入它们所属的白色。我遇到了错误 ByRef 参数类型不匹配。这是我的代码:

Sub Start_Time2()

    Dim UGs(1 To 3) As Long
    
    Dim r1 As Range
    Set r1 = Worksheets("s1").Range("F:F")

    UGs(1) = 480
    UGs(2) = 490
    UGs(3) = 455
    
    Size = 1
    
    For Each ug In UGs
        For Each row In r1
            Dim sng() As String
            If IsInArray(ug, sng) = True Then
                ReDim Preserve sng(Size)
                sng(Size) = row
                Size = Size + 1
            End If
        Next row
    Next ug
    
End Sub

我正在使用我在网上找到的自定义函数 IsInArray 来检查该值是否已经在我的数组中,但似乎我的 ug 变量不起作用。

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False

End Function

这是我的测试数据: 在此处输入图像描述

标签: excelvba

解决方案


至于 ByRef 参数类型不匹配错误 - 它发生是因为ug具有Variant类型(未声明的变量默认具有 Variant 类型)并且stringToBeFound参数具有String类型。要消除此错误,请指定,例如:

Public Function IsInArray(stringToBeFound As Variant, arr As Variant) As Boolean

使用Option Explicit模块第一行的指令自动检查变量声明。

此外,要处理 range F:F,即 1048576 个单元格似乎是多余的,应该指定它。

当然,像@Kin Siang 所写的那样,使用Dictionary 对象或Collection选择唯一值会更好。


推荐阅读