mori– Author –
-
VBA樹林
【VBA】Excelの「閉じる」ボタン(×)を無効化する方法 (Windows API)
はじめに VBAで、ユーザーに特定の操作を強制したい場合や、誤ってExcelを閉じられては困るような処理を実行している際に、「Excelウィンドウ右上の『閉じる』ボタン(×ボタン)を一時的に無効化したい」という、非常に高度な制御が必要になることがありま... -
VBA樹林
【VBA】画面の解像度(幅と高さ)を取得する方法 (GetSystemMetrics API)
はじめに VBAでユーザーフォームを作成する際、利用者の画面サイズを考慮して、フォームの表示位置や大きさを最適化したい場合があります。例えば、画面解像度に合わせてフォームを中央に表示したり、ウィンドウが画面からはみ出さないように調整したりす... -
VBA樹林
【VBA】ファイルやフォルダを完全に削除せず、ごみ箱に移動する方法 (API)
はじめに VBAでファイルを削除する際、Kill ステートメントや FileSystemObject の .DeleteFile メソッドを使うと、ファイルは完全に削除されてしまい、元に戻すことができません。もし操作を誤ると、重要なデータを失ってしまう危険性があります。 Window... -
VBA樹林
【VBA】外部アプリのウィンドウを最前面に表示する方法 (SetForegroundWindow API)
はじめに VBAマクロから Shell 関数で他のアプリケーションを起動したり、既に開いているアプリケーションを操作したりする際、「目的のウィンドウが他のウィンドウの背面に隠れてしまっていて見えない」ということがあります。 このような場合に、指定し... -
VBA樹林
【VBA】起動している全てのメモ帳を一度に閉じるマクロ (Windows API)
はじめに VBAマクロの実行中に、複数のメモ帳や電卓のウィンドウが開かれていると、作業の妨げになったり、処理の競合を引き起こしたりすることがあります。このような場合に、「起動している特定のアプリケーション(例: 全てのメモ帳)を、一度に全て閉... -
VBA樹林
【VBA】起動した外部アプリが終了するまで待機する方法 (Windows API)
はじめに VBAの Shell 関数で外部のアプリケーションを起動すると、VBAはアプリケーションの起動だけを行って、その終了を待たずに、すぐに次のコードの実行に移ってしまいます。しかし、時には「ユーザーがメモ帳での編集を終えて、ファイルを保存して閉... -
VBA樹林
【VBA】アプリケーションの重複起動を防止する方法 (FindWindow API)
はじめに VBAの Shell 関数で外部のアプリケーションを起動する際、何も考えずに実行すると、ボタンを押すたびに新しいウィンドウがどんどん開いてしまいます。これを防ぎ、「もし既に起動していたら、新しくは起動しない」という制御を加えたい場面は非常... -
VBA樹林
【VBA】Windows APIの使い方入門!Declareステートメントの書き方を徹底解説
はじめに VBAは非常に高機能な言語ですが、時には「PCのスピーカーから音を鳴らしたい」「特定ウィンドウの情報を取得したい」といった、Excelの標準機能だけでは実現できない、よりOSに近いレベルの操作が必要になることがあります。 このような高度な機... -
VBA樹林
【VBA】クイックソートアルゴリズムの実装|配列を高速に並べ替える方法
はじめに VBAで大量のデータを格納した配列を並べ替える際、処理速度は非常に重要な要素になります。数あるソートアルゴ-リズムの中でも、「クイックソート」は、その名の通り、一般的に最も高速なアルゴリズムの一つとして知られています。 クイックソー... -
VBA樹林
【VBA】マージソートアルゴリズムの実装|配列を高速に並べ替える方法
はじめに VBAで配列の要素を並べ替える(ソートする)際、バブルソートのような単純なアルゴリズムは理解しやすいですが、要素数が多くなると処理に非常に時間がかかってしまいます。 より大規模なデータを高速にソートするためのアルゴリズムの一つが「マ... -
VBA樹林
【VBA】マクロを時間差で実行・繰り返し実行する方法 (OnTime, GetTickCount)
はじめに VBAで、「5分後に自動でファイルを保存したい」「10秒ごとにシートの値を更新したい」といった、時間を起点とした処理を実装したい場面は多くあります。また、より高度な使い方として、図形を滑らかに動かすようなアニメーションを作成したい場合... -
VBA樹林
【VBA】コマンドプロンプトの実行結果(出力)を文字列として取得する方法
はじめに VBAから Shell 関数でコマンドプロンプトのコマンドを実行できますが、その**実行結果(画面に表示されるテキスト)**をVBAの変数として受け取り、プログラムの中で利用したい、という場面があります。例えば、dir コマンドの結果からファイルの... -
VBA樹林
【VBA】コマンドプロンプト(DOSコマンド)を実行する方法 (WScript.Shell)
はじめに VBAマクロから、ファイルの一覧をテキストに出力する dir コマンドや、ネットワーク設定を確認する ipconfig コマンドといった、古くからある**コマンドプロンプト(DOSコマンド)**を実行したい場面があります。 VBAから WScript.Shell オブジェ... -
VBA樹林
【VBA】Shell関数で外部のアプリケーション(電卓、メモ帳など)を起動する方法
はじめに VBAマクロの処理の流れの中で、「メモ帳を開いてログを書き出したい」「ブラウザを開いて特定のURLにアクセスさせたい」といったように、Excel以外の外部アプリケーションを起動したい場面があります。 VBAの Shell 関数を使えば、このような外部... -
VBA樹林
【VBA】モジュール名を指定して、他のモジュールのマクロを呼び出す方法
はじめに VBAでプロジェクトの規模が大きくなると、機能ごとにコードを別の標準モジュールに分割して管理することが多くなります。その際、異なるモジュール間で、偶然同じ名前のマクロ(プロシージャ)を定義してしまう可能性があります。 このような状況... -
VBA樹林
【VBA】マクロでVBAコードを自動生成・編集する方法 (CodeModuleオブジェクト)
はじめに VBAの VBProject オブジェクトを使うと、モジュールをエクスポートしたりインポートしたりできますが、さらに一歩進んで、モジュール内のコードそのものを、マクロを使って一行ずつ読み書きすることも可能です。 これを実現するのが CodeModule ... -
VBA樹林
【VBA】モジュール内のマクロ名一覧を正規表現で取得し、シートに書き出す方法
はじめに VBAプロジェクトが大規模になってくると、「このモジュールに、どんなマクロを書いたか忘れてしまった」「マクロの仕様書を作るために、プロシージャ名の一覧が欲しい」といった場面が出てきます。 VBAの VBProject オブジェクトと、正規表現(VB... -
VBA樹林
【VBA】VBAモジュールをマクロで操作する方法(エクスポート/インポート/削除)
はじめに VBAのプロジェクト(モジュールやフォームなど)そのものを、マクロを使って操作したいと考えたことはありませんか? 例えば、「よく使う汎用的なモジュールを、ボタン一つで他のブックにもインポートしたい」「開発中のモジュールのバックアップ... -
VBA樹林
【VBA】OSやExcelのバージョン情報を取得する方法(互換性対策)
はじめに 作成したVBAマクロを他の人に使ってもらう際、相手のPC環境(OSがWindows 10か11か、Excelが32bit版か64bit版かなど)によって、マクロが意図通りに動作しないことがあります。 VBAを使えば、マクロを実行しているPCのOS情報や、Excel自体のバー... -
VBA樹林
VBAでファイルの文字コードを判別!ADODB.StreamでBOMを読み取る方法
はじめに VBAで外部のテキストファイルを読み込む際、意図せず文字化けしてしまった経験はありませんか?その原因の一つに、ファイルの**BOM(バイトオーダーマーク)**が関係していることがあります。BOMは、UTF-8などの文字コードで保存されたファイルの... -
VBA樹林
【VBA】選択セルの改行数に合わせて、数式バーの高さを自動調整する方法
はじめに Excelのセル内で改行(Alt + Enter)を使って長い数式や文章を入力すると、数式バーには最初の1行しか表示されず、全体を確認するために毎回手動でバーの高さを広げなければならず、不便ですよね。 VBAのシートイベントを使えば、「セルを選択し... -
VBA樹林
【VBA】PCにインストールされているプリンターの一覧を取得する方法
はじめに VBAで印刷関連のマクロを作成する際、「現在利用可能なプリンターの名前をリストアップしたい」「特定のプリンターがインストールされているか確認したい」といった場面があります。 VBAからWindowsのシェル機能にアクセスすることで、PCに登録さ... -
VBA樹林
【VBA】Stopステートメントで、マクロの実行を任意に一時中断する方法
はじめに VBAのデバッグ作業中、特定の位置でプログラムの実行を一時停止させたい場合、通常はブレークポイント(F9キーで設定/解除)を使います。しかし、ブレークポイントはファイルに保存されないため、一度ファイルを閉じてしまうと、再度設定し直す必... -
VBA樹林
【VBA】32bit/64bit版Office両対応のマクロを作成する方法 (Vba7, Win64)
はじめに Excel 2010以降、Officeには32bit版と64bit版が存在します。VBAのコード、特にWindows API関数を呼び出す Declare ステートメントは、このbit数の違いによって書き方を変える必要があります。もし対応しないコードを書くと、他の人の環境でマクロ... -
VBA樹林
【VBA】開発中だけ実行するデバッグ用コードを記述する方法(条件付きコンパイル)
はじめに VBAでマクロを開発している最中は、Debug.Print で変数の値を確認したり、テスト用のメッセージボックスを表示したりと、デバッグのためのコードを多用します。しかし、マクロが完成して他の人に配布する際には、これらのデバッグ用コードは不要... -
VBA樹林
【VBA】Debug.Assert の使い方 | 条件を満たさない時にマクロを中断させるデバッグ術
はじめに VBAのデバッグ作業中、「このループ処理で、変数の値が予期せず100を超えた瞬間だけ、マクロを止めて原因を調査したい」といった特定の状況でプログラムを一時停止させたい場面があります。 ブレークポイント(F9キー)を使えば任意の位置でマク... -
VBA樹林
【VBA】コロン(:)を使って、複数行のコードを1行に記述する方法
はじめに VBAでコードを記述する際、通常は一つの命令(ステートメント)ごとに改行します。しかし、イミディエイトウィンドウで簡単な処理を連続して実行したい場合や、関連する短い処理をまとめて記述したい場合、複数行にわたるコードを一行にまとめら... -
VBA樹林
【VBA】マクロ不要!イミディエイトウィンドウで一行コードを直接実行する方法
はじめに VBAで「アクティブセルの色をちょっと変えたい」「特定のプロパティの値を確認したい」といった、一度きりの簡単な操作のために、わざわざ Sub ... End Sub のマクロを作成するのは面倒ですよね。 VBE(VBAエディタ)の「イミディエイトウィンド... -
VBA樹林
【VBA】Debug.Print で出力を改行させずに、同じ行に続けて表示する方法
はじめに VBAの Debug.Print は、実行するたびにイミディエ-トウィンドウで自動的に改行されるのがデフォルトの動作です。しかし、ループ処理などで、「複数のデータを、改行せずに一行にまとめて表示したい」という場面もよくあります。 Debug.Print ステ... -
VBA樹林
【VBA】デバッグの必須スキル!イミディエイトウィンドウに値を出力する方法 (Debug.Print)
はじめに VBAでマクロを作成している際、「ループ処理の途中で、変数の値がどう変化しているか確認したい」「この処理が本当に実行されているか知りたい」といった場面は頻繁に起こります。 MsgBox を使って変数の値を表示する方法もありますが、ループの...