错误1004无法从WorksheetFunction获取索引属性

时间:2011-12-16 18:14:24

标签: arrays vba worksheet-function variant

我有点坚持这个任务。我有一个宏,它从两个不同的工作簿中检索两个数据范围并将它们填充到两个Variant中。收集成功,因为我可以在Local窗口中调试和检查它们,一个是data1(变量1到79)和其他data2(变量1到10)。这就是我获取data1的方法

 With wbExterno.Sheets(1)
data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With

现在我想将data1中的相关元素复制到一个新数组,并将其命名为Dim newData as Variant。我已经checked in了解这一点,这就是我得到的

Dim filterCount As Integer
    counter = 0
    filterCount = 1    
' Para cada elemento en el array...
        For i = 1 To UBound(data1)

            'Comparar el campo fecha...
            tmpTest = data1(i, 1)

            ' ...con la fecha del ejercicio
            If (comparacionActual.FechaEjercicio = tmpTest) Then
                'MsgBox "iguales!"

                'se crea un array filtrado con los elementos pertinentes
                filter1(filterCount) = Application.WorksheetFunction.Index(data1, 0, i)

                PlusOne filterCount 'this is a custom function that increments in 1
            End If
        Next

        ' se informa el resultado del filtrado
        MsgBox "Copied: " & filterCount & " rows."

它引发错误1004无法从工作表函数获取Index属性。我在这做错了什么?我应该将输入过滤到data1吗?那样容易吗?快?

编辑 :我在工作表中尝试了使用相同数据(无VBA)的方法,并且只使用了已翻译的方法名称( =西班牙语的Index()= Indice())。除此之外,它起作用了。但是,尝试将data1设置为范围和变量......它不起作用。 另外,我检查了断点,data1是Variant / Variant(78),每个元素(data1(i))是包含每一行的Variant(1到8)

编辑2 :在答案中建议进行测试后,我尝试了更老式的方法:

With wbInterno.Sheets(1)
    data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
    filter1 = wbMe.Worksheets.Add.Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With

'... some other stuff

' Field by field
For j = LBound(data1, 2) To UBound(data1, 2)
    'MsgBox "check" & data1(i, j)
    filter1(filterCount, j) = data1(i, j)
Next

它实际上是按字段设置的,我需要在新数组中使用的行。我会留下没有答案的问题;也许我们可以找到更好的方法。

解决方案 我最终使用的代码就是这个:

     ' Define array with a range. Initialize destination array with the same size.
     data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
     filter1 = wbMe.Sheets("tmp").Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value

......还有一些与此无关的代码,然后

     Dim tmpTest As Variant
        Dim filterCount As Integer
        filterCount = 1
        ' integer used for presentation only 
        conteoRegistros = 0        
' for each element in array...
        For i = 1 To UBound(data1)
            'Compare a certain field...
            tmpTest = data1(i, 1)
            ' ...with some other variable. If so...
            If (comparacionActual.FechaEjercicio = tmpTest) Then
                '...copy column by column into new
                For j = LBound(data1, 2) To UBound(data1, 2)
                    'MsgBox "check" & data1(i, j)
                    filter1(filterCount, j) = data1(i, j)
                Next

                PlusOne filterCount
                PlusOne conteoRegistros
            End If
        Next

2 个答案:

答案 0 :(得分:1)

好的,我有时间看看它。如果您的Index函数没有正确的参数,那么它将抛出error 1004。假设您的范围是单个单元格,那么当您在第2列中查找值时,它将不会出现任何内容(即error 1004)。但是第1列第1行将返回正确的结果。

因此,在您的代码中,请确保未超出变量i。所以这就是你的代码中的错误:

For i = 1 To UBound(data1)

应该是

For i = 1 To UBound(data1, 2)

因此它不会超过数组中的列数。

答案 1 :(得分:0)

正如Remou指出的那样,第一个参数应该是一个范围。

但是,除了删除.value之外,您还需要稍微修改一下代码。

data1需要作为范围变暗,并使用Set关键字分配,如下所示:

Dim data1 as Range
Set data1 = wbExterno.Sheets(1).Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow)