アプリ版:「スタンプのみでお礼する」機能のリリースについて

開いている複数のエクセルブック(.csv)に対して同じ処理を行いたいのですが、いいマクロが分からなくて困っています。ご存じの方がいらっしゃったら、教えてください。
ちなみに、ファイル名は、1 A、1 B、2 A、2 B・・・と言った感じです。
Sub
i = 1
Do While i < 9
Windows("i A.csv").Activate
・・・
Loop
End Sub
とやってみたのですが、ファイルが選択されずに、止まってしまいました。

A 回答 (4件)

#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"

 &演算子で文字列として連結しているだけです。
文字列の部分だけ、ダブルクオート""で括って&で繋ぐ。
その基本だけ解れば応用は簡単です。
    • good
    • 0

>ファイル名は、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
    • good
    • 0

こんにちは。



開いているワークブックすべて
のうち、
名前が、".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
という風に条件を書き換えます。

もしも間違った例示をしていた場合は、よく確認してから
きちんと補足してみてください。

以上です。
    • good
    • 0

>Windows("i A.csv").Activate


   ↓
Windows(i & "A.csv").Activate
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!