VBA樹林– category –
-
【VBA】開発中だけ実行するデバッグ用コードを記述する方法(条件付きコンパイル)
はじめに VBAでマクロを開発している最中は、Debug.Print で変数の値を確認したり、テスト用のメッセージボックスを表示したりと、デバッグのためのコードを多用します。しかし、マクロが完成して他の人に配布する際には、これらのデバッグ用コードは不要... -
【VBA】Debug.Assert の使い方 | 条件を満たさない時にマクロを中断させるデバッグ術
はじめに VBAのデバッグ作業中、「このループ処理で、変数の値が予期せず100を超えた瞬間だけ、マクロを止めて原因を調査したい」といった特定の状況でプログラムを一時停止させたい場面があります。 ブレークポイント(F9キー)を使えば任意の位置でマク... -
【VBA】コロン(:)を使って、複数行のコードを1行に記述する方法
はじめに VBAでコードを記述する際、通常は一つの命令(ステートメント)ごとに改行します。しかし、イミディエイトウィンドウで簡単な処理を連続して実行したい場合や、関連する短い処理をまとめて記述したい場合、複数行にわたるコードを一行にまとめら... -
【VBA】マクロ不要!イミディエイトウィンドウで一行コードを直接実行する方法
はじめに VBAで「アクティブセルの色をちょっと変えたい」「特定のプロパティの値を確認したい」といった、一度きりの簡単な操作のために、わざわざ Sub ... End Sub のマクロを作成するのは面倒ですよね。 VBE(VBAエディタ)の「イミディエイトウィンド... -
【VBA】Debug.Print で出力を改行させずに、同じ行に続けて表示する方法
はじめに VBAの Debug.Print は、実行するたびにイミディエ-トウィンドウで自動的に改行されるのがデフォルトの動作です。しかし、ループ処理などで、「複数のデータを、改行せずに一行にまとめて表示したい」という場面もよくあります。 Debug.Print ステ... -
【VBA】デバッグの必須スキル!イミディエイトウィンドウに値を出力する方法 (Debug.Print)
はじめに VBAでマクロを作成している際、「ループ処理の途中で、変数の値がどう変化しているか確認したい」「この処理が本当に実行されているか知りたい」といった場面は頻繁に起こります。 MsgBox を使って変数の値を表示する方法もありますが、ループの... -
【VBA】マクロの処理時間を計測する方法 (Timer関数)
はじめに 作成したVBAマクロが、どれくらいの時間で処理を完了しているか、正確に知りたいと思ったことはありませんか?特に、扱うデータ量が増えたり、コードを改善したりした際に、その効果を数値で比較できると非常に便利です。 VBAには、Timer という... -
【VBA】シート名を取得する自作ワークシート関数(UDF)の作り方
はじめに Excelの標準機能には、セルにそのシート自身の名前を表示するための簡単なワークシート関数が用意されていません(CELL関数などを使えば可能ですが、複雑です)。 しかし、VBAで**ユーザー定義関数(UDF: User-Defined Function)**を作成すれば... -
【VBA】Forループで、残りの処理をスキップして次のループに進む方法
はじめに VBAで For ループを使って繰り返し処理を行う際、「特定の条件を満たした時だけ、その回のループ内の残りの処理をスキップして、すぐに次の繰り返しに進みたい」という場面がよくあります。 他のプログラミング言語には、このような場合に Contin... -
【VBA】マクロを途中で終了する Exit Sub と End の違いと使い分け
はじめに VBAでマクロを作成する際、特定の条件を満たした場合に、処理を途中で終了させたい場面がよくあります。例えば、「必要なファイルが見つからない」「入力必須のセルが空白である」といったケースです。 VBAには、処理を中断するためのステートメ... -
【VBA】イミディエイトウィンドウの出力を見やすく整形する方法 (Debug.Print)
はじめに VBAでマクロのデバッグ(動作確認やバグ修正)を行う際、Debug.Print を使ってイミディエイトウィンドウに変数の値を出力するのは、非常に有効な手段です。しかし、複数の値をただ連結して表示しただけでは、文字列の長さがバラバラで、結果がず... -
【VBA】LSet / RSet で、固定長文字列の文字を左詰め/右詰めにする方法
はじめに VBAの「固定長文字列」は、指定した文字数に満たない場合に、自動でスペースが追加(パディング)される便利な機能です。しかし、デフォルトの挙動では、代入するデータが文字列なら左詰め、数値なら右詰めとなり、細かなアライメント(文字寄せ... -
【VBA】固定長の文字列を作成する方法 (String * Length) とその注意点
はじめに VBAで文字列を扱う際、通常は Dim myString As String のように宣言し、その中身の長さは可変です。しかし、古いシステムとのデータ連携や、特定のファイルフォーマットに合わせてデータを作成する際には、「商品コードは必ず8文字」「数量は必ず... -
【VBA】Err.Clear の使い方 | ループ内のエラー処理で必須のテクニック
はじめに VBAで On Error Resume Next を使ってエラーを無視する処理を書く際、特にループの中で使う場合には注意が必要です。VBAの Err オブジェクトは、一度エラー情報を記録すると、次に別のエラーが発生するか、プログラムが終了するまで、そのエラー... -
【VBA】エラー処理後に元の処理を再試行(リトライ)する方法 (Resume)
はじめに VBAでエラー処理を行う際、エラーをユーザーに通知してマクロを終了するだけでなく、「エラーの原因をプログラムで修正し、失敗した処理をもう一度やり直したい」という高度な制御が必要になることがあります。 例えば、「書き込み先のシートが存... -
【VBA】エラーの種類を判別して処理を分岐する方法 (Errオブジェクト)
はじめに VBAのエラー処理において、On Error GoTo はエラーが発生したら一律で同じ場所にジャンプするため、エラーの種類に応じた細かい対応がしにくい場合があります。一方で On Error Resume Next はエラーを無視するだけなので、エラーが起きたこと自... -
【VBA】エラーを無視して処理を続行する On Error Resume Next の使い方と注意点
はじめに VBAマクロの実行中にエラーが発生すると、通常はプログラムが停止してしまいます。しかし、時には「この処理でエラーが起きても問題ないので、無視して次の行に進んでほしい」という場面があります。 その代表例が、「マクロの最初に、前回作成し... -
【VBA】エラー処理を途中で解除する On Error GoTo 0 の使い方
はじめに VBAのエラー処理 On Error GoTo [ラベル名] は、一度設定すると、そのプロシージャが終了するまで有効です。しかし、「マクロの一部分だけでエラーを監視し、それ以外の部分では通常通りエラーで停止させたい」という場面があります。 このような... -
【VBA】エラー処理の基本!On Error GoTo でエラー発生時に処理を分岐する方法
はじめに VBAマクロの実行中に、存在しないシートを選択しようとしたり、0で割り算をしようとしたりすると、エラーが発生してプログラムが強制的に停止してしまいます。これは、マクロの利用者にとっては不親切ですよね。 VBAの On Error GoTo ステートメ... -
【VBA】ワークシートを独自のオブジェクトとして扱う上級テクニック
はじめに VBAで特定のワークシートを操作する際、通常は Worksheets("データシート").Range("A1")... のように、長くて少し分かりにくいコードを記述します。しかし、VBAには、ワークシートそのものを一つの独立したオブジェクトと見なし、独自のメソッド... -
【VBA】クラスモジュールでプロパティ名と引数名が同じ時の解決法 (Meキーワード)
はじめに VBAのクラスモジュールで、クラスの初期化処理などを作成する際、プロパティ名と、それに値を設定するためのメソッドの引数名が、同じになってしまうことがよくあります。 例えば、「商品」クラスが Name というプロパティを持ち、初期化メソッド... -
【VBA】カスタムコレクションクラスの作り方|複数オブジェクトをスマートに管理する
はじめに VBAで自作のクラス(オブジェクト)を複数扱う際、それらを配列や標準の Collection オブジェクトで管理することが多いですが、いくつか不便な点があります。 配列: ReDim Preserve でのサイズ変更が少し面倒。 標準 Collection: どんな種類のオ... -
【VBA】クラスの初期化イベント Class_Initialize の使い方(コンストラクタ)
はじめに VBAのクラスモジュールを使って独自のオブジェクトを作成する際、オブジェクトが生成された(New された)瞬間に、プロパティの初期値を設定したり、何らかの準備処理を自動で実行したりしたい場合があります。 例えば、「商品」オブジェクトを作... -
【VBA】クラスにメソッド(Sub/Function)を定義する方法
はじめに VBAのクラスモジュールは、データ(プロパティ)と、そのデータを操作するための処理(メソッド)をひとまとめにした「オブジェクト」の設計図です。プロパティがオブジェクトの「状態」を表すのに対し、メソッドはオブジェクトの「振る舞い」を... -
【VBA】クラスのプロパティ定義 (Property Let/Get/Set) をマスターする方法
はじめに VBAのクラスモジュールでオブジェクトを作成する際、そのオブジェクトの「データ(属性)」を外部から安全に操作するための窓口となるのが「プロパティ」です。 プロパティを適切に定義することで、以下のような高度な制御が可能になります。 値... -
【VBA】クラスモジュールを使って、独自のオブジェクトを作成する方法(基本編)
はじめに VBAプログラミングを次のレベルに引き上げる強力な機能、それが「クラスモジュール」です。ユーザー定義型(Type)が、関連するデータ(変数)をまとめる「入れ物」だったのに対し、クラスは、その**データ(プロパティ)に加えて、関連する処理... -
【VBA】オブジェクト(Range/Worksheetなど)を返す関数の作り方 (Set)
はじめに VBAのFunctionは、通常、数値や文字列といった「値」を返します。しかし、より高度な使い方として、セル範囲(Range)やワークシート(Worksheet)といった「オブジェクト」そのものを戻り値として返すことができます。 オブジェクトを返す関数を... -
【VBA】ParamArrayで可変長の引数(任意の個数の引数)を受け取る方法
はじめに Excelの SUM 関数が、SUM(A1, A2) のように2つの引数でも、SUM(A1:A10) のように多数の引数でも、柔軟に計算できるのはなぜだろう、と考えたことはありませんか? VBAで自作の関数(Function)を作る際にも、受け取る引数の個数を固定せず、2個で... -
【VBA】IsMissing関数で、OptionalなVariant引数が省略されたか判定する方法
はじめに VBAで引数を省略可能にする Optional キーワードは非常に便利ですが、Variant 型の引数に対して使う場合は、一つ特別な注意点があります。それは、Optional な Variant 型の引数には、= デフォルト値 の形で初期値を設定できない、というルールで... -
【VBA】関数の引数を省略可能にする方法(Optionalキーワード)
はじめに 自作したVBA関数(Function)をより柔軟で使いやすくするために、「引数(ひきすう)を省略可能にしたい」という場合があります。例えば、通常は決まった値を使うけれど、時々その値を変更したい、といった引数です。 VBAでは、引数を宣言する際...