日報データを整形する

背景

サイボウズから書き出した日報を、
見やすいように担当者ごとにシートをわけて、整形したい。
月初に前月分まとめなくちゃいけない。
(1月のはじめに、12月分をつくる)

かんたんなイメージをつけると・・・

これがサイボウズから書き出したCSVExcelで開いたところ。

それを、こうします。

書いたもの

Option Explicit

'-----仕様-----------------------------------------
'サイボウズの日報アプリより書き出したCSVファイルを、
'各月、各担当者ごとにまとめなおして保存する。
'--------------------------------------------------


'-----サイボウズのデータから、作成する月、担当者をソートする。データを新しいシートにコピーして整形する。
'-----サイボウズデータのファイルをひらいてこのマクロを実行するようにする

 
Sub MakeReport()
    '---画面が動かないよう固定
    Application.ScreenUpdating = False
        
        '---ポップアップで作成する月を取得
        Dim ReportMonth As String       '作成する月
        ReportMonth = InputBox("何月の報告書をまとめますか?", "入力してください")
        
        '---作成する年を取得。12月を作成する場合は、(現在の年-1)が作成する年
        Dim ReportYear As String        '作成する年
        If ReportMonth = 12 Then
            ReportYear = Year(Date) - 1
        Else
            ReportYear = Year(Date)
        End If
           
           
            '---作成する担当者ごとに繰り返し処理するため、配列に格納。
            Dim ReportPerson(0 To 2) As String
            
            ReportPerson(0) = "Aさん"
            ReportPerson(1) = "Bさん"
            ReportPerson(2) = "Cさん"

            
            Dim report As Variant       'Eachステートメントの変数はVariantのみ
            For Each report In ReportPerson
         
                '---担当者名のシートを作成
                Sheets.Add After:=Sheets(Sheets.Count)
                Sheets(Sheets.Count).Name = CStr(report)    'Variant型をString型に変換しながら
                
                '---A列から担当者をソート
                Sheets(1).Select
                Range("A1").AutoFilter field:=1, Criteria1:=CStr(report)
                
                '---B列から月をソート
                Dim SortMonth As String
                SortMonth = ReportYear & "/" & ReportMonth & "/" & "1"
                Range("B1").AutoFilter field:=2, Operator:=xlFilterValues, Criteria2:=Array(1, SortMonth)
                
                '---該当箇所を担当者名のシートにコピー
                Range("A1").CurrentRegion.Copy Sheets(CStr(report)).Range("A1")
                
                '---オートフィルタの設定を解除
                Range("A1").AutoFilter
                    
                Sheets(CStr(report)).Select
            
                '---印刷の向きを横にする
                ActiveSheet.PageSetup.Orientation = xlLandscape
                
                '---Aを削除(シート名が担当者名になっているので削除してOK)
                Columns("A:A").Delete
                
                '---表示する日付形式を変える
                Columns("A:A").NumberFormatLocal = "m""月""d""日"";@"
                
                '---A〜Bのサイズを変える
                Columns("A:B").ColumnWidth = 9
                
                '---C〜Fのサイズを変える
                Columns("C:F").ColumnWidth = 14
                
                '---C〜Gを「折り返して全体を表示する」
                Columns("C:G").WrapText = True
                
                '---Gのサイズを変えて、「折り返して全体を表示する」
                Columns("G:G").ColumnWidth = 55
                
                '---高さを自動調整
                Rows.AutoFit
            
            Next report
    
    '---画面固定を解除
    Application.ScreenUpdating = True


End Sub

書いてみて

エラー処理ってどうやって検討して書けばいいのかしら?
配列ちゃんとかけてよかった!
ループの要素変数はVariant型しかだめなので、
それをString型に変換しながら利用しなくちゃいけないところが気づけてよかった。
来年からまたおばあちゃんの仕事がひとつ減る。