Ошибка 1004 не удалось получить свойство индекса из WorksheetFunction - PullRequest
1 голос
/ 16 декабря 2011

Я вроде застрял с этой задачей.У меня есть макрос, который извлекает два диапазона данных для обработки из двух разных рабочих книг и помещает их в два варианта.Сбор успешен, так как я могу отлаживать и проверять их в локальном окне, одним из которых является 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

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

ОК, я успел посмотреть на это.Если ваша функция Index не имеет правильных параметров, она выдаст error 1004.Допустим, если ваш диапазон представляет собой одну ячейку, то при поиске значения в столбце 2 он ничего не даст (например, error 1004).Но столбец 1, строка 1, вернет правильный результат.

Поэтому в своем коде убедитесь, что переменная i не превышена.Вот что неправильно в вашем коде:

For i = 1 To UBound(data1)

Должно быть

For i = 1 To UBound(data1, 2)

Так что оно не будет превышать количество столбцов в вашем массиве.

0 голосов
/ 17 декабря 2011

Как заметил Рему, первый аргумент должен быть диапазоном.

Однако вам нужно будет немного изменить ваш код, не удаляя просто значение .value.

data1 должен быть тусклымв качестве диапазона и назначается с помощью ключевого слова Set следующим образом:

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