質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2288閲覧

VBAのDir関数でファイル一覧が取得できない

mzn59

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/06/06 05:42

発生している問題
Dir関数でファイル一覧が取得できない。

前提
ディレクトリ構成は以下の通りです。
下記ディレクトリ構成において、
・「040」は、ファイル一覧取得対象のディレクトリ
・「aaa.xlsm、bbb.xlsm、ccc.xlsm、ddd.xlsm」はファイル一覧取得対象のファイル
となっています。

├── 040 │ ├── aaa.xlsm │ ├── bbb.xlsm │ └── ccc.xlsm │ └── ddd.xlsm

コードは以下の通りです。

Option Explicit Sub sub1() Dim wbS, wbD As Workbook Dim ws As Worksheet Dim strPath As String Dim strFile As String Dim iStartRow As Integer Set wbD = ThisWorkbook strPath = ThisWorkbook.Path & "\040" If Dir(strPath, vbDirectory) = "" Then Exit Sub End If strFile = Dir(strPath & "*.xls*") iStartRow = 2 Do While strFile <> "" Err.Clear Set wbS = Workbooks.Open(strPath & "\" & strFile) On Error Resume Next Set ws = wbS.Worksheets("名簿") If Err Then wbS.Saved = True wbS.Close GoTo Continue End If On Error GoTo 0 With ws.Range("A1").CurrentRegion.Offset(1).Resize(ws.Range("A1").CurrentRegion.Rows.Count - 1) .Copy Destination:=wbD.Worksheets("名簿").Range("A" & iStartRow) iStartRow = iStartRow + .Rows.Count End With wbS.Saved = True wbS.Close strFile = Dir() Continue: Loop End Sub

期待結果
Do While~Loop処理の中で、Dir関数を引数なしで実行し、対象ディレクトリ配下のファイルが取得されること。

実行結果
上記コードをデバックして確認したところ、「strFile = Dir()」のところで、実行時エラー「プロシージャの呼び出し、または引数が不正です。」となります。

補足情報(FW/ツールのバージョンなど)
OS: Windows10
Microsoft Visual Basic for Applications 7.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/06/06 06:06

回答ではないですが、 Dim wbS, wbD As Workbook だと、wb5はWorkbook型じゃなくてVariant型です。もちろんそれでもいいのですが。
mzn59

2021/06/06 06:16

ご指摘ありがとうございました。 Workbook型として宣言する場合、下記のように宣言する必要があるということでしょうか。 Dim wbS As Workbook Dim wbD As Workbook
itagagaki

2021/06/06 06:18

コードをコピペして実行してみましたがエラーは出ませんでした。 Windows 10 Pro 20H2 / Microsoft Excel 2013
otn

2021/06/06 06:46

それでもいいし、 Dim wbS As Workbook, wbD As Workbook でもいいです。
mzn59

2021/06/06 07:05

>コードをコピペして実行してみましたがエラーは出ませんでした。 ご確認いただき、ありがとうございました。 こちらの環境は Windows 10 Pro / Microsoft Excel 2016 ですが、 環境によってDir関数の挙動に違いがあるのでしょうか。こちらでももう少し確認してみます。
mzn59

2021/06/06 07:06

>それでもいいし、 Dim wbS As Workbook, wbD As Workbook でもいいです。 承知いたしました。ご教授いただき、ありがとうございました。
otn

2021/06/06 07:49

ループの中を strFile = Dir() の1行だけにして、再現しなければ、すこしずつ行を戻していって調べる。
mzn59

2021/06/06 08:54

実は下記のようなコードで、ループの外で引数なしのDir関数を実行して確認していたのですが、同様に「strFile = Dir()」のところで実行時エラー「プロシージャの呼び出し、または引数が不正です。」となっていました。 ~(略)~ strFile = Dir(strPath & "\*.xls*") iStartRow = 2 strFile = Dir() Do While strFile <> "" ~(略)~
guest

回答1

0

ベストアンサー

同じような症状が発生していた人のブログがありました。
今回のソースコードも該当しているように見えます。

Dir関数が「プロシージャの呼び出し、または引数が不正です。」エラーを出す。

はてなブログ 和風スパゲティのレシピ:Dirループ中は別関数であっても他のDirは使えない

根本対策は Dir関数ではなく、FileSystemObject を利用するコードに書き換えること。
らしいですね。

投稿2021/06/16 19:16

Yoshi88

総合スコア623

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mzn59

2021/06/19 03:09

ご教示いただき、ありがとうございました。 Dir関数には色々と落とし穴があるようですね。 当該コードでエラーがない旨のご連絡をいただいていることもあり、ご教示いただいた内容も含めて再度確認してみようと思います。 ご回答いただいた皆様、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問