過去に取得済み月単位気象データを年単位に統合

1.概要

当ブログの「過去の気象データ検索からのデータ取得」で気象庁のページより取得済みのデータが溜まっていますので、 今回は、この溜まったデータの整理方法について紹介します。年単位のフォルダに保存している月単位(1月から12月)のブックを1つのブックに統合します。 月別のデータを12枚のシートと年毎に集約した気温データ一覧、気温グラフ一覧、気圧グラフ一覧、湿度グラフ一覧、風速グラフ一覧、日照時間グラフ一覧、降水量グラフ一覧を 加えた計19枚のシートを作成して纏めるものです。


2.使用方法

(1)気象庁_気象データ統合.xlsmを起動します。
(2)カレントディレクトリに作業用サブフォルダのWORKディレクリを作成し、月別ファイルを
     コピーします。※作業用のWORKフォルダは必ず作成して下さい。
(3)気象データブック統合処理ボタンをクリックします。
(4)作業用フォルダのWORK内のファイル一覧を取得して、ファイル統合処理を開始します。
(5)統合処理が完了すると、WORK内のコピー元ファイルの削除応答があるので、OKボタンを
     クリックします。※特別な用途がなければ、通常は削除して下さい。
(6)グラフ作成処理と統合ファイルの作成が全て完了したら、ダイアログのOKボタンを
     クリックして処理を終了します。
(7)統合されたファイルは、カレントディレクリに〇〇〇〇年気象情報.xlsxという形式
     で出力されるので、月別の管理フォルダと同様に気象年別統計データというフォルダを作成して
     管理すると良いと思います。

尚、作成されるシート名は、以下の通りです。(例:2020年の場合)
・2020年1月~2020年12月 (計12シート)
・気温データ一覧
・気温グラフ一覧
・気圧グラフ一覧
・湿度グラフ一覧
・日照時間グラフ一覧
・風速グラフ一覧
・降水量グラフ一覧


3.ソースコード

ソースコードは、下記の通りです。Sheet1(ブック統合処理)は、シート上に配置した 「気象データブック統合処理」ボタンのクリックイベントです。クリックすると、標準モジュールのBookcomCopyBook()の処理を実行します。 事前に作成してあるWORKフォルダ内にコピーしてある1月から12月までのブックファイルのファイル名一覧を取得してシート上に取得ファイル名一覧として 表示します。一旦、新規に作業用の一時ファイル(sample.xlsx)を作成してコピー先に設定し、フォルダ内のExcelブックを検索します。 続いて、1月から12月のフォルダ内のブックファイルをコピー先のsample.xlsxにコピーします。 不要な空きシートを削除します。これで、取りあえず、1月から12月までの月別のブックファイルが作業用のsample.xlsxにシート分けされてコピーされます。 コピー展開された各月別のシートには、気温データやグラフ類がありますので、これらのグラフ類を月別、種類別に纏めるため、12月分のシートの次のシートから グラフの集約処理を実施しています。処理が終了したら、ブック形式で名前を付けて保存後、WORKフォルダ内のデータを削除するかのダイアログを表示して OKをクリックすると、WORKフォルダ内のデータを削除して終了します。
保存したブックは、カレントディレクリにxxxx年気象情報.xlsxとして格納されていますので、管理フォルダに移動して管理するようにします。
Sheet1(ブック統合処理)
1
2
3
Private Sub MulutiCopy_Click()
   Call CopyBook
End Sub
標準モジュール : Bookcom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
***********************************************************************
' *     気象庁_気象データ統合.xlsm Ver3.0
' *
' *
' * ●気象庁_気象情報データの複数ブックファイルを1つにまとめる処理
' *
' *  新規にコピー用のワークブック(sample.xlsx)を作成して
' *  作業用のディレクトリに格納されている複数のブックファイル
' *  1つずつ取得してまとめる。
' *  シートを追加して気温のデータシートと気温グラフを1年分作成
' *  する。また、気温以外の気圧、湿度、日照時間、風速、降水量
' *  のグラフをシートを追加して、それぞれを1年分まとめる。
' *
' *
' *  初版 Ver1.0 2012.4.19 Excel2007で作成
' *  改訂 Ver2.0 2013.8.27
' *  改訂 Ver3.0 2018.3.15 Excel2016に対応
' *
' *
' ***********************************************************************
 
Option Explicit
 
Sub CopyBook()
   Dim mb           As Workbook
   Dim wb           As Workbook
   Dim myfdr        As String
   Dim fname        As String
   Dim WorkFileName As String
   Dim n            As Integer
 
   '***** コピー対象ファイル名一覧表の取得 *****
   Dim Tempdir      As String
   Dim Tempfname    As String
   Dim ft           As String
   Dim j            As Integer
 
   On Error Resume Next
 
   Workbooks("気象庁_気象データ統合.xlsm").Activate
   Tempdir = ThisWorkbook.Path & "¥work"
    
   '***** カレントディレクトリよりファイル名一覧を取得 *****
   Tempfname = Dir(Tempdir & "¥*.xlsx")
 
   '***** シート内のファイル名一覧を消去 *****
   Range("E5") = ""
   If Range("C6") <> "" Then
      Range("C6:C100").SpecialCells(xlCellTypeConstants, 23).ClearContents
   End If
    
   '***** 最初の一件を表示 *****
   ft = Tempfname
   Range("C6") = ft
    
   j = 0
   Do While ft <> ""
      j = j + 1
      ft = Dir()
      Range("C6").Offset(j, 0) = ft
   Loop
   '***** 並べ替え (降順) *****
   Range("C6:C20").Sort _
        Key1:=Range("C6") _
        , Order1:=xlAscending _
        , Header:=xlGuess _
        , MatchCase:=False _
        , Orientation:=xlTopToBottom _
        , SortMethod:=xlPinYin
         
   '***** 取得件数 *****
   Range("E5") = j
 
   '***** コピー対象ファイルが登録されていない場合 *****
   If j = 0 Then
      MsgBox "コピーするファイルが登録されていません。処理を終了します。"
      Exit Sub
   End If
 
   '***** コピー用の新規ブックを作成 *****
   Workbooks.Add                 ' 新規ブックを追加
   ' ブック形式で名前を付けて自動保存 (for Excel2007以降形式)
   Dim Outbook As Workbook
   Set Outbook = ActiveWorkbook
   Outbook.SaveAs FileName:=ThisWorkbook.Path & "¥sample.xlsx"
   '***** ブックを閉じる *****
   ActiveWorkbook.Close
   WorkFileName = ThisWorkbook.Path & "¥sample.xlsx"
 
   Application.ScreenUpdating = False      ' 画面更新を一時停止
 
   '***** 新規に作成した作業用の一時ファイルをコピー先に設定 *****
   Set mb = Workbooks.Open(WorkFileName)
    
   myfdr = ThisWorkbook.Path & "¥work"
   fname = Dir(myfdr & "¥*.xlsx", vbNormal) 'フォルダ内のExcelブックを検索
 
   Dim kensuu   As Integer
   Dim fn       As String
   Dim c        As Object
   Dim DelSheet As Object
    
   ' コピー対象ファイル数を取得 (最初の1件目はカウントされないので、kensuuに+1しておく)
   fn = fname
   Do While fn <> ""
      kensuu = kensuu + 1
      fn = Dir()
   Loop
    
   ' ファルダ内のコピーファイル件数
   kensuu = kensuu - 1
  
   '***** 1月から12月のフォルダ内のブックファイルをコピー先のsample.xlsxにコピー *****
    
   fname = Dir(myfdr & "¥*.xlsx"' フォルダ内のExcelブックを検索
   Do Until fname = Empty          ' 全て検索
      If fname <> mb.Name Then     ' ブック名がこのブックの名前でなければ
         Set wb = Workbooks.Open(myfdr & "¥" & fname)          ' そのブックを開きwbとする。
         wb.ActiveSheet.Copy after:=mb.Sheets(mb.Sheets.Count) ' 開いたシートをコピーしてmbの末尾に置く
         wb.Close (False) '有無を言わずに保存せず閉じる
 
         For Each c In mb.Sheets(mb.Sheets.Count).UsedRange    ' 取り込んだシートの使用範囲に
             If c.FormulaR1C1 Like "=*!*" Then                 ' 他シート参照があれば
                c.Value = c.Value                              ' 値に変更
             End If
         Next
          
         '***** Excel2016対策 (デフォルトのフォントで影響を受けるのを防止) *****
         Call CellFontSet
          
         n = n + 1 'ブック数をカウント
      End If
      fname = Dir()  ' フォルダ内の次のExcelブックを検索
      DoEvents
   Loop
 
   '***** 不要なSheet1~Sheet3を削除する *****
   Application.DisplayAlerts = False
   For Each DelSheet In Worksheets
           If DelSheet.UsedRange.Address(0, 0) = "A1" And _
            DelSheet.Range("A1").Value = Empty Then
            If Worksheets.Count <> 1 Then
                DelSheet.Delete
            End If
        End If
   Next
    
 
   Dim TopSheetName As String
   Dim nTMoove      As String
    
   TopSheetName = Left(Sheets(1).Name, 5)
    
   ' ************************************************************************
   ' NTFSの場合とFAT32のフォーマットによりシート位置がずれる
   ' NTFSの場合は、ファイル名の順番
   ' FAT32の場合は、ディスクに保存された順番
   ' ************************************************************************
    
   If Mid(Sheets(1).Name, 6, 2) <> "1月" Then
   ' 先頭のシートを末尾に移動 (ファイルフォーマットによって変わるため)
      nTMoove = Sheets(1).Name
      Sheets(1).Move before:=Sheets(Sheets.Count)
      Sheets(nTMoove).Move after:=Sheets(Sheets.Count)
   End If
 
 
   '●●●●● 気温データの集約シートの作成 ●●●●●
   ' 作業用一時ファイルに展開された各シートから気温データのみ取り出し
   ' 作業用シートの末尾にコピーする。(集約する)
   Dim w As Integer, z As Integer
   Dim nSheetPos       As Variant
   Dim nHeadPos        As Variant
   Dim GraphName       As String
     
   '***** データシート貼付位置 *****
   nSheetPos = Array("A2", "F2", "K2", "P2", "U2", "Z2", "A39", "F39", "K39", "P39", "U39", "Z39")
   nHeadPos = Array("A1", "F1", "K1", "P1", "U1", "Z1", "A38", "F38", "K38", "P38", "U38", "Z38")
     
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "気温データ一覧"
     
   '***** 基本データ (日付、曜日、平均、最高、最低気温データ) *****
   For z = 1 To w
      Sheets(z).Select
      Range("A2:B36,H2:J36").Select
      Selection.Copy
      Sheets("気温データ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
      Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
          SkipBlanks:=False, Transpose:=False
      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
          False, Transpose:=False
   Next
   '■ヘッド名 (月名)
   For z = 1 To w
      Sheets(z).Select
      Range("A1").Select
      Selection.Copy
      Sheets("気温データ一覧").Select
      Range(nHeadPos(z - 1)).Select
      ActiveSheet.Paste
      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
          False, Transpose:=False
   Next
   ActiveWindow.DisplayGridlines = False
    
   'Application.WindowState = xlMinimized
 
   ' ▼▼▼▼▼▼▼ グラフの集約 ▼▼▼▼▼▼▼
 
   ' ***** グラフ関連の貼付位置 (全グラフ共通) *****
   nSheetPos = Array("A2", "A26", "A50", "A74", "A98", "A122", "A146", "A170", "A194", "A218", "A242", "A266")
   nHeadPos = Array("F24", "F48", "F72", "F96", "F120", "F144", "F168", "F192", "F216", "F240", "F264", "F288")
     
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "気温グラフ一覧"
     
   ' ***** 気温グラフ *****
   For z = 1 To w - 1
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(1).Activate
      ActiveChart.ChartArea.Copy
      Sheets("気温グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■気温タイトル名
   For z = 1 To w - 1
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "気温の推移(平均、最高、最低)"
      Sheets("気温グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■気温グラフタイトルのフォント変更
      Call TitlefontSet
   Next
 
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "気圧グラフ一覧"
     
   ' ***** 気圧グラフ *****
   For z = 1 To w - 2
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(2).Activate
      ActiveChart.ChartArea.Copy
      Sheets("気圧グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■気圧タイトル名
   For z = 1 To w - 2
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "気圧の推移(現地、海面)"
      Sheets("気圧グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■気圧グラフタイトルのフォント変更
      Call TitlefontSet
   Next
     
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "湿度グラフ一覧"
     
   ' ***** 湿度グラフ *****
   For z = 1 To w - 3
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(3).Activate
      ActiveChart.ChartArea.Copy
      Sheets("湿度グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■湿度タイトル名
   For z = 1 To w - 3
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "湿度の推移(平均、最小)"
      Sheets("湿度グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■湿度グラフタイトルのフォント変更
      Call TitlefontSet
   Next
  
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "日照時間グラフ一覧"
     
   ' ***** 日照時間グラフ *****
   For z = 1 To w - 4
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(4).Activate
      ActiveChart.ChartArea.Copy
      Sheets("日照時間グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■日照時間タイトル名
   For z = 1 To w - 4
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "日照時間の推移"
      Sheets("日照時間グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■日照時間グラフタイトルのフォント変更
      Call TitlefontSet
   Next
 
   w = Workbooks("sample.xlsx").Worksheets.Count
 
   Sheets.Add after:=Sheets(Sheets.Count)
   Sheets(w + 1).Select
   Sheets(w + 1).Name = "風速グラフ一覧"
     
   ' ***** 風速グラフ *****
   For z = 1 To w - 5
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(5).Activate
      ActiveChart.ChartArea.Copy
      Sheets("風速グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■風速タイトル名
   For z = 1 To w - 5
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "風速(平均、最大)の推移"
      Sheets("風速グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■風速グラフタイトルのフォント変更
      Call TitlefontSet
    Next
 
    w = Workbooks("sample.xlsx").Worksheets.Count
 
    Sheets.Add after:=Sheets(Sheets.Count)
    Sheets(w + 1).Select
    Sheets(w + 1).Name = "降水量グラフ一覧"
     
   ' ***** 降水量グラフ *****
   For z = 1 To w - 6
      Sheets(z).Select
      Sheets(z).Activate
      ActiveSheet.ChartObjects(6).Activate
      ActiveChart.ChartArea.Copy
      Sheets("降水量グラフ一覧").Select
      Range(nSheetPos(z - 1)).Select
      ActiveSheet.Paste
   Next
         
   '■降水量タイトル名
   For z = 1 To w - 6
      Sheets(z).Select
      Sheets(z).Activate
      Range("A1").Select
      GraphName = Range("A1")
      GraphName = GraphName & "降水量(合計、1時間、10分間)の推移"
      Sheets("降水量グラフ一覧").Select
      Range(nHeadPos(z - 1)).Select
      Range(nHeadPos(z - 1)) = GraphName
        
      '■降水量グラフタイトルのフォント変更
      Call TitlefontSet
   Next
 
   Sheets(1).Select
 
   Application.ScreenUpdating = True  ' 画面更新一時停止を解除
     
   '▼▼▼▼▼ 後処理 ▼▼▼▼▼
 
   '***** ブック形式で名前を付けて自動保存 *****
   Dim Savebook As Workbook
   Dim NewName  As String
   Dim rc       As VbMsgBoxResult
    
   Set Savebook = ActiveWorkbook
 
   '***** 格納ファイル名 *****
   NewName = "¥" & TopSheetName & "気象情報.xlsx"
   Savebook.SaveAs FileName:=ThisWorkbook.Path & NewName
  '***** ブックを閉じる *****
   ActiveWorkbook.Close
 
   '***** 一時作成した sample.xlsx を削除する *****
   Kill ThisWorkbook.Path & "¥sample.xlsx"
 
   '***** 確認メッセージを非表示にする *****
   Application.DisplayAlerts = True
 
   '***** コピー元ファイルの削除確認 *****
   rc = MsgBox("¥WORKのコピー元ファイルを削除しますか?", vbYesNo + vbQuestion)
   If rc = vbYes Then
      Kill ThisWorkbook.Path & "¥WORK¥*.xlsx"
   End If
 
 
   '***** マクロ画面に戻る *****
   Workbooks("気象庁_気象データ統合.xlsm").Activate
 
   MsgBox n & "件のブックをコピーしましました。"
 
   '***** ファイル名一覧を消去 *****
   Range("E5") = ""
   If Range("C6") <> "" Then
      Range("C6:C100").SpecialCells(xlCellTypeConstants, 23).ClearContents
   End If
   Range("A1").Select
End Sub
 
'***** 各グラフのタイトルフォント設定 *****
Sub TitlefontSet()
    With Selection
         .Font.Size = 11
         .Font.Bold = True
         .Font.Name = "MS Pゴシック"
    End With
    ActiveWindow.DisplayGridlines = False
End Sub
 
'***** 表の体裁統一のため *****
Sub CellFontSet()
    Cells.Select
    With Selection.Font
        .Name = "MS Pゴシック"
        .Size = 10
    End With
        
    Rows("1:1").Select
    Selection.RowHeight = 22.5
    Rows("2:300").Select
    Selection.RowHeight = 13.5
    Range("A2").Select
End Sub

4.ダウンロード

提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。

紹介したExcel VBAマクロは、下記よりダウンロードして下さい。

ダウンロード

■関連記事
・過去の気象データ検索からのデータ取得

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

キーボードのキーコードの一覧表