2011-12-16 201 views
1

私はちょっとこのタスクに固執しています。私は、2つの異なるワークブックから処理する2つのデータ範囲を取得し、それらを2つのVariantに入れるマクロを持っています。ローカルウィンドウで、データ1(バリアント1〜79)とその他のデータ2(バリアント1〜10)をデバッグして検査することができます。これは私が今、私は新しい配列、名前を付けDim newData as VariantにDATA1から、関連する要素をコピーしたいDATA1エラー1004 WorksheetFunctionからインデックスプロパティを取得することができません

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

を取得する方法です。私はこれについてSOすでにcheckedinをしましたし、これは、私はそれはworksheetfunctionからIndexプロパティを取得できませんエラー1004を発生させ

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." 

を得たものです。私はここで間違って何をしていますか?代わりに入力をdata1にフィルタリングする必要がありますか?そんなに簡単?もっと早く?

EDIT:私は、同じデータを持つワークシートでの方法(無VBA)を試みたし、それが唯一のスペイン語で翻訳されたメソッド名(=インデックス()で働いていたが、= Indice(ある) )。それ以外は、それは働いた。しかし、range1とvariantとしてdata1を設定しようとしましたが、うまくいきませんでした。 また、私は、ブレークポイントでチェックし、DATA1は、変異体/バリアント(78)と各要素(DATA1(I))は

EDIT 2各行を含有する(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 

をそして、それは実際に私は新しい配列に必要な行、フィールドごとに設定します。テストは答えで提案、私はもっと古い学校のアプローチを試してみました。私は質問に未回答のまま残します。おそらくもっと良い方法を見つけることができます。

ソリューション私が最後に使用したコードは、このいずれかです:Remouが指摘したように

 ' 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

+0

filter1をVariant()として設定しました。私はそれに次元を与える必要がありますか?範囲は空白だが空白に設定するのと同じように? – Alfabravo

+0

上記のindexの最初の引数は配列(範囲)でなければなりませんが、data1は定義からの値です。 http://msdn.microsoft.com/en-us/library/ff197581.aspxを参照してください。 – Fionnuala

答えて

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

グッド!私はしばらくのうちにこれをチェックしておきます:) – Alfabravo

+0

これは最初の行を取得し、列ごとに移動します。私がやりたいことは、いくつかの行を新しいVariant配列にコピーすることです。これは、2回目の編集でコードでのみ行うことができます。ありがとう – Alfabravo

+0

私が提示したコードの最後の部分は、説明のためだけのもので、コピーして使用することを目的としたものではありません。あなたがコピーするために意図されたコードは、 "should be"という単語に続くコードです。それは問題です、あなたは配列の列の代わりに行をループしています。これは、 'index'関数のために有効なデータを入力するので、コードを動作させるはずです。現在、無効なデータを入力しています。私はあなたを混乱させないように説明的なコードを削除します。 – Jon49

0

最初の引数は範囲でなければなりません。

ただし、.valueを削除するだけではなく、コードを少し修正する必要があります。

DATA1を範囲として無効にされますので、などのSetキーワードを割り当てる必要があります:

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

私は新しい変数***を作成しなければなりませんでした。バリアント***としてDim testを実行して、* i = 1に対してUBound(test)*を実行し、配列を実行してください。最後に、同じエラーが発生します:( – Alfabravo

関連する問題