2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

複数のシートのデータを1つのシートにまとめるマクロ

Posted at

#はじめに
私はプログラミングを勉強をはじめて
約1年半。

業務上複数あるシートを
1枚のシートにした上であれこれやる必要が生じた。
ただ、そのシートがあまりにも多すぎたし、
コピペするのも馬鹿馬鹿しくなったので
せっかくだから勉強してコードを書いてみた。

#状況
例えばこのような売上表(売上金額.xlsx)あったとする。

日付 売上金額
1/1 50,000
1/2 60,000
1/31 40,000

このシートは1月分で
2月から12月もそれぞれのシートで管理されていたりする。

この各月ごとに別れているシートを
1/1から12/31までつながったデータにしたい場合、

日付 売上金額
1/1 50,000
1/2 60,000
12/30 1,000,000
12/31 1,000

この程度ならば、
2月分をコピーし、1月の最下段に貼り付けを
12月まで繰り返せばできる。

あくまでこれは例の話だが、
このシートがたくさんある場合や、
日付などでなく連続性がない場合など
ヒューマンエラーも起りやすそうな作業となる。

#コード


Sub function()

 '画面更新停止
 Application.ScreenUpdating = False
  
  '確認ダイアログ停止
  Application.DisplayAlerts = False

  'コピー元になるブック
  Dim CopyWB As Workbook
  'コピー元になるシート
  Dim CopyWS As Worksheet
  '貼り付け用のシート
  Dim PasteWS As Worksheet
    
  'コピー元になるシートの最終行
  Dim max_row As Long
  'コピー元になるシートの最終列
  Dim max_column As Long
  
  '貼付用のシートの最終行
  Dim last_row As Long
  'もとになるシートの名前
  Dim OpenFileName As String
  
  '貼付用のシートはこのブックのsheet1
  Set PasteWS = ThisWorkbook.Sheets("sheet1")
  
  'ファイルを開くダイアログを表示
  OpenFileName = Application.GetOpenFilename("Excelファイル,*.xls*")

  'キャンセルの時の処理
  If OpenFileName = "False" Then
    'メッセージ表示
    MsgBox "キャンセルされました"
    End
  
  Else

  '貼付用シートを初期化
    dWS.Cells.Clear
    dWS.Cells.ClearFormats
    '元になるブック を開く
    Workbooks.Open OpenFileName
    Set CopyWB = ActiveWorkbook
    
  End If

  i = 0
  
  '元になるそれぞれのシートにおいて
  For Each CopyWS In CopyWB.Worksheets
    
    With CopyWS
   
      'CopyWSシートをアクティブに
      .Activate
      
      '最終行と列を求める
      max_row = .Range("A1").End(xlDown).Row
      max_column = .Range("A1").End(xlToRight).Column
      
      1枚目のシートの先頭行はそのまま張り付ける
      If i = 0 Then
      
        .Range(.Range("A1"), .Cells(4, max_column)).Copy
        PasteWS.Cells(1, 1).PasteSpecial (xlPasteAll)
        
      End If
      
      'A1セルから右下セルまでコピー
      .Range(.Cells(1, 1), .Cells(max_row, max_column)).Copy
      
      '貼り付け用シートの最下段を取得
      last_row = PasteWS.Cells(Rows.Count, 1).End(xlUp).Row
      
      
      '貼り付け
      PasteWS.Cells(last_row + 1, 1).PasteSpecial (xlPasteAll)
     
    End With
    
  Next sWS


  '元データを変更せずに閉じる
  Call sWB.Close(SaveChanges:=False)
  
  
  '貼付用シートをアクティブに
  dWS.Activate
  
 'A1セルに戻ってくる
  dWS.Range("A1").Activate
  ActiveWindow.ScrollRow = 1
  ActiveWindow.ScrollColumn = 1
  
End Sub

#まとめ
このマクロをもつエクセルファイルでから
この処理を実行すると、ファイルを開く画面が出る。
元となるデータのエクセルファイルを開くと、
各シートのデータをまとめて、
sheet1に書き出してくれる。
元データはそのまま閉じてしまうし、
A1セルがアクティブになった状態で、画面も表示されるようにしている。

簡単なところから自動化や単純化をすすめることで
普段の作業性UPやミスが減らせるので、
引き続きプログラミングの学習を進めていきます。

ありがとうございました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?