こんにちは。Milkです。
今回は、ちょっとしたExcelマクロの話。
自分の中で躓いた点があったので備忘録として記録します。
Excelマクロ(VBA)とはなんぞや?という方は、解説の記事を書こうと思っているので、もうしばらくお待ちを・・・
二次元配列で情報を取得する
マクロにおいて、表の状態でデータを一度に取得することが可能です。
例えば、Rangeの関数を使用します。
表示されない場合はこちらをどうぞ
gist80f8f36104369788a04992e1753feda3
これは、引数でシートのスタートのセルを指定し、そこからデータが入っている右下のセルのポイントを探します。
最終的には、データをRangeの関数を使って取得します。
Range関数の使用の仕方
今回は、一つのブックの中のとあるシートを指定すると言う形で考えましょう。
本来の使い方はRange関数は、そのままセルの場所指定が出来ます。
Sheet(シートの名前).Range("表の左上のセル番号","表の右下のセル番号")
'使用例 Sheet(Sheet1).Range("A1","E14")
セルを指定する方法には、
Sheet(シートの名).Cell(行番号,列番号)
と言うやり方があります。
よって今回はこれを組み合わせました。
'Rangeの()内の前半は、データの左上のセルを、後半はデータの右下のセルを指定します Sheets(シート名).Range(Sheet(シートの名前).Cell(行番号,列番号), Sheet(シートの名前).Cell(行番号,列番号))
これをVariant
の変数に格納すれば、一気に二次元配列が出来上がります。
Dim Data As Variant
の変数に入れています。この中から値を取り出したい場合は、
変数(行番号,列番号)
となります。
例えば、3×3の表を取り込んだときは、(1,1) (1,2) (1,3) (2,1) (2,2) (2,3) (3,1) (3,2) (3,3) が指定できることになります。
(1,1) | (1,2) | (1,3) |
---|---|---|
(2,1) | (2,2) | (2,3) |
(3,1) | (3,2) | (3,3) |
Dim Celldata As Variant Celldata = Data(1,2)
Range関数は値を取り出す
今回、私が悩んでいたのはセルの「塗り潰し」の情報を取得したいという点でした。
上で述べた方法を利用すると、セルに入っている”値”だけが取り出されます。
セルの色情報は抜き出せないのです。
よって、色だけが入っている個所はデータとして""(空白)として扱われています。
なので、この空白の個所を指定して色のデータを直接的に入れることにしました。
表示されない場合はこちらをどうぞ
gist98608a6228895a6698dfd0e9231a3fce
気をつけなければならないのは、一般的なプログラム言語の配列では、要素は0から始まることです。
しかしながら、Excelはその特性上、”1”から始まります。
よって、ループを回す場合に、敢えてi = 1
で始めています。
UBound関数が出てきていますが、これは配列の最大要素数を調べる関数です。
UBound(Data, 1)
これは、1次元(行)の最大要素数を調べています。2を指定すれば2次元(列)の最大要素数を調べられます。
よって、Data変数の行数分を回転させ、空白になっている個所にセルの色情報を入れ込んでいます。
最後に
Range関数はとても手軽な関数ですが、あくまで「セルの値だけを取得する」と言うことが分かりました。
この点に注意しながら利用をしてみましょう。
それでは、今回はこの辺で。
adios!!