我有点坚持这个任务。我有一个宏,它从两个不同的工作簿中检索两个数据范围并将它们填充到两个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
答案 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)