プロが教えるわが家の防犯対策術!

マクロ初心者です。

フォーマットの同じ複数のブックのセルをコピーし、
新しいブックに羅列したいのですが、
ブック数が多く、手作業では効率が悪く、困っています。

例えば・・・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は全て同じフォーマット

マクロの構文はもちろん、設定の仕方も教えていただけないでしょうか?
よろしくお願いします。

A 回答 (3件)

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列になりません。
また、参照だと遅いので、参照式を設定し終えたら、式設定した範囲すべてを「コピー」して「形式を選択して貼り付け>値」で値にした方が良いかも?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

早速試してみました。
ブックを開かずに設定できるのは良いですね。

ただ、ブックが100近くあるので、
この作業を100回繰り返すのと、
ブックを1つ1つ開いてコピー&ペーストするのと、
所要時間の大差があまり無いのでは?と感じました。

せめて、横方向のドラッグでブック名の数字を1ずつ増やせればと思うのですが…。

どういった方法が一番良いのか、模索中です。

お礼日時:2007/06/28 00:59

こんばんは。



#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

この回答への補足

パスというのは、
例えば、Cドライブにtestというフォルダを作り、そこに全ブックを保存した場合、

\C\test

となるのでしょうか?

補足日時:2007/06/28 09:39
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
注釈が分かりやすく、設定が簡単にできました。

ALL.xlsというブックを作成し、そのSheet1セルA1を選択して、
書いてある通りにマクロを作成しました。
ついでに、Microsoft Excel ObjectフォルダのThisWorkbookに

Private Sub Workbook_Open()
Call GetData
End Sub

上のコードを付け足して、ブックを開いたときにマクロが実行されるように設定しました。

試しに、test用のブックを作って実行してみましたが、何も出てきません。

やはり、マクロの知識がほとんど無いと、難しいのでしょうか?

お礼日時:2007/06/28 09:20

こんにちは。



>やはり、マクロの知識がほとんど無いと、難しいのでしょうか?

なんと言っていいのかしらね。経験がなくても、すぐに出来る人もいれば、そうでない人もいます。ただ、たとえば、以下のような問題って、教われば簡単な話ですが、教わらないと、自力では、どうにも分からないし、どこの本にも、その出来ない原因が出てこないのです。それは、しょうがないというか、エラーの数だけ、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\ に変わります。)
    • good
    • 0
この回答へのお礼

丁寧にありがとうございます。

マクロは初心者ですが、Java言語などをVisualBasicでやったことがあったので、
引数をウオッチウィンドウで表示させて、なんとかフォルダの場所は解決できました。

おかげさまで、完璧ではありませんが、それなりに満足のいく動きをしてくれるマクロを設定できました。
本当に感謝しています。

仕事上、絶対に必要なスキルではなかったので、マクロは避けてきましたが、やはり覚えておいた方がいいのかも…。
まずは基礎を勉強して、後は経験で覚えるのが良いみたいですね。


初心者の私にでも、分かり易いようにご説明いただき、本当にありがとうございました。

お礼日時:2007/06/28 22:35

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