Milkのメモ帳

日々の思いつきを忘れないようにのメモ用です。

Milkのメモ帳

【VBA】Range関数の使い方と注意点【Excelマクロ】


f:id:maxminkun:20170829124835p:plain

こんにちは。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 関数 (Visual Basic)

UBound(Data, 1)

これは、1次元(行)の最大要素数を調べています。2を指定すれば2次元(列)の最大要素数を調べられます。

よって、Data変数の行数分を回転させ、空白になっている個所にセルの色情報を入れ込んでいます。

最後に

Range関数はとても手軽な関数ですが、あくまで「セルの値だけを取得する」と言うことが分かりました。

この点に注意しながら利用をしてみましょう。

それでは、今回はこの辺で。

adios!!