2016-06-21 9 views
0

この時点で、次のようなことを行い、範囲に式を適用でき、右側のセル参照は動的に更新されます。VBA:Range.Formulaの右辺の位置に配列インデックスを使用

Range("A1:A10").Formula = "=J2+M2" 

これは私が求めていることではありません。 Range.Formulaの右側に配列インデックスを渡そうとしていますが、私が望む結果が得られません。手始めに、ここに私のコードと左側だけで正常に動作している(あなたが心xl.が原因これはMS Accessから開始されることにある):

' Get the new amount of columns since new ones have been added 
lastColumn = xl.Cells(1, xl.Columns.Count).End(xlToLeft).Column 

' Create and array of the header names to quickly locate column number 
cols = xl.Range(xl.Cells(1, 1), xl.Cells(1, lastColumn)).Value 

' Apply the formulas 
xl.Range(xl.Cells(2, xl.Match("FCode", cols, 0)), xl.Cells(lastRow, xl.Match("FCode", cols, 0))).Formula = 

これくらいは正しい範囲に適用されます。右側に"ASD""=J2+M2"と入力すると、正しい範囲が更新されます。問題は、数式の一部として右側にxl.Match(...)を使用する必要がある場合に発生します。例えば

"=ISBLANK(" & xl.Range(xl.Cells(2, xl.Match("NCode", cols, 0)), xl.Cells(2, xl.Match("NCode", cols, 0))) & ")" 

1004: Application-defined or object-defined error返します。これは、適用範囲内で=ISBLANK(K2),=ISBLANK(K3),etc.を返します。

=K2,=K3,etcのような単純な参照は、セル内の値と等しくなります。K2。たとえば、=14とし、これを全体範囲に適用します。 K3K4etcの値も返しません。これはそのために使用されている公式です:

"=" & xl.Range(xl.Cells(2, xl.Match("PCode", cols, 0)), xl.Cells(2, xl.Match("PCode", cols, 0))) 

私は間違っていますか?これは、レポート間の変更を参照する必要がある列が、ヘッダー名が変わらないためです。 1つのレポートでは列M、別のレポートでは列Zになります。これまではFor Loopsを使用していましたが、速度が遅く、回避したいと考えています。

+0

する必要がありますあなたのISBLANK()式をDebug.Print'と私はあなたがそれはあなたが期待するものではありませんがわかりますね。 –

+0

なぜ変数を使用して異なるマッチ結果でそれらを設定しないのですか?次に、変数を式に差し込むだけで、コードのトラブルシューティングがはるかに簡単になります。 – teylyn

答えて

6
"=ISBLANK(" & xl.Range(xl.Cells(2, xl.Match("NCode", cols, 0)), _ 
         xl.Cells(2, xl.Match("NCode", cols, 0))) & ")" 

はおそらく `

"=ISBLANK(" & xl.Cells(2, xl.Match("NCode", cols, 0)).Address(false, false) & ")" 
+2

あなたは壮大な男です。 – sockpuppet

+0

Timは「Magnificent Man」バッジに向かってさらに進歩しました! – Rodger

関連する問題