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

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

詳細はこちら
VBA

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

Q&A

解決済

2回答

14592閲覧

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

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2021/02/17 11:28

指定のディレクトリ内のディレクトリにエクセルファイル(ワイルドカード *.*で判別しています。)が有る場合にエクセルのシート名一覧を入力するプロシージャを作成しました。
ところが、一つのファイルに複数のブックが有る場合(異なる原因かもしれませんが)「Ins=Dir」の部分で「プロシージャ呼び出し、または因数が不正です。」とエラーが表示され止まってしまします。

Sub 更新() Dim Path As String Dim fso As Object Dim Ins As String 'ジャンルフォルダの有無確認用 Dim Instag As String 'インデックスデータが有った場合のタグ Dim Inspath As String '格納フォルダの有無確認用 Dim cate As String Dim zyan As String Dim book As String Dim sheet As String Dim strag As String Dim Writ As String IROW = 11 Path = ThisWorkbook.Path & "\" & "全データ" Set fso = CreateObject("Scripting.filesystemobject") For Each CA In fso.Getfolder(Path).Subfolders cate = fso.Getfolder(CA).Name Ins = Dir(Path & "\" & cate & "\", vbNomal + vbDirectory) Do While Ins <> "" If Ins = "." Then Ins = Dir() Ins = Dir() End If 'If InStr(Ins, ".") > 0 Then 'エクセルデータ有る場合 If Dir(Path & "\" & cate & "\" & "*.*") <> "" Then Instag = "ジャンル無し" zyan = "-" Writ = Dir(Path & "\" & cate & "*.*") Do While Writ <> "" '''''''''エクセルデータ全て書き出し Call 書き込み.入力(Path & "\" & cate & "\", Writ, cate, zyan) Writ = Dir() Loop Exit Do Else zyan = Ins If Dir(Path & "\" & cate & "\" & zyan & "*.*") <> "" Then 'ここにジャンル有った時の処理(エクセル無いとき) Writ = Dir(Path & "\" & cate & "\" & zyan & "*.*") Do While Writ <> "" '''''''''エクセルデータ全て書き出し Call 書き込み.入力(Path & "\" & cate & "\" & zyan & "\", Writ, cate, zyan) Writ = Dir() Loop End If Ins = Dir()’’’’’’’’ここです!! End If Loop Instag = "" Next CA End Sub ```  該当部位に「ここです!!」と入力させていだだきました。 当プロシージャ内のプロシージャ「書き込み.入力」は以下です。 ```ここに言語を入力 Public IROW As Long Sub 入力(Path As String, Ins As String, cate As String, zyan As String) Workbooks.Open Path & Ins mySheetCut = Workbooks(Ins).Sheets.Count For i = 1 To mySheetCut Workbooks(Ins).Activate mysheetName = Sheets(i).Name With Workbooks("新規案内.xlsm").Worksheets("管理ページ") .Activate .Range(Cells(IROW, 1), Cells(IROW, 1)) = cate .Range(Cells(IROW, 2), Cells(IROW, 2)) = zyan .Range(Cells(IROW, 3), Cells(IROW, 3)) = Ins .Range(Cells(IROW, 4), Cells(IROW, 4)) = mysheetName End With IROW = IROW + 1 Next i Workbooks(Ins).Close End Sub

今まで、まったく同じこと(複数のブックのシート一覧作成)は経験が有りませんが、「Dir」については何度も使ったことが在るので、なぜこんな事になったのか分からず困惑しています。
自分の知らない規則なども有るのかと思い質問致しました。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Dir関数を Do Loop の入れ子にするのはNGです。
Do Loop の中で Dir("パス") とした時点で、ループの前の Dir("パス") はリセットされてしまうので。

下記は質問のコードの一部を抜粋したものでNG箇所を指摘したものです。(他にもNG箇所多数あり)

vba

1 2 Ins = Dir("パス1") 3 Do While Ins <> "" 4 5 Writ = Dir(Path & "\" & cate & "*.*") '←これNG!! Dir("パス1")がリセットされる 6 7 Do While Writ <> "" '''''''''エクセルデータ全て書き出し 8 9 Writ = Dir() 10 Loop 11 'この時点で Dir() の結果は "" 12 13 Ins = Dir() '""になってから呼び出すとエラーになる 14 Loop

サブフォルダーも含めて走査する場合は、
Dir関数を使うなら再帰を使うことになります。

サブフォルダを含めてファイル一覧を取得する(Dir関数の再帰呼び出し):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

これは難解になりがちなので、今回の場合は、まずは、fso.Getfolder(Path).Subfolders でサブフォルダー一覧を取得して配列かワークシートにでも出力しておいてから、一つのフォルダー毎に処理をしていくのが分かりやすいと思います。

投稿2021/02/17 13:10

hatena19

総合スコア34073

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

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

ice930

2021/02/18 13:09

ご指摘の通りで解決しました! Dirを複数利用する時は「再帰」を行う必要が有るのですね! 今回の様な場合はfso.Getfolder(Path).Subfoldersを利用したいと思います。
guest

0

Dir()が空文字列を返して、もう該当ファイルが無いと分かったのに、さらにDir()を呼び出すとそのエラーになります。
毎回、空文字列じゃないかをチェックしましょう。

投稿2021/02/17 11:45

otn

総合スコア85886

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

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

ice930

2021/02/17 13:13

エラーになっている時点では、Insにフォルダ名は入っているのですが、この場合「Ins = Dir()」でInsは空欄になり、「Do While Ins <> ""」へ回って終了・・。 となると思っておりました。 If文で空欄を確認することは可能ですが、その場合、エラーが入っている時点で空欄では無いので分岐できません。 理解不足でしたら申し訳ありません。追記の助言いただけると幸いです。
otn

2021/02/17 14:22

> If文で空欄を確認することは可能ですが、その場合、エラーが入っている時点で空欄では無いので分岐できません。 違います。 空文字列になればそれ以上Dir()を実行しないようにすればエラーにはなりません。 なので、「エラーが入っている時点で」というのは意味不明です。 もう一度書きますが、 Dir()を実行する都度、空文字列かどうかをチェックしましょう。
ice930

2021/02/18 13:11

「再帰」の知識が不足しておりました。 意味不明な質問をしてしまい申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問