teratail header banner
teratail header banner
質問するログイン新規登録
VBA

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

Q&A

1回答

488閲覧

VBA 特定の値があるファイルのコピー

minako_tera

総合スコア12

VBA

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

0グッド

0クリップ

投稿2025/06/25 02:02

0

0

実現したいこと

フォルダのなかから特定の文字を含むエクセルファイルをコピーして別のフォルダに保存するためのコードを教えてください。

また、フォルダ内に階層があり、
2番目の階層のフォルダ場所が毎月変わります。
【フォルダの階層】
①「データ」フォルダ
②「2025年4月」(ここのファイル場所が対象月に変わる)
③「第一]「第二」←この中にある特定のファイルを「作業」フォルダにコピーしたい

③の「第一]「第二」フォルダに格納されているエクセルファイルのうち
”あいう”または”かきく”を含むファイルをコピーして「作業」フォルダに保存する。

あいうえお(第一).xlsx コピーして保存
かきくけこ(第二).xlsx コピーして保存
さしすせそ(第一).xlsx コピーしない

発生している問題・分からないこと

単純なコピーのコードしかわからず、やりたい事のコードがわかりませんでした。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

同様の質問を探すことができませんでした。

補足

特になし

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

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

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

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

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

sk.exe

2025/06/25 03:09

> 特定の文字を含むエクセルファイル 「ファイルの『名前に』特定の文字列が含まれている Excel ブック」という意味であるとして、 > ①「データ」フォルダ 上記のフォルダが存在するのはどのコンピューター上でしょうか。 - そのマクロを実行するコンピューターのローカルドライブ。 - LAN上の別のコンピュータ(共有フォルダまたはネットワークドライブ) > ②「2025年4月」(ここのファイル場所が対象月に変わる) > ③「第一]「第二」←この中にある特定のファイルを「作業」フォルダにコピーしたい - [データ]フォルダ上には 'yyyy年m月' または 'yyyy年mm月' 形式の名前が付けられたフォルダ(以下[月別フォルダ]と呼ぶ)が複数存在する。 - それぞれの[月別フォルダ]の中には[第一]という名前のフォルダと[第二]という名前のフォルダが存在する。 と解釈できますが、[作業]フォルダはどのフォルダ階層に含まれているのでしょうか。 > 「第一]「第二」フォルダに格納されているエクセルファイルのうち > ”あいう”または”かきく”を含むファイルをコピーして「作業」フォルダに保存 > あいうえお(第一).xlsx コピーして保存 > かきくけこ(第二).xlsx コピーして保存 [データ]フォルダ内のサブフォルダ群の中に、全く同名のブックが存在している可能性については考慮しなくてもよいのでしょうか。 もしコピー元ブックと同名のブックが既に[作業]フォルダ内に存在した場合、そのまま上書きしても支障はないのでしょうか。 例えば、[あいうえお.xlsx]という名前のブックが、[2025年4月]フォルダ内の[第一]フォルダおよび[第二]フォルダのどちらにも存在している場合、一方のフォルダにある[あいうえお.xlsx]を[作業]フォルダにコピーした後、もう一方のフォルダにある[あいうえお.xlsx]を[作業]フォルダにコピーすれば、前者のブックが後者のブックに上書きされることになります。
minako_tera

2025/06/25 04:58

お忙しいところご回答ありがとうございます。 ①対象のフォルダの場所については共有フォルダになります。 ②>[作業]フォルダはどのフォルダ階層に含まれているのでしょうか。 作業フォルダについては 同じ共有フォルダ内となりますが、 [データ]フォルダの1つ上の階層[共有]の中に[作業フォルダ]を設けております。 ③[データ]フォルダ内のサブフォルダ群の中にある同名のブックの可能性ですが [データ]-「2025年4月」-「第一]「第二」の直下に同ファイル名は存在しませんが [データ]-「2025年4月」-「その他」等のフォルダ配下に同ファイル名は存在する可能性がございます。 そのため、「2025年4月」直下にある「第一]、「第二」内のファイルのみ、コピーしたいと考えております。 また、[あいうえお.xlsx]の同ファイル名の可能性についてですが、 [あいうえお.xlsx]のファイル名の頭に、「第一]、「第二」かならずついております。 こちらでご指導いただけますと幸いです。
YAmaGNZ

2025/06/25 07:41

ご自身ではどこまでのことが出来ているのでしょうか? 例えば「②「2025年4月」(ここのファイル場所が対象月に変わる)」 これが固定であれば分かるとかでしょうか? どこまでが出来て何が分からないのかを明確に説明されたほうがいいかと思います。
guest

回答1

0

対象のフォルダの場所については共有フォルダになります。

[データ]フォルダの1つ上の階層[共有]の中に[作業フォルダ]を設けております。

「第一]「第二」フォルダに格納されているエクセルファイルのうち
”あいう”または”かきく”を含むファイルをコピーして「作業」フォルダに保存

「第一]「第二」の直下に同ファイル名は存在しません

ファイル名の頭に、「第一]、「第二」かならずついております。

では、とりあえずの叩き台として。

vba

1Sub CopyBooks() 2 3 Dim objFSO As Object 'FileSystemObject 4 5 Set objFSO = CreateObject("Scripting.FileSystemObject") 6 7 Dim strRootFolderPath As String 8 9 'ルートフォルダの絶対パス(共有フォルダのUNCパス)を代入 10 strRootFolderPath = "\\ネットワーク上のコンピューター名\共有" 11 12 'そのフォルダが存在しない場合 13 If objFSO.FolderExists(strRootFolderPath) = False Then 14 MsgBox "パス'" & strRootFolderPath & "'に該当するフォルダが見つかりません。", _ 15 vbExclamation, _ 16 "フォルダ参照エラー" 17 'プロシージャを抜ける 18 Exit Sub 19 End If 20 21 Dim strSourceFolderPath As String 22 23 'ルートフォルダ上におけるコピー元サブフォルダ(の最上位階層)のパスを代入 24 strSourceFolderPath = strRootFolderPath & "\データ" 25 26 'そのサブフォルダが存在しない場合 27 If objFSO.FolderExists(strSourceFolderPath) = False Then 28 MsgBox "パス'" & strSourceFolderPath & "'に該当するフォルダが見つかりません。", _ 29 vbExclamation, _ 30 "フォルダ参照エラー" 31 'プロシージャを抜ける 32 Exit Sub 33 End If 34 35 Dim strMonthlyFolderPath As String 36 37 '現在のシステム日時を元に月別フォルダのパスを生成 38 strMonthlyFolderPath = strSourceFolderPath & "\" & _ 39 Format(Now(), "yyyy年m月") 40 41 'そのフォルダが存在しない場合 42 If objFSO.FolderExists(strMonthlyFolderPath) = False Then 43 MsgBox "パス'" & strMonthlyFolderPath & "'に該当するフォルダが見つかりません。", _ 44 vbExclamation, _ 45 "フォルダ参照エラー" 46 'プロシージャを抜ける 47 Exit Sub 48 End If 49 50 Dim strDestinationFolderPath As String 51 52 'ルートフォルダ上におけるコピー先サブフォルダのパスを代入 53 strDestinationFolderPath = strRootFolderPath & "\作業" 54 55 'そのサブフォルダが存在しない場合 56 If objFSO.FolderExists(strDestinationFolderPath) = False Then 57 'ルートフォルダ上にサブフォルダ[作業]を作成 58 objFSO.CreateFolder strDestinationFolderPath 59 End If 60 61'ここからデバッグ用コード 62 63 Dim wsResult As Worksheet 64 Dim lngRow As Long 65 66 '新規ブックを作成し、その 1 つめのワークシートを参照 67 Set wsResult = Workbooks.Add.Worksheets(1) 68 69 With wsResult 70 .Name = "コピー結果ログ" 71 lngRow = 1 72 .Cells(lngRow, 1).Value = "コピー順" 73 .Cells(lngRow, 2).Value = "コピー元パス" 74 .Cells(lngRow, 3).Value = "コピー先パス" 75 .Cells.EntireColumn.AutoFit 76 End With 77 78'ここまでデバッグ用コード 79 80 Dim varFolderNames As Variant 81 82 '月別フォルダ内のうち、コピー元ブックが保存されている複数のサブフォルダの名前を 83 '一次元配列(サブフォルダ名リスト)として格納する 84 varFolderNames = Array("第一", "第二") 85 86 Dim varFolderName As Variant 87 Dim strTargetFolderPath As String 88 Dim objFolder As Object 'Folder 89 Dim objFile As Object 'File 90 Dim strDestinationFilePath As String 91 Dim lngCopyCount As Long 92 93 'サブフォルダ名リスト内のアイテムを順次参照 94 For Each varFolderName In varFolderNames 95 96 '月別フォルダのパスと現在のサブフォルダ名を連結した結果 97 '(=コピー元ブック群が保存されている 1 つのサブフォルダのパス)を代入 98 strTargetFolderPath = strMonthlyFolderPath & "\" & varFolderName 99 100 'そのフォルダが存在しない場合 101 If objFSO.FolderExists(strTargetFolderPath) = False Then 102 MsgBox "パス'" & strTargetFolderPath & "'に該当するフォルダが見つかりません。", _ 103 vbExclamation, _ 104 "フォルダ参照エラー" 105 'プロシージャを抜ける 106 Exit Sub 107 End If 108 109 'そのサブフォルダを Folder オブジェクトとして参照 110 Set objFolder = objFSO.GetFolder(strTargetFolderPath) 111 112 'そのフォルダ内の全てのファイルを順次参照 113 For Each objFile In objFolder.Files 114 115 'ファイル名のパターンマッチング 116 If (objFile.Name Like varFolderName & "*あいう*.xlsx") Or _ 117 (objFile.Name Like varFolderName & "*かきく*.xlsx") Then 118 119 'コピー先ファイルパスを代入 120 strDestinationFilePath = strDestinationFolderPath & "\" & objFile.Name 121 122 'ファイルのコピー 123 objFile.Copy strDestinationFilePath, _ 124 True 125 126 'コピーカウンタのインクリメント 127 lngCopyCount = lngCopyCount + 1 128 129'ここからデバッグ用コード 130 131 'コピー結果をワークシートに出力 132 With wsResult 133 lngRow = lngRow + 1 134 .Cells(lngRow, 1).Value = lngCopyCount 135 .Cells(lngRow, 2).Value = objFile.Path 136 .Cells(lngRow, 3).Value = strDestinationFilePath 137 .Cells.EntireColumn.AutoFit 138 End With 139 140'ここまでデバッグ用コード 141 142 End If 143 Next 144 145 Set objFolder = Nothing 146 147 Next 148 149 MsgBox "フォルダ'" & strDestinationFolderPath & "'に " & lngCopyCount & " 個のブックをコピーしました。", _ 150 vbInformation, _ 151 "実行完了" 152 153 Set objFSO = Nothing 154 155End Sub

変数strRootFolderPathに代入するパスは適宜書き換えて下さい。

投稿2025/06/25 10:45

sk.exe

総合スコア1106

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

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

minako_tera

2025/06/26 09:23

早々にありがとうございます。解読に時間がかかりそうなため、まずはお礼のご返信となります。
minako_tera

2025/06/30 05:32

ご連絡が遅くなり大変申し訳ございません。 また、ご丁寧に説明いただきありがとうございます。 追加でご質問があります。 ①「データ」フォルダ ②「2025年4月」(ここのファイル場所が対象月に変わる) ③「第一]「第二」←この中にある特定のファイルを「作業」フォルダにコピーしたい 階層を上記のようにお伝えしましたが、②と③の間に「A」のフォルダが存在いたします。 その「A」のフォルダ配下に「第一]「第二」にある特定のファイルのコピーまではできているのですが、 「A」と横並びで「B」フォルダ内にある同様の”あいう”または”かきく”を含むファイルをコピーして 「作業」フォルダに格納、 および「C」のフォルダ内にある”さしす”ファイルも同様に「作業」フォルダにコピーしたい場合、 82行目からの作業を繰り返すのか、もしくは簡単なコードな記載方法はあるでしょうか? 何度も申し訳ございませんが、わかればご指導いただけますと幸いです。
sk.exe

2025/06/30 09:26

> 「A」と横並びで「B」フォルダ内にある同様の”あいう”または”かきく”を含むファイルをコピー ここでの「同様」とは具体的にどういう意味でしょうか。 - [B]フォルダにも『[A]フォルダと同様に[第一]および[第二]という名前のサブフォルダが存在』し、  それぞれのサブフォルダ内の Excel ブックを『[A]と同様のパターン条件で』検索する。 - [B]フォルダ自身の階層に格納されている Excel ブックを『[A]と同様のパターン条件で』検索する。  ([B]フォルダ内のサブフォルダおよびサブフォルダ内のファイルは全て無視する) もし後者を意味する場合、少なくとも 116~117行目で記述しているように「そのフォルダ自身の名前("第一"または"第二")がファイル名の先頭と一致するか否か」を判定することはないはずですので、「[A]と同様」というわけにはいかないのではないでしょうか。 > および「C」のフォルダ内にある”さしす”ファイル 上記については、明らかに[A]とはパターン条件が異なっています。 > 82行目からの作業を繰り返すのか、もしくは簡単なコードな記載方法はあるでしょうか? 階層の上下関係がどうであれ、「ファイル検索の対象となるフォルダによって、ファイル名のパターン条件がそれぞれに異なる(必ずしも一様ではない)」ということなのであれば、基本的にはそれぞれのフォルダごとに「 GetFolder メソッドに渡す絶対パス」と「objFile.Name(ファイル名)のパターン条件」をその都度変えるようにするだけです。 それらの一連の処理を「簡単なコード」に落とし込めるかどうかは、実際にどれだけ多くのフォルダがファイル検索の対象となるか、それぞれのパターン条件がどれだけ複雑で多岐に渡るか等にもよるため、現時点では何とも回答のしようがありません。 下手な共通化を試みようとするより、フォルダごとに個別のファイル検索処理を作りこんだ方が(コードの可読性、メンテナンス性の面において)無難な場合もあるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問