我正在使用这个问题的函数,但是,它似乎不适用于我的情况。

基本上,这个脚本通过一个列选择不同的值并用它们填充数组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函数时抛出“下标超出范围”错误。 有人能让我知道我哪里出错吗?

===============>>#1 票数: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

===============>>#2 票数:1

简短的回答对的呼唤你的“下标超出范围”错误IsInArray功能”的问题是变量arr变暗为Variant 。对于Filter功能在工作IsInArray UDF arr必须调节为String

您可以尝试以下代码:1)设置过滤的String数组,以及2)避免在循环中放置Redim Preserve (这是一个代价高昂的函数):

Sub FilteredValuesInArray()
'http://stackoverflow.com/questions/16027095/checking-if-value-present-in-array
Dim rng As Range
Dim arrOriginal() As Variant, arrFilteredValues() As String
Dim arrTemp() As String
Dim strPrintMsg As String    'For debugging
Dim i As Long, lCounter As Long

Set rng = Cells(1, 1).CurrentRegion    'You can adjust this how you want
arrOriginal = rng

'Convert variant array to string array
ReDim arrTemp(LBound(arrOriginal) - 1 To UBound(arrOriginal) - 1)
For i = LBound(arrOriginal) To UBound(arrOriginal)
    arrTemp(i - 1) = CStr(arrOriginal(i, 1))
Next i

'Setup filtered values array
ReDim arrFilteredValues(LBound(arrTemp) To UBound(arrTemp))

On Error Resume Next
Do
    arrFilteredValues(lCounter) = arrTemp(0)
    'Save non matching values to temporary array
    arrTemp = Filter(arrTemp, arrTemp(0), False)
    'If error all unique values found; exit loop
    If Err.Number <> 0 Then Exit Do
    lCounter = lCounter + 1
Loop Until lCounter >= UBound(arrFilteredValues)
On Error GoTo 0
'Resize array to proper bounds
ReDim Preserve arrFilteredValues(LBound(arrFilteredValues) To lCounter - 1)

'====DEBUG CODE
For i = LBound(arrFilteredValues) To UBound(arrFilteredValues)
    strPrintMsg = strPrintMsg & arrFilteredValues(i) & vbCrLf
Next i
Debug.Print vbTab & "Filtered values are:" & vbCrLf & strPrintMsg
'====END DEBUG CODE
End Sub

===============>>#3 票数: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

  ask by sashkello translate from so

未解决问题?本站智能推荐:

7回复

使用Excel VBA检查数组中是否存在值

我在下面有一些代码,应该检查一个值是否在数组中。 如果单元格A1包含单词Examples由于某种原因,当它只应该找到它存在于vars1数组中时, vars1都会将IsInArray检测为两个数组都存在 我需要更改什么才能使我的IsInArray函数完全匹配?
1回复

无法检查数组中是否存在值

尝试检查数组中是否存在值的时候, If Not IsError(Application.Match(arrString, RegM, 0)) Then...但是由于某种原因,它不起作用。 我也尝试了以下方法,但没有成功Application.WorksheetFunction.CountIf(
6回复

检查集合或数组中是否存在值,如果不存在,则添加[复制]

这个问题在这里已有答案: VBA有词典结构吗? 9个答案 我想将一个项目列表添加到集合中,避免添加重复项。 这是我在A栏的清单 我只想补充一下 这就是我想出来的,它有效,但它并不漂亮。 是否有一种不那么复杂的方法呢? 最喜欢的东西
1回复

VBA代码要检查单元格中是否存在数组中的值?

我需要循环访问包含CSV格式的一个或多个区域ISO代码的单元格范围,例如esES,frFR,itIT等。 如果这些值中的任何一个包含在单元格中,我将其选中并将其粘贴到另一个工作簿中。 我已经涵盖了后一部分,但是我不知道如何使前一部分起作用。 这是我目前正在使用的代码: 我对VB
1回复

检查值是否存在于二维选项卡(数组,vb)中

我用值创建tab(x,y): 进入第二个循环,我想检查当前项目( currentCT )是否进入CostCatTab.CostCategory 。 如果是,那么我想为CostCategory显示适当的m值 。
2回复

检查列中是否存在多个值之一

我在Excel 2013中有一个表格,该表格具有成千上万的食品记录(牛肉冻,牛肉冷藏,牛-,牛肋骨,鸡柳,鸡全,鱼皮,鱼全,酸奶,生菜进口,生菜冷冻,番茄新鲜,西红柿,水,牛奶等)。请注意,该值可能包含食品名称以外的其他内容。 我在A列旁边创建了B列。我希望B列在A列中保存食品的类别。例如
6回复

检查值是否存在于VBA的列中

我有一列超过500行的数字。 我需要使用VBA来检查变量X是否与列中的任何值匹配。 有人可以帮帮我吗?
1回复

检查F列中的值并检查G列中是否存在值

我正在使日常流程自动化。 我在F列中有ID,在G列中有ID2。如果F列中的ID相同,如何编写VBA来填充空白? IE ID 123的ID始终为1。在某些情况下,要使用的ID不是上面的ID。 测试数据: 我已经利用了一些现有的stackoverflow代码,并尝试使其适应我的需求
1回复

检查单元格vba中是否存在名称表中的值

我有一个代码概念问题。 我只是编写了一些代码,将其查找到一列(具有500多个单元格)中,并且如果某个单元格的值不存在(作为工作表名称)(在同一wb中),则使用该单元格中的值名称创建工作表。 这是我的代码: 此代码有效。 SheetExist是一个函数,如果存在工作表,则为t
1回复

Excel检查所有工作表中是否存在相同的值[重复]

这个问题已经在这里有了答案: Excel-在多个工作表/同一列中使用COUNTIF / COUNTIFS 3个答案 我有一个具有82个工作表的excel文件,所有工作表在A列中具有相同的标题,但在B列上具有不同的状态,请将其视为A列上的任务名称及其在B列上的状态。