第5回 直感！スグに使える業務向けVBA汎用プロシージャ(ファイル・フォルダ操作)

第0回で配布しました汎用プロシージャのコードの紹介と簡単な解説をやっていきたいと思います！
以下のリンクから .bas ファイルをダウンロードできます（zipファイル）

https://drive.google.com/file/d/11qEUTsq87UItzoKu2okX5WgEopRercCb/view?usp=drive_link

今回ご紹介するプロシージャは
| プロシージャ名		| 概要						|
|-------------------------------|-----------------------------------------------|
| OpenFolder | フォルダを開く(cmd経由)		|
| OpenFile   | ファイルを開く(cmd経由)		|

になります。VBA始めたてだった頃に「え、Excelから他のファイル開けるの？！」って驚きましたね(笑)
そしてVBAで他のファイルやフォルダを開く方法はいくつか存在し調べてみると結構まどろっこしかったりします。

今回はコマンドプロンプト(cmd)を経由するという方法を採りました。この方法のメリットとしては動作が軽いこととファイルであれば既定のアプリで開くことができるという点が挙げられます、その汎用性の高さから採用しました。

他にもExcelファイルであれば
~~~
Workbooks.Open "Excelファイルのフルパス"
~~~
でしたり、
~~~
ShellExecute 0, "open", "フルパス"
CreateObject("Shell.Application").Open ("フルパス")
~~~
などがあります。詳細は「VBA ファイル フォルダ 開き方」などで検索してみてください！

## OpenFolder
~~~
Sub OpenFolder(folderPath As String)
'------------------------------------------------------------------------------------------------------------------------------
'　概要　　｜指定したフォルダを開く
'------------------------------------------------------------------------------------------------------------------------------
'　引数１　｜folderPath - フォルダの絶対パス(String型)
'　　　　　｜※非同期処理であることに注意
'------------------------------------------------------------------------------------------------------------------------------
'　実装　　｜Ver.1.0.0(2025/04/20:新規)
'------------------------------------------------------------------------------------------------------------------------------
    
    If folderPath = "" Then Exit Sub
    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "指定されたフォルダは存在しません。", vbExclamation
        Exit Sub
    End If
    
    'コマンドプロンプトを経由して開く
    shell "explorer.exe """ & folderPath & """", vbNormalFocus
    
End Sub
~~~
引数に開きたいフォルダのフルパスを指定して実行するとエクスプローラーが開いてくれます。例えばですがシート上にボタンを用意し、そこに指定フォルダを開くプロシージャを設定していただくとボタンクリックでエクスプローラーが開いてくれます。これを多数用意していただくことでExcelをウィジェットアプリのような使い方ができます。

昔Excel上でフォルダツリーを表示するアプリを作り、イベント処理(BeforeDoubleClick)と組み合わせてフォルダのパスが表示されているセルをダブルクリックすることでエクスプローラーを表示させておりました。

## OpenFile
~~~
Sub OpenFile(filePath As String)
'------------------------------------------------------------------------------------------------------------------------------
'　概要　　｜指定したファイルを開く
'------------------------------------------------------------------------------------------------------------------------------
'　引数１　｜filePath - ファイルの絶対パス(String型)
'　　　　　｜※非同期処理であることに注意
'------------------------------------------------------------------------------------------------------------------------------
'　実装　　｜Ver.1.0.0(2025/04/20:新規)
'------------------------------------------------------------------------------------------------------------------------------
    
    If filePath = "" Then Exit Sub
    If Dir(filePath) = "" Then
        MsgBox "指定されたファイルは存在しません。", vbExclamation
        Exit Sub
    End If
    
    'コマンドプロンプトを経由して開く
    shell "cmd /c start """" """ & filePath & """", vbHide
    
End Sub
~~~
OpenFolder同様、開きたいファイルのフルパス指定して実行することで任意のファイルをその既定のアプリで開くことができます。汎用性の高さが強みではありますが弱点もありまして、コマンドプロンプトを経由しExcelとは非同期で処理(コマンドプロンプトに命令を出した後、コマンドプロンプトがファイルを開く処理をしつつもExcelはVBAの処理を続ける)のため、.xlsxや.csvなどのファイルにおいてセルの内容を取得したい場合は処理が上手くいかない可能性が高いです。そういった場合は上で紹介しました**Workbooks.Open**を使ってください。

実は奥が深いファイル・フォルダ操作の世界、用途に合わせて適切な方法を使ってファイル操作マスターしてください！

## 直感！VBAシリーズ記事一覧
もしよろしければ他の記事もご覧ください！

https://qiita.com/Reko/items/3e482f9a73353e964f00

https://qiita.com/Reko/items/af042ae33cdc01e1dc96

https://qiita.com/Reko/items/9e211c9c496e12283f33

https://qiita.com/Reko/items/c2dab7b0e8207f8049df

https://qiita.com/Reko/items/b5abcdf614cef5d4073a

https://qiita.com/Reko/items/40c66556ac51a8006ea6

https://qiita.com/Reko/items/0269b2bece07a675e797

https://qiita.com/Reko/items/e2d0d0bf2dea4feface1

https://qiita.com/Reko/items/b995c3da88d25f6e0104

https://qiita.com/Reko/items/bc97d79599cfd431b2f3

https://qiita.com/Reko/items/1731aaddfc6e50c209df

https://qiita.com/Reko/items/554a47f2aa944e2eec5e

https://qiita.com/Reko/items/e8253ac68ccafba44ad3