エクセルVBAのコードの途中で、カレントフォルダを変更しなければならないことがよくあります。
そしてそれを簡単に変更できるものがChDirステートメントです。
ChDirの実際に則した使い方を説明します。
エクセルVBAのステートメントで「ChDir(チェインジディレクトリ)」というのがあります。
少々地味感のあるステートメントですが、この使い方のポイントを説明いたします。
こんにちは、じゅんぱ店長(@junpa33)です。
- ファイルとフォルダ
コンテンツ
カレントフォルダを簡単に変更できるChDir
ChDirステートメントはカレントフォルダを変更したいときに使います。
カレントフォルダというのは、今作業しているアクティブなフォルダのことです。
ChDirステートメントの記述方法は
記述方法は
ChDir (Path)
極々簡単な記述方法です。
今回のChDirのサンプル
想定するサンプルは、
VBAコードの記述しているエクセルBOOKのデータの保存について、
新しくエクセルBOOKを作成し、名前を付けて別の保存フォルダで保存します。
保存終了後に再度そのエクセルBOOKを開き、シート名とセルにデータを書き込みます。
普通のエクセル作業の通り、エクセルVBAがあるBOOKの保存フォルダを開いて、エクセルBOOKを起動します。
ChDirを使うための周辺知識
このエクセルVBAコードが記述されているエクセルBOOKのフルパスを取得する方法はこの通りです。
'このBOOKの絶対パスを代入
aPath = ThisWorkbook.Path
よくご存じの方も多いと思います。
今回のサンプルの設定では、
「VBAChDir」フォルダの1つ下の階層に「ChDirサンプル」(このエクセルVBAのBOOK)と「ファイル移動先」のフォルダが設定されています。
VBAで作成する保存ファイルは「ファイル移動先」内に保存されます。
「ファイル移動先」のフルパスを入手するためには、一旦「VBAChDirフォルダ」のパスを取得する必要があります。
'この絶対パスで一つ上のフォルダパスまでの表示文字数
aPCo = InStrRev(aPath, "\")
'データの移送先フォルダの絶対パスを代入
bPath = Left(aPath, aPCo) & "ファイル移動先\"
この様にするとお隣のフォルダパスを取得することが出来ます。
- InStrRev関数の使い方についてはこちらを参考にしてください。
- Left関数についてはこちらを参考にしてください。
- MId関数についてはこちらを参考にしてください。
ChDirを使わない時のコード記述のエラー
この様なサンプルのシチュエーションの時に ” スルッと見逃してしまいそうになるミス ” があります。
特に、エクセルVBAコードの組み立て作業中で、フォルダディレクトリが「あっちへ行ったりこっちに来たり」している時は、その条件によってはエラーを見逃してしまうこともあります。
そして、完成後いざ使ってみた時にエラーストップしてしまうのです。
「そのファイルディレクトリには、そのファイルが無い」ことでエラーになります。
一見問題なさそうですが・・・
Option Explicit
Sub ChDirテスト1()
Dim vala, valb, valc
Dim aPath, bPath As String
Dim aPCo As Long
Workbooks("VBAChDir説明.xlsm").Activate
Worksheets("Sheet1").Select
vala = Range("A1").Value
valb = Range("A3").Value
valc = Range("A5").Value
'このBOOKの絶対パスを代入
aPath = ThisWorkbook.Path
'この絶対パスで一つ上のフォルダパスまでの表示文字数
aPCo = InStrRev(aPath, "\")
'データの移送先フォルダの絶対パスを代入
bPath = Left(aPath, aPCo) & "ファイル移動先\"
'新しいWorkbookを作成します
Workbooks.Add
'作成したWorkbookを名前を付けて、移動先フォルダに保存します
ActiveWorkbook.SaveAs Filename:=bPath & vala & ".xlsx"
'このWorkbookを上書き保存します
ActiveWorkbook.Close savechanges:=True
Workbooks.Open Filename:=vala & ".xlsx"
Worksheets("Sheet1").Name = valb
Range("C5").Value = valc
End Sub
新規作成で名前を付けて一度保存終了したエクセルBOOKを再度開くところで、「ファイルが見つかりません。」とエラーになりました。
デバッグしてみると、一旦閉じてすぐに開こうとしているにもかかわらず、エラーが出ているのが分かります。
ChDirを使った正しいコード記述
Chdirを記述すればエラー解消します。
Sub ChDirテスト2()
Dim vala, valb, valc
Dim aPath As String, bPath As String
Dim aPCo As Long
Workbooks("VBAChDir説明.xlsm").Activate
Worksheets("Sheet1").Select
vala = Range("A1").Value
valb = Range("A3").Value
valc = Range("A5").Value
'このBOOKの絶対パスを代入
aPath = ThisWorkbook.Path
'この絶対パスで一つ上のホルダパスまでの表示文字数
aPCo = InStrRev(aPath, "\")
'データの移送先フォルダの絶対パスを代入
bPath = Left(aPath, aPCo) & "ファイル移動先\"
'新しいWorkbookを作成します
Workbooks.Add
'作成したWorkbookを名前を付けて、移動先フォルダに保存します
ActiveWorkbook.SaveAs Filename:=bPath & vala & ".xlsx"
'このWorkbookを上書き保存します
ActiveWorkbook.Close savechanges:=True
'カレントディレクトリを移動します
ChDir bPath
Workbooks.Open Filename:=vala & ".xlsx"
Worksheets("Sheet1").Name = valb
Range("C5").Value = valc
End Sub
正常に完了しました。
「 ChDir bPath 」をエクセルBOOKを開くコードの前行に記述するだけです。
もちろんエクセルBOOKをフルパスで記述しても当然いい訳ですが、これの方が遥かに簡単にエラーを防ぐことが出来ます。
カレントフォルダを簡単に変更できるChDirのまとめ
エクセルVBAを使ってコードを組み立てて行く中で、必要ファイルをフォルダ間を行き来させる操作も多くあると思います。
違うフォルダ間を跨ぐ場合はChDirを使ってコード組み立てを行うといいと思います。
今あるディレクトリの場所も明示的に分かりますし、コード組み立ても簡単だと思います。
- ディレクトリ指定の記事には、「ルートからエクセルファイルの存在位置まで全階層を一度に変数化する」方法について書いた記事も参考にできます。
- 祖対パスと絶対パス
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。