過去に取得済み月単位気象データを年単位に統合
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(ブック統合処理)は、シート上に配置した 「気象データブック統合処理」ボタンのクリックイベントです。クリックすると、標準モジュールのBookcomの CopyBook()の処理を実行します。 事前に作成してあるWORKフォルダ内にコピーしてある1月から12月までのブックファイルのファイル名一覧を取得してシート上に取得ファイル名一覧として 表示します。一旦、新規に作業用の一時ファイル(sample.xlsx)を作成してコピー先に設定し、フォルダ内のExcelブックを検索します。 続いて、1月から12月のフォルダ内のブックファイルをコピー先のsample.xlsxにコピーします。 不要な空きシートを削除します。これで、取りあえず、1月から12月までの月別のブックファイルが作業用のsample.xlsxにシート分けされてコピーされます。 コピー展開された各月別のシートには、気温データやグラフ類がありますので、これらのグラフ類を月別、種類別に纏めるため、12月分のシートの次のシートから グラフの集約処理を実施しています。処理が終了したら、ブック形式で名前を付けて保存後、WORKフォルダ内のデータを削除するかのダイアログを表示して OKをクリックすると、WORKフォルダ内のデータを削除して終了します。
保存したブックは、カレントディレクリにxxxx年気象情報.xlsxとして格納されていますので、管理フォルダに移動して管理するようにします。
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介したExcel VBAマクロは、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・過去の気象データ検索からのデータ取得
2.使用方法 (1)気象庁_気象データ統合.xlsmを起動します。
(2)カレントディレクトリに作業用サブフォルダのWORKディレクリを作成し、月別ファイルを
コピーします。※作業用のWORKフォルダは必ず作成して下さい。
(3)気象データブック統合処理ボタンをクリックします。
(4)作業用フォルダのWORK内のファイル一覧を取得して、ファイル統合処理を開始します。
(5)統合処理が完了すると、WORK内のコピー元ファイルの削除応答があるので、OKボタンを
クリックします。※特別な用途がなければ、通常は削除して下さい。 (6)グラフ作成処理と統合ファイルの作成が全て完了したら、ダイアログのOKボタンを
クリックして処理を終了します。 (7)統合されたファイルは、カレントディレクリに〇〇〇〇年気象情報.xlsxという形式
で出力されるので、月別の管理フォルダと同様に気象年別統計データというフォルダを作成して
管理すると良いと思います。
尚、作成されるシート名は、以下の通りです。(例:2020年の場合)
・2020年1月~2020年12月 (計12シート)
・気温データ一覧
・気温グラフ一覧
・気圧グラフ一覧
・湿度グラフ一覧
・日照時間グラフ一覧
・風速グラフ一覧
・降水量グラフ一覧
3.ソースコード ソースコードは、下記の通りです。Sheet1(ブック統合処理)は、シート上に配置した 「気象データブック統合処理」ボタンのクリックイベントです。クリックすると、標準モジュールのBookcomの CopyBook()の処理を実行します。 事前に作成してあるWORKフォルダ内にコピーしてある1月から12月までのブックファイルのファイル名一覧を取得してシート上に取得ファイル名一覧として 表示します。一旦、新規に作業用の一時ファイル(sample.xlsx)を作成してコピー先に設定し、フォルダ内のExcelブックを検索します。 続いて、1月から12月のフォルダ内のブックファイルをコピー先のsample.xlsxにコピーします。 不要な空きシートを削除します。これで、取りあえず、1月から12月までの月別のブックファイルが作業用のsample.xlsxにシート分けされてコピーされます。 コピー展開された各月別のシートには、気温データやグラフ類がありますので、これらのグラフ類を月別、種類別に纏めるため、12月分のシートの次のシートから グラフの集約処理を実施しています。処理が終了したら、ブック形式で名前を付けて保存後、WORKフォルダ内のデータを削除するかのダイアログを表示して OKをクリックすると、WORKフォルダ内のデータを削除して終了します。
保存したブックは、カレントディレクリにxxxx年気象情報.xlsxとして格納されていますので、管理フォルダに移動して管理するようにします。
Private Sub MulutiCopy_Click() Call CopyBook End Sub
***********************************************************************
' * 気象庁_気象データ統合.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マクロは、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・過去の気象データ検索からのデータ取得






コメント
コメントを投稿