法律事務所の仕事では、エクセルをデータベースとして使うことが多くあります。エクセルをデータベースとして使用する場合に便利な機能として、テーブル機能があるのですが、使っている人は少ないようです。
テーブル機能がどうして便利なのかについては、こちらの記事が参考になります。
そして、このテーブル機能は、VBAとの親和性が非常に高い機能でもあります。
この点に関しては、こちらの記事にが参考になります。
「VBAエキスパート公式テキスト」の「Excel VBAスタンダード」には、2019年に改訂された際に「テーブルの操作」に関する20ページ以上の記事が追加されました。つまり、VBAエキスパート試験の試験範囲に含まれたということです。このことは、このテーブルを操作できることが、VBAを習得するうえで重要なものになっていることを表しています。
「テーブルにすると何が良いのか」を説明するためには、「テーブルがないと何が問題なのか」を説明しなければなりません。その問題に実際に直面した人でなければ、理解してもらうのは極めて困難だと思いますが、一番重大な問題点を一言でいうならば、「変化に弱い」ということです。
「Excel VBAを実務で使い倒す技術」には、「『変化』は必ずやってきてVBAを劣化させる」とし、「予測できる変化に備えておく」ことや「そもそも変化に強い作り方をしておく」ことが重要だと述べられています。そういった観点で、「テーブル機能」を活用することには、大きな利点があります。
一度、テーブルを用いたVBAプログラミングを経験したならば、もう二度と元には戻れなくなるほどです。また、テーブルを用いる場合のVBAのコードは、それを用いないものとは大きく異なるため、VBAでデータベースを扱う場合には、最初から「テーブル機能」を用いるべきです。
ということで、VBAアセットでは、「表は必ずテーブルにする」というスタイルを採っています。
テーブルの特定
VBAアセットでは、テーブルを特定するのにテーブルの名前を使っています。法律事務所では、データベースを作ったら、それを更新して使い続ける場面がほとんどだと思います。次々にテーブルを自動的作成しなければならないことは、経験したことがありません。このため、テーブルに付けられた名前を使って特定するのが、最も簡単で確実な方法だと思います。
例えば、テーブル名が「事件」の場合、次のようにテーブルのデータ領域を特定できます。
Range("事件")
テーブルの位置(最左上セルの行列番号)は、次のようにして求めることができます。
i = Range("事件").Row
j = Range("事件").Column
テーブルの範囲(最終行列番号、最右下セルのテーブル行列番号)は、次のようにして求めることができます。(「テーブル行列番号」は、テーブルのデータ領域の行列番号です。)
テーブルを使わない場合に表の最終行を求めるのに苦労していたのが、嘘のようです。
r = Range("事件").Rows.Count
s = Range("事件").Columns.Count
テーブルの部位の特定
テーブルの部位を特定するのにも、テーブルの名前を使うことができます。
まずは、テーブル行列番号を使って特定することができます。特にテーブル行を0にして、見出しを特定する手法は使う場面が多いです。
Range("事件")(r,s) 'データ領域のr番目の行、s番目の列のセル
Range("事件")(0,s) '見出しのs番目の列のセル
次に構造化参照を使って、見出しを使って特定することができます。
これができることが、テーブルを使うことで得られる最大の利点です。後からテーブルの途中に新しい列を追加しても、マクロを修正する必要がなくなります。
Range("事件[事件番号]")(r) '「事件番号」列のr番目の行のセル
データ領域の行や列全体を特定することもできます。特に「行全体」は、特定の行の書式を設定する場合にとても便利です。
Range("事件").Rows(r) 'r番目の行全体
Range("事件").Columns(s) 's番目の列全体(見出しを除く)
コメント