パスをシートに書いて手間を減らす

特定のパス上にあるファイルを読み込むとき、或いはそこに保存する時のお話。

昔はよく、標準モジュールにこう書いていた。

Const FolderPath As String = "C:\Temp"

これでも全然構わないのだが、一つ大きな難点がある。
それは、このマクロを自分以外の人が使う場合であって、且つ、このFolderPathが変更になった際に、必ず私に修正依頼が掛かる点だ。

「ファイルの保管場所を変えたら、マクロを動かなくなった」

よく聞く話だ。人によっては、VBEを開いて修正が出来ない方も居られる。

ということで最近はパスをシートに記載し、VBAに詳しくない方でも問題なく
独力でメンテナンスできるよう心がけている。こんな感じだ。
f:id:Infoment:20200603223824p:plain

行列の挿入にも耐えらるよう、セルに名前をつけておく場合も多い。
f:id:Infoment:20200603224015p:plain

すると、このようになる。パスの管理をシート側に委ねたため、VBAを知らなくてもパスの変更が可能だ。

Sub Hoge()
    Dim FolderPath As String
        FolderPath = Sheet1.Range("保存先")
End Sub

複数のプロシージャでこのパスを利用する場合、シートモジュールでプロパティとして値を取得する方法も有る。

Public Property Get FolderPath() As String
    FolderPath = Me.Range("保存先")
End Property

すると、標準モジュール側がスッキリするし、複数個所からの再利用が可能になる。
f:id:Infoment:20200603224614p:plain

意図せず、パスの指定を間違えることもあるだろう。その場合は、取り敢えずの
パスに切り替えることも可能だ。

Public Property Get FolderPath() As String
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
        FolderPath = Me.Range("保存先")
        
        ' FolderPathに格納したパスが存在しない場合、
        ' このマクロブックが保存されているパスに置き換える。
        If FSO.FolderExists(FolderPath) = False Then
            FolderPath = ThisWorkbook.Path
        End If
End Property

他にも「False」を返すなど、方法は幾つもあると思われ。

いずれの処理とするかは、各自の時と場合とお好みで。

参考まで。