2017-11-08 20 views
0

Excel VBAでは、2つ以上の操作でテーブル(ListObjects)の列(ListColumns)を塗りつぶす方法が見つかりません。文字列のヘッダーを使用する代わりに、インデックス番号を使用してテーブルの列を作成します。したがって、たとえば、私が使用しているとき、この作品を知っている:Excel VBAの塗りつぶしテーブル(ListObject)の列他のテーブルの列と操作の結果

lo.ListColumns("Spread").DataBodyRange = "=[Current]-[Historic]" 

しかし、「スプレッド」は、カラム10、および「現在」は5列目と「歴史的」であると言うが、列7であるような何かをする方法はあります次のように列に値を設定しますか?私はこれがうまくいかないことを知っていますが、私はさまざまな方法を試して検索でそれを見つけることができないのと同様のものがあることを望んでいます。

lo.ListColumns(10).DataBodyRange = lo.ListColumns(9).DataBodyRange - _ 
            lo.ListColumns(10) 

ありがとうございました。

答えて

2
lo.ListColumns(10).DataBodyRange = "=[" & lo.ListColumns(5).Name & "]-[" & lo.ListColumns(7).Name & "]" 
+0

危険です。誰かが後で表の列を挿入または削除し、マクロが間違ったことをします。このようなVBAへのハードコード参照は最適ではありません。 – jeffreyweir

+0

私は全面的に同意するが、質問は非常に明確で、私はOPが彼/彼女が何をしているかを知っていたと信じることを選んだ。 – Excelosaurus

+0

ええ、私はあなたがopを彼らが求めたものに正確に与えたことを実感します。彼らが求めていることは、彼らの健康に有害かもしれないということだけです。このような場合、私は彼らに求めていることの落とし穴や、今後Googleがここにもたらす他の誰かに明示的に指摘したいと思います。将来、恥ずかしくてキャリア制限のミスを誰かに救うかもしれない。 – jeffreyweir

0

なぜ、列ヘッダーではなくINDEXを使用するのかについて具体的な理由はありますか?ハードコーディングされたインデックス番号を使用しても堅牢なコードは作成されません。つまり、後に(または他の誰かが)テーブルのレイアウトを変更した場合、コードを調べてハードコーディングされた参照を修正する必要があります。これは、ListObjectリファレンスが回避するように設計されたもの(VBAと数式の両方)です。

例のように、列ヘッダーを使用する方がはるかに優れています。誰かが列名を変更する可能性がある場合は、関連するListColumnsを指すようにNamed Rangeを設定し、コード内の名前付き範囲を参照します。あなたがしたいすべてが何らかの理由でインデックス番号を見つけることである場合

は、その後、ちょうどこのような何か:

Dim lo as ListObject 
Dim lc as ListColumn 

On Error Resume Next 
Set lc = lo.ListColumns("sName") 
On Error GoTo 0 

を...そしてあなたはそれが見つかったかどうかをテストすることができます

If Not lc Is Nothing Then Msgbox(lc.Index) 
関連する問題