2011-12-16 101 views
1

我有點被這個任務困住了。我有一個宏,它可以從兩個不同的工作簿中檢索兩個數據範圍,並將它們填充到兩個Variant中。收集是成功的,因爲我可以在本地窗口調試和檢查它們,一個是data1(變體1到79)和其他數據2(變體1到10)。這是我如何得到數據1錯誤1004無法從WorksheetFunction獲取索引屬性

With wbExterno.Sheets(1) 
data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value 
End With 

現在我想從數據1相關的元素複製到一個新的數組,命名爲Dim newData as Variant。我已經checkedin 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無法從worksheetfunction獲得索引屬性。我在這裏做錯了什麼?我應該過濾輸入到data1嗎?這樣更簡單嗎?更快?

編輯:我試過的方法,以相同的數據(沒有VBA),它僅與翻譯方法名(=指數()在西班牙語中是=工作指數之工作表() )。除此之外,它的工作。但是,嘗試將data1設置爲範圍和變體,並且...它不起作用。 另外,我具有斷點檢查和DATA1是一個變量/變體(78),並且每個元件(DATA1(I))是包含每一行

編輯2一個Variant(1至8):後在回答提出一個測試,我嘗試了更多的老派做法:

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

那麼你的變量filter1的尺寸爲? – Jon49 2011-12-16 20:17:49

+0

我將filter1設置爲Variant()。我應該給它維嗎?像設置一個範圍一樣大但空白? – Alfabravo 2011-12-16 20:19:18

+0

當然,上面的索引的第一個參數應該是一個數組(範圍),但data1是您定義的值。請參閱http://msdn.microsoft.com/en-us/library/ff197581.aspx – Fionnuala 2011-12-16 20:37:42

回答

1

OK,我有時間看看吧。如果你的Index函數沒有正確的參數,那麼它會拋出error 1004。假設您的範圍是單個單元格,那麼當您在第2列中查找值時,它將不會提供任何內容(即,error 1004)。但列1行1將返回正確的結果。

因此,在您的代碼中確保變量i沒有被超出。因此,這是什麼錯誤代碼:

For i = 1 To UBound(data1) 

應該

For i = 1 To UBound(data1, 2) 

所以它不會超出你的數組中的列數。

0

正如Remou指出,第一個參數應該是一個範圍。

但是,您需要稍微修改您的代碼,而不僅僅是刪除.value。

DATA1將需要dim'd的範圍和分配與設置關鍵字,像這樣:

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