【发布时间】:2011-12-16 18:14:23
【问题描述】:
我有点坚持这个任务。我有一个宏,它可以从两个不同的工作簿中检索要处理的两个数据范围,并将它们填充到两个 Variant 中。收集是成功的,因为我可以在本地窗口中调试和检查它们,一个是 data1(变量 1 到 79)和其他 data2(变量 1 到 10)。这就是我获取数据的方式1
With wbExterno.Sheets(1)
data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With
现在我想将相关元素从 data1 复制到一个新数组中,将其命名为 Dim newData as Variant。我已经 checked in 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 中吗?那样容易吗?更快?
编辑:我已经在具有相同数据(无 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
【问题讨论】:
-
那么你的变量 filter1 的尺寸是多少?
-
我将 filter1 设置为 Variant()。我应该给它尺寸吗?就像设置一个同样大但空白的范围?
-
当然,上面 index 的第一个参数应该是一个数组(范围),但 data1 是您定义的值。见msdn.microsoft.com/en-us/library/ff197581.aspx
-
如果我将 data1 设置为 .Range(tmpStr + ":" & ...),没有该值,它仍然会引发同样的错误。
-
设置断点并检查传递给索引函数的内容,然后在工作表中对其进行测试以查看问题所在。
标签: arrays vba worksheet-function variant