■質問内容
下記マクロで、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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
split関数で区切り文字がない場合
Visual Basic(VBA)
-
5
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
6
ExcelVBAのDirでスペース含むファイル名
Visual Basic(VBA)
-
7
エクセル マクロ 標準モジュールのマクロから、シートモジュールのマクロを呼び出す
Excel(エクセル)
-
8
VBA public変数はどのようなことをしたら解放されますか?
Visual Basic(VBA)
-
9
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
10
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
11
エクセルVBAでパスの¥マークについて
Access(アクセス)
-
12
エクセル/マクロ Exit Subが実行されない
Excel(エクセル)
-
13
コマンドボタンを押すたびに大きくなってしまう
Excel(エクセル)
-
14
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
15
名前をつけて保存した後、元のファイルに戻るには
その他(コンピューター・テクノロジー)
-
16
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
17
Dir関数で読み取り順を操作できる?
Visual Basic(VBA)
-
18
ACCESSでコントロールソースの変更
Access(アクセス)
-
19
IIF関数の使い方
Visual Basic(VBA)
-
20
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どなたかこのプログラミングを...
-
画面を強制的に再描画させる方法
-
再帰関数のインライン展開
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
繰り返し処理で50音順にする方法
-
ループ内での条件処理
-
EXCEL VBA ユーザーフォームの...
-
ループ7回目の悪役令嬢は、元敵...
-
ループフリー
-
UWSCに制限時間を付けたいです
-
乱数の桁数指定、または範囲指定。
-
vb.netです。2次元配列の要素を...
-
これの名称なんて~の?ダッフ...
-
エクセル関数で1〜12の数字がル...
-
COBOLプログラム
-
アクティブセルから、A列最終行...
-
Java 南京錠
-
VBA msg=""の使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
DOSコマンドのループ内のTIMEコ...
-
ListBox 複数選択 で オートフ...
-
vbscriptでIE自動入力(途中で...
-
vb.netからエクセル関数書き込み
-
DoEventsが必要な理由について
-
Java 南京錠
-
アクティブセルから、A列最終行...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VBA Dir関数でファイルをループ...
おすすめ情報
みなさま回答ありがとうございます。
この記載の方法は無理なのは把握しているのですが、やりたいことを伝えるためにかいております。
やりたいことをどのようにすればやれるかを模索しているところですm(_ _)m