-
【VBA】アプリケーションの重複起動を防止する方法 (FindWindow API)
はじめに VBAの Shell 関数で外部のアプリケーションを起動する際、何も考えずに実行すると、ボタンを押すたびに新しいウィンドウがどんどん開いてしまいます。これを防ぎ、「もし既に起動していたら、新しくは起動しない」という制御を加えたい場面は非常... -
【VBA】Windows APIの使い方入門!Declareステートメントの書き方を徹底解説
はじめに VBAは非常に高機能な言語ですが、時には「PCのスピーカーから音を鳴らしたい」「特定ウィンドウの情報を取得したい」といった、Excelの標準機能だけでは実現できない、よりOSに近いレベルの操作が必要になることがあります。 このような高度な機... -
【VBA】クイックソートアルゴリズムの実装|配列を高速に並べ替える方法
はじめに VBAで大量のデータを格納した配列を並べ替える際、処理速度は非常に重要な要素になります。数あるソートアルゴ-リズムの中でも、「クイックソート」は、その名の通り、一般的に最も高速なアルゴリズムの一つとして知られています。 クイックソー... -
【VBA】マージソートアルゴリズムの実装|配列を高速に並べ替える方法
はじめに VBAで配列の要素を並べ替える(ソートする)際、バブルソートのような単純なアルゴリズムは理解しやすいですが、要素数が多くなると処理に非常に時間がかかってしまいます。 より大規模なデータを高速にソートするためのアルゴリズムの一つが「マ... -
【VBA】マクロを時間差で実行・繰り返し実行する方法 (OnTime, GetTickCount)
はじめに VBAで、「5分後に自動でファイルを保存したい」「10秒ごとにシートの値を更新したい」といった、時間を起点とした処理を実装したい場面は多くあります。また、より高度な使い方として、図形を滑らかに動かすようなアニメーションを作成したい場合... -
【VBA】コマンドプロンプトの実行結果(出力)を文字列として取得する方法
はじめに VBAから Shell 関数でコマンドプロンプトのコマンドを実行できますが、その**実行結果(画面に表示されるテキスト)**をVBAの変数として受け取り、プログラムの中で利用したい、という場面があります。例えば、dir コマンドの結果からファイルの... -
【VBA】コマンドプロンプト(DOSコマンド)を実行する方法 (WScript.Shell)
はじめに VBAマクロから、ファイルの一覧をテキストに出力する dir コマンドや、ネットワーク設定を確認する ipconfig コマンドといった、古くからある**コマンドプロンプト(DOSコマンド)**を実行したい場面があります。 VBAから WScript.Shell オブジェ... -
【VBA】Shell関数で外部のアプリケーション(電卓、メモ帳など)を起動する方法
はじめに VBAマクロの処理の流れの中で、「メモ帳を開いてログを書き出したい」「ブラウザを開いて特定のURLにアクセスさせたい」といったように、Excel以外の外部アプリケーションを起動したい場面があります。 VBAの Shell 関数を使えば、このような外部... -
【VBA】モジュール名を指定して、他のモジュールのマクロを呼び出す方法
はじめに VBAでプロジェクトの規模が大きくなると、機能ごとにコードを別の標準モジュールに分割して管理することが多くなります。その際、異なるモジュール間で、偶然同じ名前のマクロ(プロシージャ)を定義してしまう可能性があります。 このような状況... -
【VBA】マクロでVBAコードを自動生成・編集する方法 (CodeModuleオブジェクト)
はじめに VBAの VBProject オブジェクトを使うと、モジュールをエクスポートしたりインポートしたりできますが、さらに一歩進んで、モジュール内のコードそのものを、マクロを使って一行ずつ読み書きすることも可能です。 これを実現するのが CodeModule ... -
【VBA】モジュール内のマクロ名一覧を正規表現で取得し、シートに書き出す方法
はじめに VBAプロジェクトが大規模になってくると、「このモジュールに、どんなマクロを書いたか忘れてしまった」「マクロの仕様書を作るために、プロシージャ名の一覧が欲しい」といった場面が出てきます。 VBAの VBProject オブジェクトと、正規表現(VB... -
【VBA】VBAモジュールをマクロで操作する方法(エクスポート/インポート/削除)
はじめに VBAのプロジェクト(モジュールやフォームなど)そのものを、マクロを使って操作したいと考えたことはありませんか? 例えば、「よく使う汎用的なモジュールを、ボタン一つで他のブックにもインポートしたい」「開発中のモジュールのバックアップ... -
【VBA】OSやExcelのバージョン情報を取得する方法(互換性対策)
はじめに 作成したVBAマクロを他の人に使ってもらう際、相手のPC環境(OSがWindows 10か11か、Excelが32bit版か64bit版かなど)によって、マクロが意図通りに動作しないことがあります。 VBAを使えば、マクロを実行しているPCのOS情報や、Excel自体のバー... -
VBAでファイルの文字コードを判別!ADODB.StreamでBOMを読み取る方法
はじめに VBAで外部のテキストファイルを読み込む際、意図せず文字化けしてしまった経験はありませんか?その原因の一つに、ファイルの**BOM(バイトオーダーマーク)**が関係していることがあります。BOMは、UTF-8などの文字コードで保存されたファイルの... -
【VBA】選択セルの改行数に合わせて、数式バーの高さを自動調整する方法
はじめに Excelのセル内で改行(Alt + Enter)を使って長い数式や文章を入力すると、数式バーには最初の1行しか表示されず、全体を確認するために毎回手動でバーの高さを広げなければならず、不便ですよね。 VBAのシートイベントを使えば、「セルを選択し... -
【VBA】PCにインストールされているプリンターの一覧を取得する方法
はじめに VBAで印刷関連のマクロを作成する際、「現在利用可能なプリンターの名前をリストアップしたい」「特定のプリンターがインストールされているか確認したい」といった場面があります。 VBAからWindowsのシェル機能にアクセスすることで、PCに登録さ... -
【VBA】Stopステートメントで、マクロの実行を任意に一時中断する方法
はじめに VBAのデバッグ作業中、特定の位置でプログラムの実行を一時停止させたい場合、通常はブレークポイント(F9キーで設定/解除)を使います。しかし、ブレークポイントはファイルに保存されないため、一度ファイルを閉じてしまうと、再度設定し直す必... -
【VBA】32bit/64bit版Office両対応のマクロを作成する方法 (Vba7, Win64)
はじめに Excel 2010以降、Officeには32bit版と64bit版が存在します。VBAのコード、特にWindows API関数を呼び出す Declare ステートメントは、このbit数の違いによって書き方を変える必要があります。もし対応しないコードを書くと、他の人の環境でマクロ... -
【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の「固定長文字列」は、指定した文字数に満たない場合に、自動でスペースが追加(パディング)される便利な機能です。しかし、デフォルトの挙動では、代入するデータが文字列なら左詰め、数値なら右詰めとなり、細かなアライメント(文字寄せ...