VBA 第8章 高度な使い方【残りマクロ】

1.レジストリにデータを登録する

レジストリには、Windowsやアプリケーションに必要な重要データが保存されています。安易に編集して、誤ったデータを書き込むと、Windowsが起動しなくなるなどの恐れもあります。VBAには、レジストリのデータを読み書きする命令が用意されています。VBAの命令で操作できるのは、

 

の配下です。ここは、独自のプログラムがデータを書き込む専用の場所なので、いくら編集してもWindowsや他のアプリケーションに影響をあたることはありません。PCごとにデータを保存するような場合、レジストリは便利に活用できます。

 

2.レジストリのデータを取得する

レジストリデータを取得するには、GetSetting関数を使います。GetSetting関数の第四引数には、指定したレジストリのデータが存在しないときのデフォルト値を指定できます。

 

3.レジストリのデータを削除する

レジストリのデータを削除するには、DeleteSettingステートメントを使います。存在しないキーやデータを削除しようとするとエラーになります。

 

4.レジストリのデータをまとめて取得する

単一のレジストリデータを取得するには、GetSetting関数を使います。あるキーに存在する、全てのレジストリデータを一気に取得するには、GetAllSettings関数を使います。GetAllSettings関数は、取得したレジストリデータを二次元配列で返します。

 

5.Excelを終了させる

Excel自体を終了させるには、Excelを表すApplicationオブジェクトのQuitメソッドを実行します。開いているブックの変更を保存していないと、変更を保存するかどうかの確認が表示されます。

 

6.【フォルダの選択】ダイアログボックスを開く

Excelには標準でフォルダを開くダイアログボックスが用意されています。表示するには、FileDialogプロパティにダイアログボックスの種類を会わらす定数を指定して、Showメソッドヲ実行します。指定できる定数は次の通りです。

mso

mso

mso

 

選択されたファイルのフルパスは、SelectedItemsコレクションに格納されます。

 

7.【フォルダの選択】ダイアログボックスを開く2

Widowsや他のアプリケーションで見かけるようなフォルダの選択ダイアログボックスを表示するには、Windows Scripting Host(WSH)のBrowseForFolderメソッドを利用します。4番目の引数に指定したC:\はフォルダを選択するツリーの最上位に表示されるフォルダです。

 

8.PCの電源を切る

ExcelVBAにはPCの電源を管理する命令がありませんが、Windows Scripting Host(WSH)を使えば実現可能です。ShutdownWindowsメソッドを実行すると、終了の方法を選択するWindowsダイアログボックスが開きます。

 

9.コントールパネルの機能を呼び出す

Windowsのコントロールパネルで提供される機能は、VBAから直接呼び出すことができません。しかし、Windows Scripting Host(WSH)の機能を使えば可能です。nusrmgr.cplは、ユーザーアカウントの画面を表します。

 

10.すべて最小化する

VBAでは、WindowsオブジェクトのArrangeプロパティで、Excel上に開いているブックをすべて最小化することができます。Windows Scripiting Host(WSH)を利用すると、Excelだけでなく、Windows上でどういjに起動しているアプリケーションをすべて最小化することも可能です。

 

11.拡張子関連づけで起動する

エクスプローラなどで、データファイルのアイコンをダブルクリックすると、そのファイルが関連付けられているアプリケーションが起動します。そのように、任意のファイルが関連付けられているアプリケーションを起動するには、Windows Scripiting Host(WSH)のRunメソッドを利用します。

 

12.自動的に閉じるMsgBox

ExcelVBAのMsgBoxは、ユーザーがボタンを操作しない限りずっと画面に表示されています。そうではなく、指定した時間だけ表示して、ユーザーが操作しなくても自動的に閉じるようなMsgBoxは、Windows Scripiting Host(WSH)を利用すると実現可能です。

 

13.他のアプリを起動する

VBAから他のアプリケーションを起動するには、Shell関数を使います。Shell関数の第一引数には、起動したいアプリケーションを指定します。アプリケーションの保存されているパスがWindowsに登録されている場合には、サンプルのようにファイル名だけを指定できますが、そうでない時はフルパスで指定します。2番目の引数には、次の定数を指定できます。

vb

vb

vb

vb

 

14.ミリ秒単位の時間を計測する

VBAのNow関数やTime関数で現在の時刻を取得できます。何かの処理を始める前に、現在の時刻を記録しておき、処理が終わった時刻との差を求めることで、その処理に要した時間を計測できます。ただし、Now関数やTime関数は秒単位での時間でしか取得できません。秒よりも短い時間を計測したいときは、WindowsAPIを使います。GetTickCountはWindowsが起動してからの経過時間をミリ秒単位で返します。

 

15.環境変数のパスを取得する

環境変数に登録されている情報は、VBAのEnbiron関数で取得できます。環境変数のPathにパスを登録しておくと、ファイルの場所(パス)を指定しないで実行形式のファイルを起動しようとしたとき、登録されている場所(パス)に存在するものとみなされます。

 

16.ログインユーザー名を取得する

現在稼働しているWindowsにログインしているユーザー名は、環境変数のUSERNAMEで取得できます。

 

17.PCの名前を取得する

PCの名前は、環境変数のUSERDOMAINで取得できます。

 

18.CPUの名称を取得する

CPUの名称は、環境変数のPROCESSOR_IDENTIFIERで取得できます。

 

19.ExcelからWordを制御する

OLEオートメーションを使うと、ExcelVBAから他のアプリケーションを制御できます。サンプルは、Wordを起動して新規文書を挿入し、Wordを制御という文字列を書き込んだ後で、文書に名前を付けて保存しています。最後にWord自体も終了します。.visible = Trueとすることで起動したWordをディスプレイに表示していますが、.visible = Trueをしなければ、Wordはディスプレイに表示されません。

 

20.ステータスバーにメッセージを表示する

画面の最下行にあるステータスバーに文字列を表示するには、ApplicationオブジェクトのStatusBarプロパティに、表示したい文字列を指定します。ステータスバーは、本来Excelからの情報が表示される場所です。マクロからそこを一時的に借りるので、私用が終わったらExcelに返します。それがサンプルの6行目のStatusBar =Falseです。これを忘れるとExcelからの情報がステータスバーに表示されなくなります。

 

21.サウンドを再生する1

VBAには、拡張子wavなどのサウンドフィルを再生する機能がありません。それでも何とかしてサウンドを再生したいのであれば、Windows標準ツールのメディアプレーヤーを使います。サンプルでは、メディアプレーヤーやサンドファイルをフルパスで指定しています。この設定は、使用環境に合わせてください。

 

22.サウンドを再生する2

 

23.再計算を手動にする

ワークシートに大量の計算式が挿入されいているときなど、マクロでセルを書き替える前に、Excelの再計算を手動にすると、マクロの実行速度が向上します。Excelの再計算を手動にするには、ApplicationオブジェクトのCalculationプロパティに定数xlCalculationManualを設定します。

 

24.特定のセルだけ再計算させる

再計算の方法が手動になっているとき、再計算を行うには3つの方法があります。

 

Application.calculateはApplicationを省略して、Calculateとだけ書くこともできます。

 

 

25.Excelの読み上げ機能を使う

Excelには、データを読み上げる機能が2つあります。1つは、RangeオブジェクトのSpeakメソッドです。これはセル内に入力されているデータを読み上げます。もう一つはSpeeçhオブジェクトのSpeakメソッドです。こちらは引数で指定した任意の文字列を読み上げます。

 

26.指定した時刻にマクロを実行する

ApplicationオブジェクトのOnTimeメソッドは、指定した時間に指定したプロシージャを実行するようにする機能です。OnTimeメソッドの書式は次の通りです。

 

指定した時間が来た時、他のマクロが起動中の場合は、引数LateestTimeに指定した時間だけ待ちます。引数ScheduleにFalseを指定すると、スケジュールを取り消します。

 

27.Excelの組み込みダイアログを使う

PrintOutメソッドを使うと、ワークシートを印刷することができます。しかし、印刷するつど印刷ページ数や用紙の向きなどを指定できるようにするには、どうしたらいいでしょう。そんあときはExcelの標準機能である印刷ダイアログボックスを開いて、ユーザーに制御を渡します。Excelが標準で持っている組み込みダイアログボックスを使うには、Dialogsコレクションにダイアログボックスを表す定数xlDialogPringを指定して、Showメソッドを実行します。サンプルは印刷部数=3を設定して、ダイアログボックスを呼び出しています。印刷ダイアログボックスでは、次の引数を使用できます。

 

28.枠線の表示・非表示を切り替える

ワークシートの枠線は、ApplicationオブジェクトのDisplayGridlinesプロパティで操作します。Trueを設定すると表示され、Falseを設定すると非表示になります。サンプルは実行するたびにTrueとFalseを切り替えます。

 

29.入力後の移動方向を設定する

セルに情報を入力してEnterキーを押すと、アクティブセルが下のセルに移動します。この移動する方向はApplicationオブジェクトのMoveAfterReturnDirectionプロパティで設定可能です。サンプルを実行すると移動する方向が上→左→右→下と変わります。

 

 

30.イミディエイトウィンドウを開く

イミディエイトウィンドウに出力するには、DebugオブジェクトのPrintメソッドを使います。そのイミディエイトウィンドウをVBAのコードで表示するには、VBEオブジェクトを使って、イミディエイトウィンドウのWindowオブジェクトにVisilble=Trueを設定します。

 

31..Net Frameworkを使う

.Net Frameworkで提供されるクラスの中には、VBAから利用できるものもあります。サンプルは、.Net Framework「System.Collections名前空間のArrayListを利用して、配列を並び替えています。サンプルのマクロを実行するには、.Net Frameworkが正常にインストールされている必要があります。

 

32.CPUの使用率を抑える

処理に多大な時間がかかるマクロでは、マクロが終了するまで、CPUの使用率が100%近くに上昇してしまうことがあります。CPUの使用率を下げ、他の作業を行えるようにするには、Windows APIのSleepを使います。Sleepはミリ秒単位で処理を中断する働きがあります。サンプルでは、毎回0.001秒だけ処理を中断します。計算上は、その分だけマクロの処理時間も伸びますが、その間に別の作業を行えるので、結果的には時間短縮になります。

 

33.マクロにショートカットキーを設定する

 

34.Windowsのバージョンを取得する

VBAにはWindowsのバージョンを調べる機能がありません。Windowsのバージョンを調べるには、WindowsManagement Instrumentation(WMI)という機能を使います。

 

35.Excelのバーションを取得する

Excelのバージョンは、ApplicationオブジェクトのVersionプロパティで調べられます。Versionプロパティは次の値を文字列で返します。

 

 

36.コマンドプロンプトの標準出力を取得する

コマンドプロンプトの標準出力をVBAで利用するには、Windows Scripiting Host(WSH)を使います。サンプルは、C:\Tmpフォルダのファイル一覧をMS-DOSのDirを使って取得しています。

 

37.画面をキャプチャする

Windowsでは、PrintScrnキーを押すと、画面をキャプチャできます。VBAからPrintScrnキーを押したことにすればマクロで画面のキャプチャが可能です。しかし、キーが押されたことにするSendKeysステートメントやSendKeysメソッドではうまくいきません。そんな時は、WindowsAPIのkeybd_eventを使います。サンプルは、マクロを実行後5秒後にPrintScrnキーが押されたことにします。継ぐいてキャプチャした画像をアクティブシートに貼り付けます。マクロはVBEから実行してはいけません。必ずワークシート画面でマクロダイヤログボックスなどから実行してください。

38.標準モジュールが含まれているかどうか調べる

VBAからVBEを操作するときは、VisualBasicプロジェクトへのアクセスを信頼するチェックボックスをオンにしてください。このチェックボックスは、Excel2003まではツール→マクロ→セキュリティで表示されるセキュリティダイアログボックスの信頼のおける発行元タブにあります。Excel2007以降は、セキュリティセンターダイアログボックスのマクロの設定にあります。サンプルは、現在開いているブックで標準モジュールが存在するブックを表示します。

 

39.モジュールを他のブックにコピーする

Book1.xlsmの標準モジュール(Module1)をBook2.xlsmにコピーします。ここでは、モジュールのエクスポートとインポートを使いましょう。2つのブックを開いた状態で実行してください。Vook2.xlsmにすでにModule1が存在する場合は、Module11といおう名前でインポートされます。

 

40.モジュールを開放する

モジュールを削除するときは、プロジェクトエクスプローラからModuleの開放を実行します。サンプルでは、Book2.xlsmのModule2を開放します。

 

41.プロシージャの一覧を取得する

モジュールの中に記述されているプロシージャの一覧を一発で取得するプロパティなどはありません。コードペイン(CodeModuleオブジェクト)を先頭行から1行ずつチェックして、それぞれの行が属しているプロシージャ名を取得します。

 

42.プロシージャのコードを取得する

ProcBodyLineプロパティは、指定したプロシージャの先頭行を返します。ProcCountLinesプロパティは、指定したプロシージャの行数を返します。Linesプロパティは、指定した行から、指定した行数のコードを返します。サンプルはプロシージャsample4のコードを画面に表示します。

 

43.プロシージャを削除する

コードペイン(モジュール)に記述されているコードの一部を削除するには、DeleteLinesメソッドを使います。DeleteLinesメソッドには、削除開始行と削除する行数を指定します。

 

44.コードの一部を置換する

コードの指定した行を置換するには、ReplaceLineメソッドを使います。引数には、行位置と置換後の新しい文字列を指定します。

 

45.モジュールに文字列を挿入する

CodeModuleオブジェクトのAddFromStringメソッドは、指定した文字列をコードペインに挿入します。挿入する場所は、最も上にあるプロシージャの上です。

 

46.モジュールにテキストファイルを挿入する

CodeModuleオブジェクトのAddFromFileメソッドは、指定したテキストファイルをコードペインに挿入します。挿入する場所は最も上にあるプロシージャの上です。

 

47.クリップボードが空かどうか調べる

クリップボードにどんな形式のデータが格納されているかは、ApplicationオブジェクトのClipboardDormatsプロパティで分かります。ClipboardFormatsプロパティは、クリップボードに格納されているデータを、数値の配列形式で返します。クリップボードが空のときは、配列の先0ではなく1にTrueが格納されます。

 

48.クリップボードの形式を調べる

クリップボードには、1つのデータが、複数の形式で格納されることがあります。どんな形式のデータが格納されているかは、ClipboardFormatsプロパティが返す配列を定数と比較します。定数xlCliboardFormatBitmapは、ビットマップ形式の画像データです。

 

49.クリップボードを直接操作する

クリップボードを直右折操作するには、DataObjectオブジェクトを使います。DataObjectオブジェクトは、MsFormsのメンバなので、私用するには、MicrosoftForms2.0Object Livraryを参照設定するかUserFormを挿入します。SetTextメソッドは、指定したテキストをDataObjectオブジェクトにコピーします。PutInClipboardメソッドはDataObjectオブジェクトのデータをクリップボードに格納します。GetFromClipboardメソッドは、クリップボードのデータをDataObjectオブジェクトにコピーします。GetTextメソッドは、DataObjectオブジェクトからテキストを取り出します。

 

50.インターネットのページを表示する

Excelには、インターネットのデータを直接ワークシートに取り込むWebクエリ機能があります。しかし、データ→外部データの取り込み→新しいWebクエリの操作をマクロ記録しても、QueryTableオブジェクトが追加される様子が記録されるだけで、新しいWebクエリダイアログボックスを開くという操作は記録されません。こんな時はDialogsコレクションの出番です。新しいWebクエリダイアログボックスを開く定数はxlDialogNewWebQueryです。サンプルは、新しいWebクエリダイアログボックスでインターネットのページを開きます。

 

51.ハイパーリンクを設定してインターネットのページを表示する

ブラウザを起動して指定したページを表示する方法はいくつかあります。まずExcelのハイパーリンクを使う方法です。セルA1にハイパーリンクを設定して、すぐリンク先を開きます。ブラウザが起動し、設定したページが表示されます。その後セルA1はクリアしておきましょう。

52.拡張子に関連づけてインターネットのページを表示する

インターネットで開きたいページの拡張子がhtmやhtmlの場合、拡張子関連づけでひらくことができます。拡張子htmやhtmlのファイルをダブルクリックすると、ブラウザが起動して、ページが読み込まれます。これと同じ動作です。拡張子関連付けで実行するには、Windows Scripiting Host(WSH)のRunメソッドを使います。

 

53.IEでインターネットのページを表示する1

もしInternet ExplorerがインストールされていたらIEを起動してページを開くことも可能です。IEの実体ファイル(IEPLORER.EXEにはパスが通っていないのでIEではなくWindowsのエクスプローラにURLを渡して起動します。するとエクスプローラは自動的にIEを起動してくれます。

 

54.IEでインターネットのページを表示する2

OLEオートメーションを使って、IEのインスタンスを生成します。この方法なら、VBAからIEを自在に制御できるので、より細かい作業が可能です。

 

55.ページのテキストを取得する

OLEオートメーションで起動したIEは、InnerTextプロパティでページに表示されている文字列を取得できます。ただし、InnerTextプロパティを取得できるのは、ページを全体に読み終えた後なので、IEが読み込み中は処理を待ちます。

 

56.ページのHTMLを取得する

OLEオートメーションで起動したIEは、InnerHtmlプロパティで、ページのHTMLを取得できます。

 

57.ページにデータを書き込む

IEで表示されている入力ボックスやドロップダウンリストなどもVBAから操作が可能です。サンプルでは、検索の種類で本・雑誌を選択し、検索ボックスにExcelVBAと入力しています。最後に検索ボタンをクリックして、検索ページを表示しています。こうしたコントロールの操作は、ページごとに解析が必要です。またHTMLの知識やDOMの知識も要求されます。

コメントを残す

メールアドレスが公開されることはありません。