はじめに
VBAで指定のフォルダーをエクスプローラーで開く方法についてご紹介いたします。
今回は、Shell関数 / CreateObject関数を使用した2つの方法を説明させていただきます。
Shell関数を使った方法
■ Microsoft Learn Challengeより引用
- 実行可能プログラムを実行し、成功した場合はプログラムのタスクIDを表すVariant(Double)の値を返し、失敗した場合は0を返します。
構文:Shell(Pathname [, Windowstyle])
指定項目 | 説明 |
---|---|
Pathname | 必須。ユーザーが指定したアプリケーションと開きたいフォルダーをフルパスで指定します。 |
Windowstyle | 省略可能。ウィンドウの表示形式を指定します。 |
Shell関数は、VBAで外部プログラムやコマンドを実行するための関数です。
この関数を使用することで、指定したプログラムやスクリプトを新しいプロセスとして起動できます。
指定のフォルダーを開く以外にもさまざまなことができます!
例えば、メモ帳を起動したり、電卓を起動したり・・・。
実際に処理を書いてみましょう
Function openFolderPath (Byval path As String)
Shell (“C:\Windows\Explorer.exe " & path, vbNormalFocus)
End Function
注意点
- 「“C:\Windows\Explorer.exe “」の最後の半角スペースは必須です。
忘れないように注意してください。
忘れると、”実行時エラー ’53’:ファイルが見つかりません。”が起こります。
もし、引数に存在しないフォルダーパスを渡すとマイドキュメントが起動します。
そのため、処理が止まってしまうということはありませんが、予期せぬフォルダーが開かれないようにDir関数を使用して事前にフォルダーの存在有無について確認をしてから実行するようにします!
■ Microsoft Learn Challengeより引用
- 指定したパターン、ファイル属性、またはドライブのボリューム ラベルに一致する、ファイル、ディレクトリ、フォルダーの名前を表す文字列を返します。
構文:Dir[(Pathname [, Attributes] )]
指定項目 | 説明 |
---|---|
Pathname | 省略可能。確認したいフォルダーをフルパスで指定します。指定したパスが見つからない場合は、長さ 0 の文字列 ("") が返されます。 |
Attributes | 省略可能。ファイル属性を指定します。 |
先ほど記載したコードに組み込んでみましょう!
Function openFolderPath (Byval path As String)
If Dir (path, vbDirectory) <> "" Then
Shell ("C:\Windows\Explorer.exe " & path, vbNormalFocus)
Else
MsgBox ( path & "が存在しません!")
End If
End Function
これで、指定のパスが存在する場合は、エクスプローラーでフォルダーが開き、指定のパスが存在しない場合は、メッセージボックスが表示されるようになりました!
CreateObject関数を使用する方法
■ Microsoft Learn Challengeより引用
- ActiveXオブジェクトへの参照を作成して返します。
構文:CreateObject(Class [, Servername])
指定項目 | 説明 |
---|---|
Class | 必須。作成するオブジェクトのアプリケーション名とクラス。 |
Servername | 省略可能。オブジェクトを作成するネットワーク サーバーの名前。 |
CreateObject関数は、プログラム内で特定のオブジェクトを作成するための関数です。
外部のアプリケーションやコンポーネントと連携する際に利用されます。
今回使用するオブジェクトは WScript.Shell オブジェクトです。
WScript.Shell オブジェクトは、Windows Script Host (WSH) の一部であり、スクリプトからWindowsのシェル機能にアクセスするためのオブジェクトです。
このオブジェクトを使用することにより、スクリプトからさまざまなシステム操作を実行することができます。
実際に処理を書いてみましょう
Function openFolderPath (Byval path As String)
Dim shell As Object: Set shell = CreateObject ("WScript.Shell")
shell.Run ("explorer.exe " & path)
End Function
もし、引数に存在しないフォルダーパスを渡すとWScript.ShellオブジェクトのRunメソッドがエラーを発生させます。
そのため、Shell関数の場合と同じく存在有無を確認してから処理を行うか、エラーハンドリングを行う必要があります。
エラーハンドリングとは、プログラムの実行中に発生するエラーを検出し、適切に処理することです。
これにより、プログラムが予期しない動作をするのを防ぎ、ユーザーに対して適切なフィードバックを提供することができます。
VBAでは、On Errorステートメントを使用してエラーハンドリングを設定します。
※ エラーハンドリングについては、別の記事で詳細を説明したいと思っています!
では、実際に上記のコードにエラーハンドリングを加えてみましょう。
Function openFolderPath (Byval path As String)
Dim shell As Object: Set shell = CreateObject ("WScript.Shell")
On Error GoTo ErrorHandler
shell.Run ("explorer.exe " & path) '※ハンドリングしたい処理
Exit Function
ErrorHandler:
MsgBox ("エラーが発生しました: " & Err.Description, vbCritical)
End Function
これで、指定のパスが存在する場合はエクスプローラーでフォルダーが開き、指定のパスが存在せずエラーが発生した場合は、メッセージボックスが表示されるようになりました!
メリットとデメリット
それぞれの関数にはメリットとデメリットがあります。
以下の図を参考にして、実現したい処理や目的に最も適した関数を選んでみてください!
Shell関数
メリット | 説明 |
---|---|
シンプルな構文 | コードがとてもシンプルで、単一のコマンドラインを実行するだけでフォルダーを開くことができます。 |
即時実行 | コマンドを即時に実行します。CreateObject関数はオブジェクトを作成して返すため、オブジェクトの作成に時間が掛かることがあります。 |
依存関係の少なさ | Shell関数は特定のオブジェクトやライブラリに依存しません。そのため、柔軟に使用することができます。 |
デメリット | 説明 |
---|---|
戻り値の取得が困難 | 実行したコマンドの戻り値を直接取得することができません。コマンドの実行結果やエラーメッセージを取得することが難しいです。 |
同期実行の制御が難しい | 非同期にコマンドを実行するため、コマンドの実行が完了するまで待機することが難しいです。 |
エラーハンドリングの制限 | コマンドの実行中に発生するエラーを直接キャッチすることができません。エラーが発生した場合の対処が難しくなります。 |
CreateObject関数
メリット | 説明 |
---|---|
詳細な制御 | 作成したオブジェクトを通じて、より詳細な操作が可能です。単にフォルダーを開くだけでなく、他のさまざまの操作(ファイルのコピー、削除、レジストリの操作など)も行うことができます。 |
オブジェクト指向プログラミング | オブジェクトのメソッドやプロパティを利用して、コードの再利用性や保守性を向上させることができます。 |
セキュリティの向上 | 特定のオブジェクトやメソッドに対してアクセス制御を行い、意図しない操作を行うことを防ぐことができます。 |
デメリット | 説明 |
---|---|
複雑なコード | オブジェクトの作成やメソッドの呼び出しなど、コードが複雑になりがちです。初心者にとっては理解しにくい場合があります。 |
パフォーマンスの低下 | オブジェクトの初期化やリソースの割り当てが必要となり、パフォーマンスの低下を招くことがあります。 |
互換性の問題 | 特定のCOMオブジェクトやライブラリのバージョンに依存することがあります。異なるバージョンのライブラリがインストールされている環境でスクリプトが正常に動作しないことがあります |
さいごに
今回は、VBAで指定のフォルダーをエクスプローラーで開く方法について、Shell関数とCreateObject関数の2つの方法をご紹介しました。
どちらの方法を選ぶにしても、事前にフォルダーの存在確認を行うことや、エラーハンドリングを適切に実装することがとっても重要です。
これにより、予期しない動作を防ぎ、ユーザーにわかりやすいメッセージを表示することができます。
今後もVBAを活用して、効率的な業務自動化を目指していきましょう。
この記事がみなさまの参考になれば幸いです。