Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VBA:将唯一值捕获到数组中会使下标超出范围_Arrays_Vba_Excel - Fatal编程技术网

Arrays VBA:将唯一值捕获到数组中会使下标超出范围

Arrays VBA:将唯一值捕获到数组中会使下标超出范围,arrays,vba,excel,Arrays,Vba,Excel,我考虑使用我的工作表上的一列(本例中为C列)中的一个动态列表作为D列数据验证的源,同时需要唯一的值。我以前尝试过RemovedUpplicates,但该方法似乎不起作用,所以我选择使用数组。我发现Jean-Francois Corbett的帖子很有帮助,但由于我是数组新手,我认为我做错了什么 他的例子是一个二维数组,但我的列表是一维的。因此,我对他的方法进行了一些编辑,同时保留了基本完整的结构。下面的代码似乎工作得很好,直到子代码末尾附近出现“varUnique(nUnique)=varIn(i

我考虑使用我的工作表上的一列(本例中为C列)中的一个动态列表作为D列数据验证的源,同时需要唯一的值。我以前尝试过RemovedUpplicates,但该方法似乎不起作用,所以我选择使用数组。我发现Jean-Francois Corbett的帖子很有帮助,但由于我是数组新手,我认为我做错了什么

他的例子是一个二维数组,但我的列表是一维的。因此,我对他的方法进行了一些编辑,同时保留了基本完整的结构。下面的代码似乎工作得很好,直到子代码末尾附近出现“varUnique(nUnique)=varIn(i)”,此时它抛出错误9:下标超出范围

Sub FindUnique()
    Dim rngIn As Range
    Dim varIn As Variant
    Dim varUnique As Variant
    Dim iInCol As Long
    Dim iInRow As Long
    Dim iUnique As Long
    Dim nUnique As Long
    Dim isUnique As Boolean
    Dim i As Integer

Dim ResultingStatus As Range
Dim WhenAction As Range
Dim EvalForm As Range
Set ResultingStatus = Range("A15:Z15").Find("Resulting Status")
Set WhenAction = Range("A15:Z15").Find("When can this action")
Set EvalForm = Range("A15:Z15").Find("Evaluation Form")

    Set rngIn = Range(ResultingStatus.Offset(1, 0).Address, ResultingStatus.Offset(1000, 0).End(xlUp).Address)
    varIn = rngIn.Value

    ReDim varUnique(1 To UBound(varIn))

    nUnique = 0
    For i = LBound(varIn) To UBound(varIn)


            isUnique = True
            For iUnique = 1 To nUnique
                If varIn(i) = varUnique(iUnique) Then
                    isUnique = False
                    Exit For
                End If
            Next iUnique

            If isUnique = True Then
                nUnique = nUnique + 1
                varUnique(nUnique) = varIn(i)
            End If


    Next i

    '// varUnique now contains only the unique values.
    '// Trim off the empty elements:
    ReDim Preserve varUnique(1 To nUnique)


    Range("B28:D50").Value = varUnique
End Sub

我只改变了几件事,但当你将一个范围写入数组时,它会自动变成2D,所以
varIn
需要第二个维度。还调整了最终输出行以自动调整为
varUnique
的大小。字典的优点是它可以自动生成唯一的值,也就是说,它可以将重复项覆盖为不重复项

Sub FindUnique()

Dim rngIn As Range
Dim varIn As Variant
Dim varUnique As Variant
Dim iInCol As Long
Dim iInRow As Long
Dim iUnique As Long
Dim nUnique As Long
Dim isUnique As Boolean
Dim i As Integer
Dim ResultingStatus As Range
Dim WhenAction As Range
Dim EvalForm As Range

Set ResultingStatus = Range("A15:Z15").Find("Resulting Status")
Set WhenAction = Range("A15:Z15").Find("When can this action")
Set EvalForm = Range("A15:Z15").Find("Evaluation Form")
Set rngIn = Range(ResultingStatus.Offset(1, 0).Address, ResultingStatus.Offset(1000, 0).End(xlUp).Address)
varIn = rngIn.Value

ReDim varUnique(1 To UBound(varIn))

nUnique = 0
For i = LBound(varIn) To UBound(varIn)
    isUnique = True
    For iUnique = 1 To nUnique
        If varIn(i, 1) = varUnique(iUnique) Then
            isUnique = False
            Exit For
        End If
    Next iUnique
    If isUnique = True Then
        nUnique = nUnique + 1
        varUnique(nUnique) = varIn(i, 1)
    End If
Next i

'// varUnique now contains only the unique values.
'// Trim off the empty elements:
ReDim Preserve varUnique(1 To nUnique)

Range("B28").Resize(nUnique) = Application.Transpose(varUnique)

End Sub

出现错误时,
nUnique
i
的值是多少?为什么不使用Dictionary方法呢?当它出错时,两者都是1。我在其他地方看到过对字典的引用,但我基本上是不熟悉的,而且从我所读到的内容来看,我不认为它比数组有什么优势。设置完唯一值数组后,下一步将是设置range.value=varUnique,使用数组似乎比使用字典/集合更容易。