
VBA初心者です。
ブック内の複数シートを
ひとつにまとめる方法について
検索していて見つけた・・・・
Sub Sample()
Dim sWS As Worksheet 'データシート(コピー元)
Dim dWS As Worksheet '集約用シート(コピー先)
Set dWS = Worksheets("AllData")
'集約用シートの2行目以降を削除
dWS.UsedRange.Offset(1, 0).Clear
'各シートの2行目以降のデータを、集約用シートの末尾にコピー
For Each sWS In Worksheets
If sWS.Name <> dWS.Name Then
With sWS.UsedRange
'コピー元シートにデータが1件以上ある場合
If .Rows.Count > 1 Then
.Offset(1, 0).Resize(.Rows.Count - 1).Copy _
Destination:=dWS.Cells(Rows.Count, 1). _
End(xlUp).Offset(1, 0)
End If
End With
End If
Next sWS
'集計用シートをA列で並べ替え
dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub
こちらのやり方でばっちりだったのですが
問題点がひとつだけ。
まとめたシートのみでOKなのですが
見出し行の上に工事名やら期間やらを入力する
3~4行を空けておきたいのです。
3~4行・・・・
任意の行数を空けて
その下にまとめる方法を
教えていただけないでしょうか?
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
No.3・4です。
>1行目のSub Sample1()を
>Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
>に置き換えるだけではダメでした。
ダメとは全く反応しない!というコトでしょうか?
もしかしてそのまま標準モジュールに記載していませんか?
そうだとすれば、「Workbookのイベントプロシージャ」でなければ動きません。
VBE画面の左側の下にある「This Workbook」をダブルクリックし、表示されたVBE画面上に
>Sub Sample1()
を
>Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
に変更してそのままコピー&ペーストしてみてください。
※ もちろん「標準モジュール」のコードは不要なので消去します。m(_ _)m
No.4
- 回答日時:
No.3です。
投稿後気づきました。
並び替えが必要でしたね。
前回のコードの
>Next k
の次に
>.Range("A5").Sort key1:=Range("A5"), order1:=xlAscending, Header:=xlYes
の1行を追加してください。
どうも失礼しました。m(_ _)m
ありがとうございます!
動きました!
感謝です!
あともうひとつ教えていただけないでしょうか?
上書き保存したら
自動でこのコードが実行されるようにするには
どうすればいいですか?
1行目のSub Sample1()を
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
に置き換えるだけではダメでした。
まったく理解できていないもので・・・
お時間ございましたら
また教えていただけると
大変助かります。
よろしくお願いします。
No.3
- 回答日時:
こんばんは!
他の方がお考えになったコードに手を付けるのは好みでないので、こちらで勝手にやってみました。
「AllData」シートの5行目に項目名があらかじめ入力してある!という前提です。
尚、「AllDate」シート以外は1行目が項目行になっていて、項目数(列数)はすべて同じ列数だという前提です。
標準モジュールです。
Sub Sample1()
Dim k As Long, lastRow As Long, lastCol As Long
Dim wS As Worksheet
With Worksheets("AllData")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(5, Columns.Count).End(xlToLeft).Column '//←5行目に項目行があるとする//
If lastRow > 5 Then
Range(.Cells(6, "A"), .Cells(lastRow, lastCol)).Clear
End If
For k = 1 To Worksheets.Count
If Worksheets(k).Name <> .Name Then
Set wS = Worksheets(k)
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(wS.Cells(2, "A"), wS.Cells(lastRow, lastCol)).Copy .Cells(Rows.Count, "A").End(xlUp).Offset(1)
End If
End If
Next k
.Activate
End With
MsgBox "完了"
End Sub
※ 各シートのA列で最終行を取得するようにしていますので、
A列には最終行まで何らかのデータが入っているとします。
これで「AllData」シートの6行目以降にコピー&ペーストできると思います。
A1セルに何らかのデータが入っていれば、
>UsedRange.Rows.Count
で最終行
>UsedRange.Columns.Count
で最終列
がそれぞれ取得できますが、途中のセルからデータが入っていると
とんでもない行(列)になります。
※ 個人的に「UsedRange」は極力使わないようにしています。
データがなくても罫線などが入っていれば最終行(最終列)が変わってきます。
(データの消去や書式をクリアしても「UsedRange」のままです)m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVlookup関数の制限について
-
文字の色も参照 VLOOKUP
-
エクセルで、チェックボックス...
-
エクセルの保護で、列の表示や...
-
【マクロ】【配列】3つのシー...
-
【条件付き書式】countifsで複...
-
Excelのセルの色を変えた行(す...
-
Excelでの並べ替えを全シートま...
-
エクセルの列の限界は255列以上...
-
シートをまたぐ条件付き書式に...
-
エクセル複数シートのデータを...
-
VLOOKアップ関数の結果の...
-
EXCEL 関数を教えてください。...
-
【VBA】複数のシートの指定した...
-
excel 複数のシートの同じ場所...
-
Excelに自動で行の増減をしたい...
-
エクセル マクロ 標準モジュー...
-
Excel の複数シートの列幅を同...
-
SUMIF関数で4万件以上だと計算...
-
エクセルマクロでデータ出力の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】【配列】3つのシー...
-
文字の色も参照 VLOOKUP
-
【条件付き書式】countifsで複...
-
ExcelのVlookup関数の制限について
-
エクセルの保護で、列の表示や...
-
Excelのセルの色を変えた行(す...
-
エクセルで、チェックボックス...
-
VBAで繰り返しコピーしながら下...
-
シートをまたぐ条件付き書式に...
-
Excelでの並べ替えを全シートま...
-
Excel の複数シートの列幅を同...
-
エクセルの列の限界は255列以上...
-
SUMPRODUCTにて別シートのデー...
-
VLOOKアップ関数の結果の...
-
excel 複数のシートの同じ場所...
-
【VBA】複数のシートの指定した...
-
Excelに自動で行の増減をしたい...
-
エクセル マクロ 標準モジュー...
-
Excel 2段組み
-
スプレッドシートでindexとIMPO...
おすすめ情報
1行目の
Sub Sample()を
上書き保存で実行されるよう
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
に、書き換えました。
で、
'集約用シートの5行目以降を削除
dWS.UsedRange.Offset(4, 0).Clear
に入れ替えるました。
で、
上書すると、古いデータの1行目が削除されずに残り
上書を重ねるたびに
同じデータがその下へ下へと重なり続けていきます。
上書する前に
見出しより下はいったん削除したのち、
あたらしいデータを入れ直してほしいのですが
もう、どこを直せばいいのやら。
お時間ございましたら
また教えていただけると助かります。