- 締切済み
複数のファイルをまたぐエクセルマクロの書き方
開いている複数のエクセルブック(.csv)に対して同じ処理を行いたいのですが、いいマクロが分からなくて困っています。ご存じの方がいらっしゃったら、教えてください。 ちなみに、ファイル名は、1 A、1 B、2 A、2 B・・・と言った感じです。 Sub i = 1 Do While i < 9 Windows("i A.csv").Activate ・・・ Loop End Sub とやってみたのですが、ファイルが選択されずに、止まってしまいました。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- cj_mover
- ベストアンサー率76% (292/381)
#2、cjです。追加レスです。 > 開いている複数のエクセルブック(.csv) が、確実に開いているなら、名前を指定してアクティブにするのでも 構わないと思いますけれど、漏れがあってもエラーを出さない という意味では、#2は比較的易しい設計を意図したつもりでした。 開いているワークブックだけを相手にしていますから。 ところで、 元質問でご提示のコードについてですが、 (意図を汲み兼ねている面もありまして) 変数 i の増加によって処理に変化を付けているのでしたら、 既出のもの、そのままでは対応出来ません。 > ファイル名は、1 A、1 B、2 A、2 B・・・ > Do While i < 9 このふたつを合わせて読むと ファイル名は、1 A、1 B、2 A、2 B・・・8 A、8 B ということになると思いますが、 これらのファイル名を、1 から 8 まで、ふたつのファイルを一組として 順にアクティブにしていく記述を示しておきます。 Sub Re8205665a() Dim i As Long For i = 1 To 8 Workbooks(i & " A.csv").Activate ' ←' 1 A、2 A、3 A、4 A、5 A、6 A、7 A、8 A に対する処理を記述 Workbooks(i & " B.csv").Activate ' ←' 1 B、2 B、3 B、4 B、5 B、6 B、7 B、8 B に対する処理を記述 Next i End Sub 以上はファイル名で指定したワークブックが開いていないとエラーになります。 以下は "複数のエクセルブック(.csv)" |(開いてるかわからないブック) を 開きながらアクティブにし |(開いているならアクティブにするだけ) 順に処理していきます。 この場合、開いていなくてもエラーになりませんが、 存在しないブックを開こうとした場合は当然エラーになります。 Sub Re8205665aa() Dim i As Long For i = 1 To 8 Workbooks.Open i & " A.csv" ' ←' 1 A、2 A、3 A、4 A、5 A、6 A、7 A、8 A に対する処理を記述 Workbooks.Open i & " B.csv" ' ←' 1 B、2 B、3 B、4 B、5 B、6 B、7 B、8 B に対する処理を記述 Next i End Sub 以上、i は、1 から 8 まで 1 ステップずつ増加します。 いずれの例も、 i & " A.csv" i & " B.csv" のように、 数字(数値)を表す変数 i と 文字列値 " A.csv"、 " B.csv" を &演算子で文字列として連結しているだけです。 文字列の部分だけ、ダブルクオート""で括って&で繋ぐ。 その基本だけ解れば応用は簡単です。
- watabe007
- ベストアンサー率62% (476/760)
>ファイル名は、1 A、1 B、2 A、2 B・・・と言った感じです。 なら、こんな方法も For Each fn In Array("1 A", "1 B", "2 A", "2 B") Windows(fn & ".scv").Activate ・・・ Next
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 開いているワークブックすべて のうち、 名前が、".csv"で終っているものを 順に処理していきます。 Sub Re8205665() Dim wbk As Workbook For Each wbk In Workbooks If wbk.Name Like "*.csv" Then ' ' やりたい処理を書くところ ' ' 以下3行は仮の処理 Debug.Print wbk.Name, ; Debug.Print wbk.Sheets(1).Name, ; Debug.Print wbk.Worksheets(1).Range("A1").Value End If Next End Sub 上記、wbk.Worksheets(1).Range("A1")、のように ワークブック、ワークシート、セル範囲と、 正しく子オブジェクトを参照するようにしてください。 そういう書き方をまだ知らないのでしたら、 必ず、標準モジュールに記載するようにして。 wbk.Activate Range("A1").Value = 1 のように、一旦、ワークブックをアクティブにしてから、であれば、 (親オブジェクトを指定しない)省略形でセル範囲を指定できます。 また、ファイル名を、 "半角数字一文字"と"半角スペース一文字"と"半角AからBまでの一文字" が連なった3文字に続いて".csv"という名前で特定出来るならば、 (例示が正しいならば) If wbk.Name Like "*.csv" Then に代えて If wbk.Name Like "# [A-B].csv" Then とすれば、仮に、その他のCsvファイルが開いていても 名前によって条件分岐できます。 或いは例示に沿って、 "1から8までの半角数字一文字"と"半角スペース一文字"と"半角AからBまでの一文字" が連なった3文字に続いて".csv"という名前で特定出来るならば、 If wbk.Name Like "[1-8] [A-B].csv" Then という風に条件を書き換えます。 もしも間違った例示をしていた場合は、よく確認してから きちんと補足してみてください。 以上です。
- watabe007
- ベストアンサー率62% (476/760)
>Windows("i A.csv").Activate ↓ Windows(i & "A.csv").Activate