Я вроде застрял с этой задачей.У меня есть макрос, который извлекает два диапазона данных для обработки из двух разных рабочих книг и помещает их в два варианта.Сбор успешен, так как я могу отлаживать и проверять их в локальном окне, одним из которых является data1 (вариант с 1 по 79) и другие данные2 (вариант с 1 по 10).Вот как я получаю данные data1
With wbExterno.Sheets(1)
data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With
Теперь я хочу скопировать соответствующие элементы из data1 в новый массив, назовите его Dim newData as Variant
.Я уже проверил в ТАК об этом, и это то, что я получил
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), и он работал только с переведенным именем метода ( = Индекс () по-испански is = Indice () ).Кроме этого, это сработало.Но попытался установить data1 как диапазон и вариант и ... это не сработало.Кроме того, я проверил с точкой останова, и data1 - это Variant / Variant (78), а каждый элемент (data1 (i)) - это Variant (1-8), содержащий каждую строку
EDIT2 : после теста, предложенного в ответах, я попробовал более старый подход:
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