2008年04月20日

えぇ〜、前回のコードについて説明致しますぅ〜

さて、前回のコードの解説だったかな・・・


まず、最初の行から

Option Explicit

これは変数の宣言を強制するお呪いだ。変数のスペルミスなどは発見しにくいバグとなりやすいので、できるだけこのお呪いはしておくようにしよう。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

これは Sleep という指定に時間だけ実行を停止させる Windows API の宣言だ。Excel マクロでも Windows API を使うことができるので、その気になれば大抵のことは実現可能だ。だたし、この Sleep、わざわざ実行を停止させて処理を遅くする必要がある場面は滅多にない。Windows API も使えるんだということだけは頭に入れておこう。

Sub 〜 End Sub

サブプロシジャー という実行プログラムの最小の記述単位。マクロ内からも呼び出すことができる。この例では 書式設定 というプロシジャーを宣言している。前に付いている Private は同一のモジュール内でしか通用しないものであることの宣言。現にこの例では後に続くプロシジャーからのみしか呼び出されない。逆に、マクロ全体で通用するように宣言したのが2番目の Sub プロシジャー 一歩前進。暗黙的な宣言として Sub の前には何も記述していないが、明示的に Public としてもよい。いつでも呼び出せるマクロを定義するにはこの宣言を行なう必要がある。

ちょっと飛んで

Dim M As Long, N As Long

変数の宣言。お呪いをしているので、使用する変数は必ず宣言しなければならない。宣言には Dim を用いる。ここでは N と M を長整数型として宣言している。通常、整数を使う場合には長整数型を使用していれば間違いは少ない。

For M = 1 To 3 〜 Next M

指定の変数の値を与えられた範囲で変えながらループ処理する構文。この例では変数 M の値を 1 から 3 まで変えながらループ内の処理を行なう。ネストすることもできる。現にこの例で M のループの中に N の For ループが存在している。実際に処理したいことを注意深く観察すると、ある決まった処理の繰り返しになることが多いので、このようなループ処理を行なう構文は非常に重要である。ただ、あまりネストを深くし過ぎると実際に処理される組み合わせは爆発的に増えるため、処理に時間がかかってしまうので注意が必要だ。

他にもループを構成する構文として Do 〜 Loop などがある。こちらは単純にこの間を繰り返すコマンド。ループを抜ける条件を作成しておかないと無限ループに陥り、処理が終わらなくなってしまうので要注意だ。

次に

If <条件> Then 〜 (Else) 〜 End If

これも非常に重要! 条件によって処理を分岐する構文だ。条件が真に評価されるなら Then 以下が実行される。偽に評価されるなら Else 以下が実行されるのだが、こちらは省略されていても構わない。この例でも省略されている。処理したい内容を分析すると様々なパターンで場合分けする必要が出てくるハズだ。単純作業を自動化するマクロとは、ループと条件分岐を効率よく組み合わせたものだといっても過言ではない。それくらい重要なものなのである。

さて、次に条件として記述されている IsEmpty(Cells(Row,Col)) についてだ。

その前に Range オブジェクトについて簡単に話そう。Range オブジェクトとは、ある範囲内のセルを指定するためのオブジェクトである。Excel の画面内でドラッグすると、指定の矩形の範囲が選択されるのはご存知のことと思う。要はアレだ。矩形の範囲を指定するオブジェクトだと思って問題ない。

範囲を指定するには Rangeメソッド を用いなくてはならないが、ひとつのセルのみを持つ Range オブジェクトCellsメソッド で取得できる。Row および Col はそれぞれ 行・列 の番号だ。A とか B とかではなく、整数で指定するのでコードを書く上では便利である。Range オブジェクト自体を参照した場合、そのオブジェクトの値プロパティの値が取得できる。つまり、この例では指定のセルの値を取得しているのである。

じゃぁ、IsEmpty() とは? 

セルの値は Variant型 と呼ばれる、あらゆるデータ型が格納できる便利?なデータ型である。数値を調べるなら数値と、文字列を調べるならその文字列と = でつないでやればいいのだが、空白のセルを調べる場合どうするのかっていうことである。Excel の空白セルの場合、Empty という値が設定されているので、IsEmpty() で値は Empty ですか? という問い合わせをしているのだ。空白セルなら真、そうじゃなければ偽になる。例では Not という否定を付けてあるので、セルの値が空白じゃなければ Then 以下を実行しなさいという記述になっているわけである。



ふぅ〜〜・・・

長くなってしまった・・・

まだ解説が終わったわけじゃないが、疲れたので残りは次回っていうことで・・・

今回の部分で非常に重要なのは ループ条件分岐 だ。よ〜く覚えておくように!

いいか〜、試験に出すぞぉ〜〜・・・(笑)


ラベル:マクロ EXCEL
posted by Woody at 00:24| Comment(0) | TrackBack(0) | Excel マクロ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。