スタイル

表は必ずテーブルにする

法律事務所の仕事では、エクセルをデータベースとして使うことが多くあります。エクセルをデータベースとして使用する場合に便利な機能として、テーブル機能があるのですが、使っている人は少ないようです。

テーブル機能がどうして便利なのかについては、こちらの記事が参考になります。

そして、このテーブル機能は、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番目の列全体(見出しを除く)

コメント

  1. 管理人 より:

    「テーブルの特定」および「テーブルの部位の特定」の記述を追加しました。

タイトルとURLをコピーしました