🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

2回答

3699閲覧

二重ループでdir()をすると引数エラーが発生する

pegy

総合スコア245

VBA

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

0グッド

0クリップ

投稿2021/03/02 06:34

以下のようなコードを作成しており、コメントの二重ループのコードを加えるまではエラーがなく動作をしておりました。
そこでeachPathの中にdeepPathDo Whileによる二重ループが必要となり実行すると
eachPath = Dir()'ここですの箇所で以下のエラーが発生します。
実行エラー5 プロージャの呼び出しまたは引数が不正です
Dirの中で異なるDir()を実行してもそれ自体がエラーの原因となる認識はないのですが、どなたかご助言をいただけますでしょうか?

宜しくお願い申し上げます。

vba

1Sub getFolderStruct() 2Dim i As Long 3Dim YYYYMM As String 4Dim fileName As String 5Dim Dic As Object 6Dim buf As String 7Dim itemsdic As Variant 8Dim eachPath As String 9Dim deepPath As String 10Dim hypLink As Hyperlink 11Dim adr As String 12Dim deepAdr As String 13 14 15YYYYMM = Cells(6, 4).Value 16 17If YYYYMM = "" Then 18 MsgBox "YYYYMMに出力したいフォルダパスを入力してね~" & vbCrLf & "「処理を終了します」" 19 Exit Sub 20End If 21 22If Cells(4, 6).Value <> "" Then 23 MsgBox "DebugAreaをクリーンにしてください" & vbCrLf & "「処理を終了します」" 24 Exit Sub 25End If 26 27fileName = Dir(ThisWorkbook.Path & "\" & YYYYMM & "*", vbDirectory) 28 29 30Set Dic = CreateObject("Scripting.Dictionary") 31 32Do While fileName <> "" 33 If fileName <> "." And fileName <> ".." Then 34 Dic.Add fileName, fileName 35 End If 36 fileName = Dir() 37Loop 38 39i = 4 40 For Each itemsdic In Dic 41 42 eachPath = Dir(ThisWorkbook.Path & "\" & YYYYMM & "\" & itemsdic & "*", vbDirectory) 43 Do While eachPath <> "" 44 adr = ThisWorkbook.Path & "\" & YYYYMM & "\" & itemsdic & "\" & eachPath 45 46 If eachPath <> "." And eachPath <> ".." And GetAttr(adr) = 16 And eachPath = "ABC" Then 47 Cells(i, 6).Value = itemsdic 48 Set hypLink = ActiveSheet.Cells(i, 7).Hyperlinks.Add( _ 49 Anchor:=Cells(i, 7), _ 50 Address:=adr, _ 51 TextToDisplay:=eachPath) 52 deepPath = Dir(ThisWorkbook.Path & "\" & YYYYMM & "\" & itemsdic & "\ABC*", vbDirectory) 53 54 Do While deepPath <> "" '二重ループ 55 deepAdr = ThisWorkbook.Path & "\" & YYYYMM & "\" & itemsdic & "\ABC" & "\" & deepPath 56 If deepPath <> "." And deepPath <> ".." And GetAttr(deepAdr) = 16 Then 57 Set hypLink = ActiveSheet.Cells(i, 8).Hyperlinks.Add( _ 58 Anchor:=Cells(i, 8), _ 59 Address:=deepAdr, _ 60 TextToDisplay:=deepPath) 61 i = i + 1 62 End If 63 64 deepPath = Dir() 65 66 Loop'二重ループ 67 68 69 ElseIf eachPath <> "." And eachPath <> ".." And GetAttr(adr) = 16 And eachPath <> "ABC" Then 70 Cells(i, 6).Value = itemsdic 71 Set hypLink = ActiveSheet.Cells(i, 7).Hyperlinks.Add( _ 72 Anchor:=Cells(i, 7), _ 73 Address:=adr, _ 74 TextToDisplay:=eachPath) 75 76 i = i + 1 77 End If 78 eachPath = Dir() 'ここです 79 Loop 80 Next 81 82End Sub

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

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

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

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

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

guest

回答2

0

二重ループの中でDir()で取れるものを出し切った後で、もう一度Dir()したからでしょうね。

投稿2021/03/02 07:17

jinoji

総合スコア4592

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

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

pegy

2021/03/02 07:27

ありがとうございます。誤認がございました。
guest

0

ベストアンサー

Dirの中で異なるDir()を実行してもそれ自体がエラーの原因となる認識はないのですが、

それはNGです。エラーになります。
過去に同様の質問がありましたのでご参考に。

VBA - Dirメソッドの更新(Dir=())での「プロシージャ呼びだし、又は引数が不正です。」|teratail

上記で解決法を提示してます。

投稿2021/03/02 07:17

hatena19

総合スコア34073

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

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

pegy

2021/03/02 07:28

ご指摘ありがとうございます、過去の案件でfsoオブジェクトを使って再帰的な処理をしているようなので参考にしてみます。よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問