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

vbachdireyecatch

エクセルVBAのコード組み立てで、カレントフォルダを変更する必要がある場合があります。

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

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

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

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

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

「関数リファレンス」を調べる

エクセルVBA カレントフォルダを
簡単に変更できるChDirの使い方

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

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

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

記述方法は

ChDir (Path)

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

今回のChDirのサンプル

想定するサンプルは、

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

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

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

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

vbachdirsetumei002
vbachdirsetumei003
vbachdirsetumei001

ChDirを使うための周辺知識

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

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

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

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

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

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

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

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

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

MEMO

InStrRev関数の使い方についてはこちらを参考にしてください。

vbainsteeyecatch Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力

Left関数についてはこちらを参考にしてください。

vbaleneyecatch Len関数・LenB関数で文字列の文字数を知る方法。使用例で解説します

Left関数についてはこちらを参考にしてください。

vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出します

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

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

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

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

エラーコード

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

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

コード
Sub ChDirテスト1()

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

Workbooks.Open Filename:=vala & ".xlsx"

Worksheets("Sheet1").Name = valb
Range("C5").Value = valc

End Sub

実行結果

新規作成で名前を付けて一度保存終了したエクセルBOOKを再度開くところで、「ファイルが見つかりません。」とエラーになりました。

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

vbachdirsetumei004
vbachdirsetumei005

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

ChDirを使ったOKコード

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

vbachdirsetumei006_1

vbachdirsetumei007

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

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

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

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

参考記事
ディレクトリ指定の記事には、

ルートからエクセルファイルの存在位置まで全階層を一度に変数化する」方法について書いた記事も参考にできます。

vbaabspatheyecatch 絶対パスの全階層のパスを変数化できるVBA

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

このサイトでよく使うVBAのコードのトピックを纏めています。

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

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

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