分岐・ループ構文
ブック内のすべてのシートをループして、複数のシートに同じ処理を実行するコードを紹介します。たくさんのシートに同じ処理を行うのは、マクロならではの便利な技です。いくつかパターンを用意しましたので、お好きなコードをお持ち帰りください。
複数のOR条件分岐を簡潔に書く方法を解説します。IF/ORステートメント、Select Case ステートメント、Functionプロシージャ、カンマ区切りテキスト&Instr関数、Dictionary(連想配列)を紹介しますのでお好みで使い分けて下さい。
繰り返し処理を行うためのステートメント、Do While文と、Do Until文の違いを解説します。「条件を満たす間続ける」のがDo While文「条件を満たしたら終わる」のがDo Until文です。使い分けですが、そもそもどちらも使わなくていい気がします。
すべての図形(Shape)に同じ処理を行う方法を解説します。WorksheetオブジェクトのShapesプロパティでシート上の図形を取得し、For Eachステートメントで順番に処理します。
落ちると抜け出せなくなるVBAの落とし穴です。For EachでRangeオブジェクトをループしたとき、全セルが処理されない。Rangeオブジェクト.Countがセルの数を返さない。あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。
ブック内にあるすべての図形を取得/処理する方法を解説します。WorkbookオブジェクトにはShapesプロパティがありませんので、すべてのシートをFor Eachで回し、Worksheet.Shapesで取得します。
繰り返し(ループ)処理を行う方法を解説します。条件を満たすまで処理を繰り返すには、 Do Loopステートメントを使用します。 基本構文 Do Loop文 Exit Do使用 While使用 Until使用 サンプルコード Exit Do使用版 While使用版 Until使用版 For使用版 利用例 W…
条件を満たす間繰り返し(ループ)処理を行うにはDo While ~ Loopステートメント(Do While文)を使用します。主に「データに○○が登場するまで」「Dir関数が""を返すまで」のようなループに使用します。
条件を満たすまで繰り返し(ループ)処理を行うにはDo Until ~ Loopステートメント(Do Until文)を使用します。主に「データに○○が登場するまで」「Dir関数が""を返すまで」のようなループに使用します。
条件がTrueの間処理を繰り返すループ文には、Do While~Loop文と While~Wend文の二つがあります。文法は全く同じで、Exit DoはあるけどExit Whileはないのが違いなので、常にDo Whileを使っておけばOKです。
条件がTrueの間処理を繰り返すには、通常Do While文を使用します。よって別段使用する必要はありませんが、その他の方法として、While~Wendステートメントを使用することもできます。
回数を指定して繰り返し(ループ)処理を行うにはFor Nextステートメントを使用します。同じ処理を指定回数繰り返し、データを1行ずつ処理、すべてのシートに同じ処理、などのループに使用できます。
データを逆順でループするには、For Nextステートメントの引数Stepに-1を指定します。これだけで逆順ループを組むことが出来ますが、初期値と最終値を逆にしてしまわないことに注意してください。
データをひとつ飛ばしでループするには、For Nextステートメントの引数Stepを使用します。Stepに指定した数値だけカウンタ変数を進めてくれる上、ピッタリ最終値にならなくても止まってくれるので安心です。
データを1行ずつループして処理するにはFor~Nextステートメントを使用します。使用する際は対象シートをWorksheet変数に入れる、カウンタ変数をiではなくRや行にするなど、変数の扱いに気を付けましょう。
セルの値ごとにセルを色分けするには条件付き書式がメジャーですが、設定の面倒さやコピー時の挙動・増殖問題、再計算の重さに悩まされることもあります。これをマクロで実装する方法を解説します。
ある年の恵方がどの方角かを調べる関数を紹介します。恵方は実は4種類しかなく、しかも周期が10になっているため、西暦年の下1桁「Right(年,1)」を判定するだけで求めることが出来ます。
今日はFor Eachステートメントで遊んでみようと思います。For Eachステートメントの変数を途中で変更したり、対象のCollectionを追加・削除して、それがForEachのループに影響するか試してみます。
コミュニティ「Excel-Fun.xls*」にて毎月出題される、VBAの問題に対する私の回答ソースコードを掲載いたします。今回掲載するコードは第6回課題共有会の課題でもあった「人事データからクロス表を作成」のマクロ1です。
コミュニティ「Excel-Fun.xls*」にて毎月出題される、VBAの問題に対する私の回答ソースコードを掲載いたします。今回掲載するコードは第4回課題共有会の課題でもあった「プラモの部品構成表を作成する」問題です。
コミュニティ「Excel-Fun.xls*」にて毎月出題される、VBAの問題に対する私の回答ソースコードを掲載いたします。今回掲載するコードは第1回課題共有会の課題でもあった「スケジュール着色」問題です。
5行かかるIf~Else~EndIfの分岐を1行で済ますIIf関数はとても便利なのですが、若干遅いためそれを検証してみます。結論としては、IIfが条件がTrueでもFalse部分も計算してしまうという遅さがあるが、それを除けば実務上実感できる差は出ません。
繰り返し処理を行うステートメントである、Do While~Loop文と、Do~Loop While文の違いを解説します。両者とも条件式によってループを続けるか判定しますが、While条件式 を書く位置が違います。ほぼ同じ動きなので、より有名な方を使いましょう。
「If 開始条件=False Then 警告 Else メインコード Endif」と書いているマクロは、ExitSub EndIfと一旦If文を閉じることで、メインの処理をElse内に書かずに済みます。メインコードのインデントが1つ減りますし、終わった話は終わったと明示しましょう。
コードの読みやすさと処理速度のバランスに関するお話です。テーマは「Ifの判定回数にどれだけこだわるか」です。単純な比較時間は、実はほとんど0で、別にIfは重複しても問題ありません。Else地獄に陥らないよう、読みやすさを追求していきましょう。
マクロの処理速度に関するお話です。今回のテーマは「錯覚しやすいForステートメントの処理速度」です。For R = 1 To 10000 処理A,B,C,D Nextは、For R = 1 To 10000 処理A Next × 4個に分けても、「Rに1を足す×30000回」しか処理の内容に差がありません。
Ifの判定部分がOn Error Resume Nextでスキップされた場合、IfステートメントはTRUE側に分岐します。実はIfステートメントはTrueなら通ってよしという処理ではなく、FalseならEndIfまでジャンプという処理なので、それがスキップされるという理屈です。