マクロ初心者です。
フォーマットの同じ複数のブックのセルをコピーし、
新しいブックに羅列したいのですが、
ブック数が多く、手作業では効率が悪く、困っています。
例えば・・・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は全て同じフォーマット
マクロの構文はもちろん、設定の仕方も教えていただけないでしょうか?
よろしくお願いします。
No.1
- 回答日時:
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ずつ増やせればと思うのですが…。
どういった方法が一番良いのか、模索中です。
No.2ベストアンサー
- 回答日時:
こんばんは。
#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
となるのでしょうか?
回答ありがとうございます。
注釈が分かりやすく、設定が簡単にできました。
ALL.xlsというブックを作成し、そのSheet1セルA1を選択して、
書いてある通りにマクロを作成しました。
ついでに、Microsoft Excel ObjectフォルダのThisWorkbookに
Private Sub Workbook_Open()
Call GetData
End Sub
上のコードを付け足して、ブックを開いたときにマクロが実行されるように設定しました。
試しに、test用のブックを作って実行してみましたが、何も出てきません。
やはり、マクロの知識がほとんど無いと、難しいのでしょうか?
No.3
- 回答日時:
こんにちは。
>やはり、マクロの知識がほとんど無いと、難しいのでしょうか?
なんと言っていいのかしらね。経験がなくても、すぐに出来る人もいれば、そうでない人もいます。ただ、たとえば、以下のような問題って、教われば簡単な話ですが、教わらないと、自力では、どうにも分からないし、どこの本にも、その出来ない原因が出てこないのです。それは、しょうがないというか、エラーの数だけ、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でやったことがあったので、
引数をウオッチウィンドウで表示させて、なんとかフォルダの場所は解決できました。
おかげさまで、完璧ではありませんが、それなりに満足のいく動きをしてくれるマクロを設定できました。
本当に感謝しています。
仕事上、絶対に必要なスキルではなかったので、マクロは避けてきましたが、やはり覚えておいた方がいいのかも…。
まずは基礎を勉強して、後は経験で覚えるのが良いみたいですね。
初心者の私にでも、分かり易いようにご説明いただき、本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/08/04 13:56
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル初心者です 関数の入れ...
-
【関数】先頭だけにある、半角...
-
エクセル 白黒印刷で白線を印刷...
-
Excelのチェックボックスの使い...
-
【関数】適切な文字数の数字を...
-
Excelのpivotについて質問です
-
Excel ピボットテーブルで日付...
-
LOOKUP関数を使えばいいのでし...
-
エクセル関数を教えてください
-
エクセルのセルに同じ大きさの...
-
UNIQUE関数が使えないバージョ...
-
excelの不要な行の削除ができな...
-
エクセルで「-0.0」と表示さ...
-
時間によってファイル名が変わ...
-
WPS OFFICEでの縦書きについて
-
エクセルの関数について教えて...
-
Aというブックの1というシート...
-
【マクロ】シート名を取得する...
-
VBA Private Sub Worksheet_Cha...
-
VBA、Excelのworkbook.open に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報