• 締切済み

複数のファイルをまたぐエクセルマクロの書き方

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

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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" を  &演算子で文字列として連結しているだけです。 文字列の部分だけ、ダブルクオート""で括って&で繋ぐ。 その基本だけ解れば応用は簡単です。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>ファイル名は、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)
回答No.2

こんにちは。 開いているワークブックすべて のうち、 名前が、".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)
回答No.1

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

関連するQ&A

  • 複数のファイルに対し同じ処理を行う方法

    複数のファイルのエクセルファイルに対し、同じ処理を行うマクロを教えてほしいです。 処理するファイル数が一定でないため、現在はDo While~Loop構文を用い強引に処理しています。 しかし、この方法では処理が終わる(アクティブファイルが無くなる)とエラーメッセージが出るため、煩わしいです。 Do Until構文で、終了条件を指定したらよさそうなのですが、どのように書けばいいのかわかりません。 現在記述しているものは以下です。 -------------------------------------------------------- Sub 連続処理() Dim BookName As String Dim PathName As String PathName = "D:\A1\連続処理\" BookName = Dir(PathName & "*.xls")   Do Until BookName = ""  Workbooks.Open PathName & BookName  BookName = Dir() Loop Do While (1)   ・   ・(処理作業を行うマクロ)   ・ Workbooks(ActiveWorkbook.Name).Close savechanges:=True Loop End Sub

  • エクセルのマクロでループ処理

    エクセルのマクロで、ループを使っています 下の様な感じです。 sub TEST() a: re=re+1 if ○○=○▲ THEN GOTO b: 処理・・・ goto a: b: end sub() ですが、これの書き方はDo WhileやDo Untilを使った方が 早く処理できるのでしょうか? また、書き方等もお教え下されば助かります。

  • エクセルで差込印刷をするマクロについて

    エクセルでSheet1のAに名前Bに学年が入っています。 Sheet2のY1にSheet1のAを、Y2にSheet1のBを差込印刷したいのです。 前の質問を見て名前だけの印刷は出来ましたが学年が上手くいきません。ぜひぜひお願いいたします。 学年の差込印刷が上手くいったときのマクロを記述します Sub Pri_Name() Range("A1").Activate Do While ActiveCell.Text <> "" Worksheets(2).Range("Y1").Value =ActiveCell.Text Worksheets(2).Range("A1:Z38").PrintOut ActiveCell.Offset(1, 0).Activate Loop End Sub

  • エクセル マクロ ループ ファイル展開

    マクロ ループ処理について質問です。 test エクセルファイルのD1セルから下にファイル名を入れていき、その名前(フルパスで入れています)のファイルを開きつつ、シートを 26-4 に選択していくループ処理をしたいのですが、2週目から Sheets("26-4").Select  でエラーになります。 原因は、test ファイルがアクティブになっているからだと思うのですが、その対策の仕方が、検索してもうまく見つからなかったので、質問しました。 ご回答よろしくお願いします。 エクセル2010 使用しております。 Range("D1").Select i = 1 Do Until ActiveCell.Value = "" Workbooks.Open Filename:=Range("D" & i) '操作事項マクロ Sheets("26-4").Select Windows("test.xlsm").Activate ActiveCell.Offset(1, 0).Select '下にずれる i = i + 1 Loop End Sub

  • 複数のエクセルファイルをマクロで開いて閉じたい

    フォルダにエクセルファイルが複数あります。A*** B*** マクロを使い、A・Bの後の日々変更される(数字)ファイル名に対応して、 ファイルを開きActivateにする方法と閉じる方法を教えてください。

  • エクセルVBA:マクロの中にマクロ?

    度々よろしくお願いします。ボタンが複数あって、それぞれに記録されたマクロの一部分が共通している場合の処理について教えてください。 例えば、前回の質問でご回答いただいたモノを流用し、別の処理と複合させたマクロがあります。 この変数ixがボタン(それぞれのマクロ)ごとに異なる場合、Do While以下を別のマクロとして記録し、それぞれのマクロの中で Application.Run "TEST.xls!Macro1"などのようにできるのでしょうか?変数の扱いをどうして良いのかわかりません。 Sub test() ~別の処理 ix = 8 Do While Cells(ix, "D") <> ""   Select Case Trim(Cells(ix, "D"))   Case "背筋"     Range("AZ8").Copy Destination:=Range(Cells(ix, "I"), Cells(ix, "AW"))   Case "アーム"     Range("BA8").Copy Destination:=Range(Cells(ix, "I"), Cells(ix, "AW"))   Case "レッグ"     Range("BB8").Copy Destination:=Range(Cells(ix, "I"), Cells(ix, "AW"))   End Select   Range(Cells(ix, "I"), Cells(ix, "AW")).Copy   Cells(ix, "I").PasteSpecial Paste:=xlPasteValues   ix = ix + 1 Loop Range("I8").Select End Sub

  • マクロの基本的なことについて質問です。

    マクロの基本的なことについて質問です。 1、Sub 前判定until() i = 1 Do Until i > 10 i = i + 1 Loop MsgBox ("カウンタは" & i & "になりました") End Sub メッセージは11になります。 2、Sub 前判定while() i = 1 Do While i > 10 i = i + 1 Loop MsgBox ("カウンタは" & i & "になりました") End Sub メッセージは1になります。 1、はiが10より大きくなるまでというのが条件で、それまでi=i+1を続けるということではないんでしょうか。つまり、最初はi=1なので、メッセージは「2」になるのではと思うのですが… 2、も同様にわかりません。難しくて頭が混乱しています。どなたか分かりやすい例などを沿えて回答を頂けると有り難いです。どうかよろしくお願いします。

  • EXCELのマクロに関して

    vbaのマクロに関して質問があります。 マクロをどのように作ればよいでしょうか? マクロは以下のようになっています。sheet1以外(sheet2,sheet3など)に単語を入れて、sheet1でフラッシュ単語のようにするマクロです。これに付け加えたい内容があります。sheet1のセルにある値を入れれば、sheet1以外のシートのある特定の列をフラッシュ単語としてだしたいと考えています。シートと列を指定したいと考えています。 どのように付け足せばよいでしょうか? Sub sample() Dim i As Integer i = 1 Worksheets("sheet1").Activate Do Sheet1.Range("A1").Value = Sheet3.Range("b" & i).Value '1000で1秒,oで場所,sheet2の場所 Call Sleep(1000) DoEvents i = i + 1 Loop Until IsEmpty(Sheet3.Range("b" & i).Value) '1000で1秒,oで場所,sheet2の場所 End Sub

  • 複数のエクセルファイルに対してマクロを順次実行する方法

    複数のエクセルファイルに対してマクロを順次実行する方法 過去の掲載(QNo.5411462)にありましたが、参考にさせていただきましたが、 コンパイルエラーでうまくいいきませんでした Sub 繰り返し() Dim buf As String, i As Long buf = Dir(Range("G:\(基準").Value & "\*.xlsb"  <この行エラーです。 Do While buf <> "" Workbooks.Open Worksheets(1).Range("A1").Value & "\" & buf フォルダー名(A) 基準.xlsb ブック名は(B)、(基準1.xlsb (基準41.xlsb(基準81.xlsb....(基準4081まであります。 ブック 基準.xlsbを、ベースにして(閉じない)、マクロ実行、(基準1.xlsb (基準41.xlsb・・アクティブにして、順次実行しようと思っていまっす。 編集用マクロは、マクロ記録で作っています。 上書き保存で閉じるまでです。 つまり、ブック(B)を順次アクティブにできれば、それだけでいいと思うのですが、まだ実行していませんので何とも言えません。 当方windows Vista エクセルは2007です。 未熟者で失礼いたします。 よろしくお願いします。

  • 簡単なエクセルVBA

    最近エクセルのVBAを勉強し始めたのですが、 1×1=1 1×2=2 1×3=3  ・  ・ 9×9=81 と出るようにしたいのですが、 Sub kuku() Do While i < 9 i = i + 1   Do While j < 9   j = j + 1   a = i * j   Debug.Print i; "×"; j; "="; a   Loop Loop End Sub としたところ1×9=9までしかでません。 どうすれば上手くループするようになるでしょうか? お願いします。

専門家に質問してみよう