Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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 检查数组中是否存在值_Arrays_Vba - Fatal编程技术网

Arrays 检查数组中是否存在值

Arrays 检查数组中是否存在值,arrays,vba,Arrays,Vba,我修改了在中找到的VBA代码 请参阅下面的代码。用户将选择一个字段名,我希望代码找到该字段所列的列,并创建该列中所有项的数组,但我希望每个非空值在数组中仅显示一次。我不要任何复制品 例如,如果列具有值A、B、A、C、D,我希望代码以A、B、C、D的形式返回数组 我得到一个运行时错误13-这行代码的类型不匹配: If cell.Value <> "" And IsError(WorksheetFunction.Match(cell.Value, MyArray, 0)) Then 如

我修改了在中找到的VBA代码 请参阅下面的代码。用户将选择一个字段名,我希望代码找到该字段所列的列,并创建该列中所有项的数组,但我希望每个非空值在数组中仅显示一次。我不要任何复制品

例如,如果列具有值A、B、A、C、D,我希望代码以A、B、C、D的形式返回数组

我得到一个运行时错误13-这行代码的类型不匹配:

If cell.Value <> "" And IsError(WorksheetFunction.Match(cell.Value, MyArray, 0)) Then
如果cell.Value“”和iError(WorksheetFunction.Match(cell.Value,MyArray,0))匹配,则
我很困惑,因为似乎我所有的数据类型都是正确的。有人能帮忙吗

Sub ChangeBlock()

Dim MyArray() As String
Dim cell As Range
Dim ColNum As Integer
Dim i As Integer

If Not Intersect(ActiveCell, Range("Block1")) Is Nothing Then
    If ActiveCell.Value = "" Then Exit Sub

ColNum = WorksheetFunction.Match(ActiveCell.Value, Sheets("Budget Table").Range("A1:AG1"), 0)

    For Each cell In Sheets("Budget Table").Columns(ColNum)
        If cell.Value <> "" And IsError(WorksheetFunction.Match(cell.Value, MyArray, 0)) Then
            ReDim Preserve MyArray(i)
            MyArray(i) = cell.Value
            i = i + 1
        End If
    Next
End If

MsgBox (MyArray)

End Sub
子变更块()
Dim MyArray()作为字符串
暗淡单元格作为范围
Dim ColNum作为整数
作为整数的Dim i
如果不相交(ActiveCell,Range(“Block1”))则为空
如果ActiveCell.Value=“”,则退出Sub
ColNum=WorksheetFunction.Match(ActiveCell.Value,Sheets(“预算表”).Range(“A1:AG1”),0)
表格(“预算表”)中的每个单元格。列(ColNum)
如果cell.Value“”和IsError(WorksheetFunction.Match(cell.Value,MyArray,0))匹配,则
ReDim保留MyArray(i)
MyArray(i)=单元格值
i=i+1
如果结束
下一个
如果结束
MsgBox(MyArray)
端接头

要使用
iError
,请使用
Application.Match
而不是
WorksheetFunction.Match

虽然这两种方法相似,但它们处理错误的方式略有不同。前者返回一个错误变量,您可以使用
IsError
进行测试,而后者只
抛出一个只能通过错误处理机制捕获的错误


最后,如果您的数据很大,这不是检查重复数据的最佳方法;您应该考虑使用
字典

错误13类型不匹配是由以下原因造成的:

cell.Value”“

这里是类似于(1到1048576,1到1)的2D数组,无法将此数组与字符串进行比较,因此类型不匹配

编辑:


实际上,变量
cell
是一个列,因此要正确比较,必须说明要比较数组的哪个元素,例如,对于第一个元素:

cell.Value()(1,1)=“”

更正确的做法是将变量
单元格
重命名为例如
oneColumn
,因为变量
单元格
实际上包含对列的引用,例如:

Dim myColumns As Range
Set myColumns = Sheets("Budget Table").Columns(ColNum)

Dim oneColumn As Range

For Each oneColumn In myColumns
    ' ...
Next oneColumn
注意:这里每个
没有意义,因为
myColumns
只引用一列,而
myColumns.Columns.Count
返回
1
。因此,您所需要的实际上是
myColumns.Cells
,它返回列中的所有单元格

oneColumn
的值是2D数组,老实说,我不知道为什么它是2D而不仅仅是1D。当您检查例如
范围(“A1:C3”)
值时,您会看到它返回2D数组,这是可以理解的。但为什么一列中的一列也返回2D?对我来说似乎也很奇怪:)。一维数组的一个例子是
Dim oneDArray:oneDArray=array(“A”、“B”、“C”)
。据我所知,1D数组从未从
Range.Value
属性返回。关于VBA中数组维度的有趣文章


但这并不是必需的,因为每个
范围
都有一个属性
单元格
。因此这里应该使用
列(ColNum).Cells

完整的代码可能如下所示,但有点太复杂了。首先,数组中有很多空元素,因为使用了整个列,其次考虑了像“A.S.H”这样的字典。嗯

Dim MyArray() As String
Dim cell As Range
Dim ColNum As Integer
Dim i As Integer

ReDim MyArray(0 To 0)

With Sheets("Budget Table")

    If Intersect(ActiveCell, .Range("Block1")) Is Nothing Then _
        Exit Sub

    If ActiveCell.Value = "" Then _
        Exit Sub

    ColNum = Application.Match(ActiveCell.Value, .Range("A1:AG1"), 0)

    For Each cell In .Columns(ColNum).Cells
        If cell.Value = "" Then _
            GoTo continue

        If IsError(Application.Match(cell.Value, MyArray, 0)) Then
            If i > 0 Then
                ReDim Preserve MyArray(i)
            End If

            MyArray(i) = cell.Value
            i = i + 1

        End If
continue:
    Next cell

End With

我也试过了,我也犯了同样的错误。我可能不会经历超过200000个牢房。这算大吗?我将研究字典的使用。现在我正在考虑它,我还注意到在我的VBE对象浏览器中找不到Application.Match的引用。为了使用该方法,我是否应该添加对库的引用?很抱歉,我添加了一个调试。将MyArray打印在我获取错误的行的前面,并注意到在运行代码时会出现相同的错误,但它会突出显示MyArray变量。因此,我尝试将MyArray数据类型更改为variant,但仍然得到相同的错误。有人对为什么这种情况还会发生有任何指导吗?从我在互联网上读到的内容来看,将数据类型更改为variant应该可以解决这个问题@A.S.HNo您不需要添加任何参考资料<代码>应用程序.Match
(与许多其他应用程序方法一样)不会显示在浏览器中,但它们是可用的,您只需键入它们即可。是的,200000个单元是巨大的,足够大,可以用
字典
来证明函数的优化。目前设想的“业余”方法对于如此大的数据来说速度非常慢。谢谢,迪。但我有一个问题:为什么值是2D数组?在我看来,excel中的一列数据是一维数组的最佳示例。如果这实际上是一个二维数组,那么一维数组的例子是什么呢?它可以存在于excel电子表格中吗?对不起,如果这是个愚蠢的问题。或者您是说value对象返回一个2D数组,而cell对象返回一个1D数组?对不起,如果我不明白的话。我想当你说:“实际上是一列中的可变单元格以便正确比较”时,我会感到困惑,@deeI在那里有一个输入错误,
实际上“
中的可变单元格”应该是
实际上可变单元格“是”
。参见编辑后的答案,HTH。