複数のシートをコピーして1つのシートに縦にまとめるエクセルVBA
ブックにある複数のシートを1つのシートに縦にまとめるエクセルVBAをご紹介します。
次のサンプルコードを使うと、
- 「ファイルを開く」ダイアログを表示。
- シートをまとめたいエクセルブックを選択。
- 選択したエクセルブックに、集約用シートを追加。
- エクセルブックに含まれる全シートをコピー、集約用シートにまとめる。
という作業を自動化します。
処理イメージ
エクセルブック内にある複数シートをコピー、集約シートを追加して縦に貼り付けてまとめます。
操作方法
1、
下記サンプルコードを含むエクセルファイルを開き→「開発」→「マクロ」の順でクリック。
「Aシート縦に集約」→「実行」の順でクリック。
2、
ファイルを開くダイアログが表示されるので、シートをまとめたい対象のエクセルブックをクリックして、「開く」をクリック。
3、
マクロが実行されます。
「集約シート」を追加、各シートをコピーして、
「集約シート」に各シートのデータを縦向きに貼り付けます。
完了です。
サンプルコード
Sub Aシート縦に集約()
Dim sWS As Worksheet 'データシート
Dim dWS As Worksheet '集約用シート
Dim s_row As Long 'データシートの最終行数
Dim d_row As Long '集約用シートの最終行数
Dim OpenFileName As String
'ファイルを開くダイアログを表示
OpenFileName = Application.GetOpenFilename("Excelファイル,*.xls*")
'キャンセル時の処理
If OpenFileName = "False" Then
'メッセージ表示
MsgBox "キャンセルされました。処理を終了します。"
End
Else
Workbooks.Open OpenFileName
End If
'画面更新停止
Application.ScreenUpdating = False
'確認ダイアログ停止
Application.DisplayAlerts = False
'集約シートがあるか確認
For Each sh In Sheets
If sh.Name = "集約シート" Then
flag = True
Exit For
End If
Next sh
If flag = True Then
Dim rc As Integer
'メッセージ表示
rc = MsgBox("シート「集約シート」を上書きしますか?" & Chr(13) & "※この処理は戻せません", vbYesNo + vbQuestion, "確認")
If rc = vbYes Then
'画面更新停止
Application.ScreenUpdating = False
'シート選択
Worksheets("集約シート").Activate
'シート削除
ActiveSheet.Delete
'画面更新停止
Application.ScreenUpdating = True
'メッセージ表示
MsgBox "処理前のシート「集約シート」は削除済みです"
'シート追加
Worksheets.Add before:=Worksheets(1)
'シート名変更
ActiveSheet.Name = "集約シート"
'シート選択
Worksheets("集約シート").Activate
Set dWS = Worksheets("集約シート")
'ブックを上書き保存
ActiveWorkbook.Save
'集約用シートの最終行数に1を代入
d_row = 1
'各シートにコードを実行
For Each sWS In Worksheets
'sWSとdWSのシート名が一致しない場合
If sWS.Name <> dWS.Name Then
With sWS.UsedRange
'シートsWSをアクティブにする
sWS.Activate
'シートの最終セルを選択する
ActiveCell.SpecialCells(xlLastCell).Select
'最終セルの行を取得、変数に代入
s_row = ActiveCell.row
'最終行から1行目までを選択
Rows(1 & ":" & s_row).Select
'最終行から1行目までをコピー
Selection.Copy
'集約用シートを選択
dWS.Activate
'行を選択
Rows(d_row).Select
'コピーしたデータを貼り付け
ActiveSheet.Paste
'シートの最終セルを選択する
ActiveCell.SpecialCells(xlLastCell).Select
'最終セルの行を取得、変数に代入
d_row = ActiveCell.Offset(1, 0).row
End With
End If
Next sWS
Else
'メッセージ表示
MsgBox "キャンセルされました。処理を終了します。"
End If
Else
'シート追加
Worksheets.Add before:=Worksheets(1)
'シート名変更
ActiveSheet.Name = "集約シート"
'シート選択
Worksheets("集約シート").Activate
Set dWS = Worksheets("集約シート")
'集約用シートのセルを全削除
Worksheets("集約シート").Cells.Select
Selection.Delete Shift:=xlUp
'ブックを上書き保存
ActiveWorkbook.Save
'集約用シートの最終行数に1を代入
d_row = 1
'各シートにコードを実行
For Each sWS In Worksheets
'sWSとdWSのシート名が一致しない場合
If sWS.Name <> dWS.Name Then
With sWS.UsedRange
'シートsWSをアクティブにする
sWS.Activate
'シートの最終セルを選択する
ActiveCell.SpecialCells(xlLastCell).Select
'最終セルの行を取得、変数に代入
s_row = ActiveCell.row
'最終行から1行目までを選択
Rows(1 & ":" & s_row).Select
'最終行から1行目までをコピー
Selection.Copy
'集約用シートを選択
dWS.Activate
'行を選択
Rows(d_row).Select
'コピーしたデータを貼り付け
ActiveSheet.Paste
'シートの最終セルを選択する
ActiveCell.SpecialCells(xlLastCell).Select
'最終セルの行を取得、変数に代入
d_row = ActiveCell.Offset(1, 0).row
End With
End If
Next sWS
End If
End Sub
コードの特徴
- 「ファイルを開く」ダイアログを表示した後、キャンセルをクリックした場合、
キャンセル処理される様に対応しています。 - セル、行、列に空白がある場合でも、
シート毎のデータが含まれる最終行からA行までをコピーして集約します。 - 集約用にシート「集約シート」を作成します。
同名シートが既にある場合、同名シートを削除するかの確認ダイアログを表示させ、
削除するかどうかを選択可能です。
Author And Source
この問題について(複数のシートをコピーして1つのシートに縦にまとめるエクセルVBA), 我々は、より多くの情報をここで見つけました https://qiita.com/skillhunter007/items/2075ce5fe0c147253e63著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .