我正在使用this问题中的函数,但是,它似乎不适用于我的情况。
基本上,此脚本将通过一列选择不同的值并使用它们填充数组arr
。第一个If
正在检查列是否已经结束,然后为了避免调用空数组我有第一个IfElse
,最后我想检查cell
字符串的非空数组。如果它不存在,我想添加它。
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Sub SelectDistinct()
Dim arr() As String
Dim i As Integer
Dim cells As Range
Set cells = Worksheets("types").Columns("A").Cells
i = 0
For Each cell In cells
If IsEmpty(cell) Then
Exit For
ElseIf i = 0 Then
ReDim Preserve arr(i)
arr(UBound(arr)) = cell
i = i + 1
ElseIf IsInArray(cell.Value, arr) = False Then
ReDim Preserve arr(i)
arr(UBound(arr)) = cell
i = i + 1
End If
Next cell
End Sub
由于某种原因,它会在调用IsInArray
函数时抛出“下标超出范围”错误。有人能告诉我哪里出错了吗?
答案 0 :(得分:4)
以下是使用Application.Match
函数而不是其他UDF对一维数组进行的操作。
我已使用Do...While
循环合并了一些If / ElseIf逻辑,然后使用Match
函数检查数组中是否存在单元格值。如果它不存在,则将其添加到阵列并继续到您范围内的下一个单元格。
Sub SelectDistinct()
Dim arr() As String
Dim i As Integer
Dim cells As Range
Dim cl As Range
Dim foundCl As Boolean
Set cells = Worksheets("Sheet6").Columns(1).cells
Set cl = cells.cells(1)
Do
If IsError(Application.Match(cl.Value, arr, False)) Then
ReDim Preserve arr(i)
arr(i) = cl
i = i + 1
Else:
'Comment out the next line to completely ignore duplicates'
MsgBox cl.Value & " already exists!"
End If
Set cl = cl.Offset(1, 0)
Loop While Not IsEmpty(cl.Value)
End Sub
答案 1 :(得分:1)
对IsInArray
函数调用问题的“下标超出范围”错误的简短回答是变量arr
变暗为Variant
。对于{{1}要在Filter
UDF IsInArray
中工作的函数必须变为arr
。
您可以尝试以下代码:1)设置过滤的String
数组,以及2)避免在循环中放置String
(这是一个代价高昂的函数):
Redim Preserve
答案 2 :(得分:0)
这是一个简单但又脏的黑客:
Function InStringArray(str As String, a As Variant) As Boolean
Dim flattened_a As String
flattened_a = ""
For Each s In a
flattened_a = flattened_a & "-" & s
Next
If InStr(flattened_a, str) > 0 Then
InStringArray = True
Else
InStringArray = False
End If
End Function