我有点被这个任务困住了。我有一个宏,检索数据的两个范围从两个不同的工作簿处理,并把它们塞进两个变体。收集是成功的,因为我可以在本地窗口中调试和检查它们,一个是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
。我已经在SO中检查过了这就是我得到的
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,无法从工作表函数获取索引属性。我哪里做错了?我应该将输入过滤为data1吗?那样容易些?更快呢?
EDIT:我在具有相同数据的工作表中尝试了该方法(没有VBA),它仅适用于翻译的方法名称(=Index()在西班牙语中=Index() )。除此之外,它起作用了。但是,尝试将data1设置为范围和变体……但没有成功。此外,我检查了一个断点和data1是一个变体/变体(78),每个元素(data1(I))是一个变体(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
好吧,我有时间看一下。如果你的Index
函数没有正确的参数,那么它将抛出error 1004
。假设您的范围是单个单元格,那么当您在第2列中查找值时,它不会出现任何内容(即error 1004
)。但是第1列第1行将返回正确的结果。
所以在你的代码中确保变量i
没有被超越。这就是你的代码中的问题所在:
For i = 1 To UBound(data1)
应该For i = 1 To UBound(data1, 2)
所以它不会超过数组的列数
正如Remou指出的,第一个参数应该是一个范围。
但是,除了删除.value之外,您还需要稍微修改一下代码。
data1需要被模糊为Range,并使用Set关键字赋值,如下所示:
Dim data1 as Range
Set data1 = wbExterno.Sheets(1).Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow)