ChDirステートメントでカレントフォルダを簡単に変更する

vbachdireyecatch

エクセルVBAのコードの途中で、カレントフォルダを変更しなければならないことがよくあります。

そしてそれを簡単に変更できるものがChDirステートメントです。

ChDirの実際に則した使い方を説明します。

エクセルVBAのステートメントで「ChDir(チェインジディレクトリ)」というのがあります。

少々地味感のあるステートメントですが、この使い方のポイントを説明いたします。

こんにちは、じゅんぱ店長(@junpa33)です。

カレントフォルダを簡単に変更できるChDir

vbachdirsetumeip008

ChDirステートメントはカレントフォルダを変更したいときに使います。

カレントフォルダというのは、今作業しているアクティブなフォルダのことです。

ChDirステートメントの記述方法は

記述方法は

ChDir (Path)

極々簡単な記述方法です。

今回のChDirのサンプル

想定するサンプルは、

VBAコードの記述しているエクセルBOOKのデータの保存について、

新しくエクセルBOOKを作成し、名前を付けて別の保存フォルダで保存します。

保存終了後に再度そのエクセルBOOKを開き、シート名とセルにデータを書き込みます。

普通のエクセル作業の通り、エクセルVBAがあるBOOKの保存フォルダを開いて、エクセルBOOKを起動します。

vbachdirsetumei002kai
矢印下001
vbachdirsetumei003kai
矢印下001
vbachdirsetumei001

ChDirを使うための周辺知識

このエクセルVBAコードが記述されているエクセルBOOKのフルパスを取得する方法はこの通りです。

'このBOOKの絶対パスを代入
        aPath = ThisWorkbook.Path

よくご存じの方も多いと思います。

今回のサンプルの設定では、

「VBAChDir」フォルダの1つ下の階層に「ChDirサンプル」(このエクセルVBAのBOOK)と「ファイル移動先」のフォルダが設定されています。

VBAで作成する保存ファイルは「ファイル移動先」内に保存されます。

「ファイル移動先」のフルパスを入手するためには、一旦「VBAChDirフォルダ」のパスを取得する必要があります。

'この絶対パスで一つ上のフォルダパスまでの表示文字数
        aPCo = InStrRev(aPath, "\")
'データの移送先フォルダの絶対パスを代入
        bPath = Left(aPath, aPCo) & "ファイル移動先\"

この様にするとお隣のフォルダパスを取得することが出来ます。

参考記事

  • InStrRev関数の使い方についてはこちらを参考にしてください。
vbainsteeyecatch Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力
  • Left関数についてはこちらを参考にしてください。
vbaleneyecatch Len関数・LenB関数で文字列の文字数を調べる
  • MId関数についてはこちらを参考にしてください。
vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す

ChDirを使わない時のコード記述のエラー

この様なサンプルのシチュエーションの時に ” スルッと見逃してしまいそうになるミス ” があります。

特に、エクセルVBAコードの組み立て作業中で、フォルダディレクトリが「あっちへ行ったりこっちに来たり」している時は、その条件によってはエラーを見逃してしまうこともあります。

そして、完成後いざ使ってみた時にエラーストップしてしまうのです。

エラーが発生するコード

「そのファイルディレクトリには、そのファイルが無い」ことでエラーになります。

一見問題なさそうですが・・・

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を再度開くところで、「ファイルが見つかりません。」とエラーになりました。

デバッグしてみると、一旦閉じてすぐに開こうとしているにもかかわらず、エラーが出ているのが分かります。

vbachdirsetumei004

ChDirを使った正しいコード記述

ChDirを使って解決する

Chdirを記述すればエラー解消します。

VBA
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をフルパスで記述しても当然いい訳ですが、これの方が遥かに簡単にエラーを防ぐことが出来ます。

vbachdirsetumei006_1
矢印下001
vbachdirsetumei007kai

カレントフォルダを簡単に変更できるChDirのまとめ

vbachdirsetumeip009

エクセルVBAを使ってコードを組み立てて行く中で、必要ファイルをフォルダ間を行き来させる操作も多くあると思います。

違うフォルダ間を跨ぐ場合はChDirを使ってコード組み立てを行うといいと思います。

今あるディレクトリの場所も明示的に分かりますし、コード組み立ても簡単だと思います。

参考記事

  • ディレクトリ指定の記事には、「ルートからエクセルファイルの存在位置まで全階層を一度に変数化する」方法について書いた記事も参考にできます。
vbaabspatheyecatch 絶対パスの全階層のパスを変数化できるVBA
  • 祖対パスと絶対パス
vbabookspecifyeye ブックを指定する絶対パスと相対パス記述のコツ

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min