■質問内容
下記マクロで、Dir関数のループ中にサブルーチンでDir関数を使用しています。
この場合、Macro1のDir関数がリセット(?)されて、やりたいことができません。
この状況を解消するうまい方法はないでしょうか?
Macro1、Macro2ともファイル名はID以外は変動するためどちらもワイルドカードを使用ていします。
Sub Macro1()
'所定のフォルダ内のファイルをループするマクロ
Dim strPathName As String, strFilename As String
strPathName = "C:\temp1"
'Aから始まるファイルを取得
strFilename = Dir(strPathName & "\A*.xlsx")
'全ファイルループ
Do While strFilename <> ""
Call Macro2(strFilename)
'次のファイル名を取得
strFilename = Dir
Loop
End Sub
Sub Macro2(strFilename As String)
'strFilenameが持っているIDを取得して、別の対応ファイルを取得するマクロ
Dim strID As String
Dim targetFilename As String, targetPath As String
'ファイル名に含まれているIDを取得
targetID = Split(strFilename, "_")(1)
'探し出すファイルが保存されているフォルダパス
targetPath = "C:\temp2"
'探し出すファイル名取得(IDを含んでいる)
targetFilename = Dir(targetPath & "\*" & targetID & "*.xlsx")
End Sub
■動作環境
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部
以上、ご存知の方ご教示いただければ幸いです。
No.5ベストアンサー
- 回答日時:
Macro1のみFileSystemObjectを使用する方法に変えました。
Macro2のなかでDir()が使用可能になります。
参照設定でMicrosoft Scripting Runtimeにチェックをいれてから、実行してください。
Sub Macro1()
'所定のフォルダ内のファイルをループするマクロ
Dim strPathName As String, strFilename As String
Dim wfso As New FileSystemObject
Dim wfolder As Folder
Dim wfiles As Files
Dim wfile As File
strPathName = "C:\temp1"
Set wfolder = wfso.getfolder(strPathName)
Set wfiles = wfolder.Files
'取得したファイル一覧について処理
For Each wfile In wfiles
'A*.xlsxにマッチするファイルのみ処理する
If LCase(wfile.Name) Like "a*.xlsx" Then
Call Macro2(wfile.Name)
End If
Next
End Sub
No.6
- 回答日時:
dir関数は多重にできないので、外側のループの処理結果を配列やCollectionに取得しておく必要があります。
質問の処理をCollectionを使って置き換える場合です。
出来るだけ元のプログラムを残しています。
Macro2はそのままです。
Sub Macro1()
'所定のフォルダ内のファイルをループするマクロ
Dim strPathName As String, strFilename As String
strPathName = "C:\temp1"
'Aから始まるファイルを取得
strFilename = Dir(strPathName & "\A*.xlsx")
'対象ファイル取得
Dim co As New Collection 'ファイル名記憶用Collection
Do While strFilename <> ""
'Collectionに追加
co.Add strFilename
'次のファイル名を取得
strFilename = Dir
Loop
'全ファイルループ
Dim f As Variant
'Collectionの値を順に
For Each f In co
'Macro2にCollectionの値を渡す
Call Macro2(CStr(f))
Next
End Sub
No.4
- 回答日時:
'Aから始まるファイルを取得
strFilename = Dir(strPathName & "\A*.xlsx")
'全ファイルループ
Do While strFilename <> ""
'ファイル名を配列に格納
ReDim Preserve 配列(i)
配列(i) = strFilename
i = i + 1
'次のファイル名を取得
strFilename = Dir()
Loop
'配列をループ
For i = 0 To UBound(配列)
Call Macro2(配列(i))
Next i
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
5
split関数で区切り文字がない場合
Visual Basic(VBA)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
エクセルVBAでパスの¥マークについて
Access(アクセス)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
ExcelVBAのDirでスペース含むファイル名
Visual Basic(VBA)
-
11
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
12
IIF関数の使い方
Visual Basic(VBA)
-
13
Dir関数で読み取り順を操作できる?
Visual Basic(VBA)
-
14
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
15
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
16
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
17
フォルダ、ファイルのアクセス権設定状態を確認したい
ネットワーク
-
18
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
19
VBA ファイルを開くダイアログでの初期表示にファイルサーバーを指定
Excel(エクセル)
-
20
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
乱数の桁数指定、または範囲指定。
-
VBA横データを縦にしたいです
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
ExcelVBAで、index、match関数...
-
VB.NETで素因数分解のプログラ...
-
ループを回すという意味は何で...
-
ループフリー
-
エクセルの当番表を作っていま...
-
vbscriptでIE自動入力(途中で...
-
ExcelVBA FindNextを使用して条...
-
Application.OnTime の使い方
-
VisualStudioにてモザイクの画...
-
vb.netです。2次元配列の要素を...
-
GIFアニメをループさせたくない
-
COBOLプログラム
-
素因数分解プログラムで、5は5...
-
アクティブセルから、A列最終行...
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vbscriptでIE自動入力(途中で...
おすすめ情報
みなさま回答ありがとうございます。
この記載の方法は無理なのは把握しているのですが、やりたいことを伝えるためにかいております。
やりたいことをどのようにすればやれるかを模索しているところですm(_ _)m