- ベストアンサー
Excel マクロで複数ブックのデータを一つのブックにまとめたい
マクロ初心者です。 フォーマットの同じ複数のブックのセルをコピーし、 新しいブックに羅列したいのですが、 ブック数が多く、手作業では効率が悪く、困っています。 例えば・・・Book001.xls、Book002.xls、二つのブックがあります BooK001.xls ABCD 1 * 2 * 3 * 4 * Book002.xls ABCD 1 + 2 + 3 + 4 + これを、新しいブック(All.xls)に ABCD 1 *+ 2 *+ 3 *+ 4 *+ といったように、コピーしたいのですが、マクロ初心者のため、お手上げ状態です。 条件は、 ・フォルダにBookXXX.xls(XXXは001~の連続した番号)という名のブックが入っている ・BookXXX.xlsは全て同じフォーマット マクロの構文はもちろん、設定の仕方も教えていただけないでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 #1さんのおっしゃっている内容を、そのまま、マクロに移植してしまえばよいのでは? でも、最初、マクロが分からないと、ちょっと手間取るかもしれませんね。 コードを書いてみました。 標準モジュールに貼り付けてください。 Alt + F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、 Alt + Q で、画面を閉じます。 --------------------------------------------- Sub GetData() Dim myPath As String Dim i As Long Dim FName As String Dim myAddress As String myAddress = "Sheet1'!RC1" '取得する相手のブックのアドレス myPath = Application.DefaultFilePath & "\" 'パス(現在はデフォルト) If Right$(myPath, 1) <> "\" Then myPath = myPath & "\" For i = 1 To 100 '100回を繰り返す 'ブック名 FName = "Book" & Format$(i, "000") & ".xls" 'ブックが存在しているかチェック If Dir(myPath & FName) <> "" Then '数式の貼り付け FName = "='" & myPath & "[" & FName & "]" & myAddress '500行まで Range("A1:A500").Offset(, i - 1).FormulaLocal = FName '数式を値に変更 Range("A1:A500").Offset(, i - 1).Value = _ Range("A1:A500").Offset(, i - 1).Value End If Next i End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >やはり、マクロの知識がほとんど無いと、難しいのでしょうか? なんと言っていいのかしらね。経験がなくても、すぐに出来る人もいれば、そうでない人もいます。ただ、たとえば、以下のような問題って、教われば簡単な話ですが、教わらないと、自力では、どうにも分からないし、どこの本にも、その出来ない原因が出てこないのです。それは、しょうがないというか、エラーの数だけ、VBAを覚えということだと思います。 ただし、私の考えているのが外れているかもしれません。 >Microsoft Excel ObjectフォルダのThisWorkbookに > >Private Sub Workbook_Open() >Call GetData '→標準モジュールのGetDataを呼び出せという意味になっています。 >End Sub 「Excelでは、一般のマクロは標準モジュールに書く」というのが決まりです。そうでない場合は、ThisWorkbook.GetData などと書きますが、標準モジュールが良いです。 ThisWorkbookに置くマクロ、Sheet1 モジュールに置くもの、それぞれ、ないようでも、一応、その役割が決まっています。 >例えば、Cドライブにtestというフォルダを作り、そこに全ブックを保存した場合、 > >\C\test これは解決できたかもしれませんが、VBAでは、という限定の話ですが、エクスプローラのアドレスに出てくるものと同じです。 C:\Test ですね。(マクロの中で、C:\Test は、C:\Test\ に変わります。)
お礼
丁寧にありがとうございます。 マクロは初心者ですが、Java言語などをVisualBasicでやったことがあったので、 引数をウオッチウィンドウで表示させて、なんとかフォルダの場所は解決できました。 おかげさまで、完璧ではありませんが、それなりに満足のいく動きをしてくれるマクロを設定できました。 本当に感謝しています。 仕事上、絶対に必要なスキルではなかったので、マクロは避けてきましたが、やはり覚えておいた方がいいのかも…。 まずは基礎を勉強して、後は経験で覚えるのが良いみたいですね。 初心者の私にでも、分かり易いようにご説明いただき、本当にありがとうございました。
- bin-chan
- ベストアンサー率33% (1403/4213)
VBAを使わずとも、他のブックのセル参照機能を利用して、以下ではどうでしょう? 以下、新しいブック(All.xls)とBook001.xlsで行います。 1)All.xlsのセルA1で=を入力して、Book001.xlsのセルA1をクリック これで=[Book001.xls]Sheet1!$A$1が設定されるはず。 このままだと絶対参照で都合が悪いのでf・4キーを数回おして =[Book001.xls]Sheet1!$A1にしてください。 2)All.xlsのセルA1をコピーして縦方向にコピーしてください。 All.xlsのセルA2の式が=[Book001.xls]Sheet1!$A2であることを確認しておいてください。 3)次に列Aを列Bにコピーします All.xlsのセルB1の式が=[Book001.xls]Sheet1!$A1であることを確認しておいてください。 4)列Bの必要なセルを選択して、Ctrl+Hのキー入力(置換) Book001.xlsをBook002.xlsに置き換えます。 All.xlsのセルB1の式が=[Book002.xls]Sheet1!$A1であることを確認 以下、3と4を繰り返す ただし、ブックが255冊を越えるようだと、横1列になりません。 また、参照だと遅いので、参照式を設定し終えたら、式設定した範囲すべてを「コピー」して「形式を選択して貼り付け>値」で値にした方が良いかも?
お礼
回答ありがとうございます。 早速試してみました。 ブックを開かずに設定できるのは良いですね。 ただ、ブックが100近くあるので、 この作業を100回繰り返すのと、 ブックを1つ1つ開いてコピー&ペーストするのと、 所要時間の大差があまり無いのでは?と感じました。 せめて、横方向のドラッグでブック名の数字を1ずつ増やせればと思うのですが…。 どういった方法が一番良いのか、模索中です。
お礼
回答ありがとうございます。 注釈が分かりやすく、設定が簡単にできました。 ALL.xlsというブックを作成し、そのSheet1セルA1を選択して、 書いてある通りにマクロを作成しました。 ついでに、Microsoft Excel ObjectフォルダのThisWorkbookに Private Sub Workbook_Open() Call GetData End Sub 上のコードを付け足して、ブックを開いたときにマクロが実行されるように設定しました。 試しに、test用のブックを作って実行してみましたが、何も出てきません。 やはり、マクロの知識がほとんど無いと、難しいのでしょうか?
補足
パスというのは、 例えば、Cドライブにtestというフォルダを作り、そこに全ブックを保存した場合、 \C\test となるのでしょうか?