Untidy Bookshelves

アクセスカウンタ

zoom RSS *** 気象庁HPから日別の降雪量を取り込んでみた ***

<<   作成日時 : 2013/05/19 23:58   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 ○○地方のアメダス地点の日別降雪量を取り込みたいという要望がありました。
 前にそんなのを作ったような記憶が・・・。
 過去のファイルを探してみたら、半年前に北海道用に作成したマクロがそのまま流用出来ました。

 残しておいても、忘れることは確実ですが、取り急ぎ、備忘録的に残しておきます。

 <main>タブに設定した地点・年度のデータを<data>タブに取り込む。
 <data>タブに取り込まれるのは、地点ごと・月ごとのデータ。
 取り込む月は年度で指定した年の10月〜12月、および翌年の1〜4月。
 地点ごと・月ごとに取り込んだデータは別のタブ・<20xx年度>にコピー。

 以上がこのマクロでやりたいこと。

 <main>タブでの設定はこんな感じ。
 prec_no、block_noは気象庁HPのURLにしたがったもの。block_noはpoint_noでよい気もしますが・・・。
 prec_noは支庁(北海道の場合)や都府県に対応した2桁のコードで、アメダス地点番号の上2桁と同じ。
 block_noが少々ややこしく、気象台・測候所(廃止されたものを含む)は国際地点番号。
 それ以外は、アメダス地点番号・・・とは無関係の番号。
 なので、アメダス地点番号の一覧表をそのまま使えず、手打ちしなくてはいけないのがうっとうしいです。

画像

 以下、マクロの記述――。
 シノップ(気象台・測候所)とふつうのアメダス(気象台・測候所以外)を分けたのはデータの入り方が違うから。
 データの入り方が違うのは、観測要素が違うから、当然といえば当然。
 でも、観測要素以外でデータの入り方が違うとは、思いもよらないことでした。。

-------------------------------------------------------------------------------
Public i, m, y, xx As Single
Public kd(30) As String

Sub Macro1()

Dim pn(30) As Single
Dim bn(30) As String

Sheets("main").Select

y = Cells(6, 6)  '年度
n = Cells(4, 6)  '地点数

For i = 1 To n

pn(i) = Cells(i + 1, 2) '支庁コード
bn(i) = Cells(i + 1, 3) '地点コード
If bn(i) < 10000 Then
bn(i) = Format(bn(i), "0000")
kd(i) = "a" 'アメダス
Else
kd(i) = "s" 'シノップ
End If
Next i

-------------------------------------------------------------------------------

 Webからデータを取り込むところは、例によって「マクロの記録」で。
 未だにそれぞれの行の意味を分かっていません、例によって流してしまいました。。

-------------------------------------------------------------------------------
For i = 1 To n

xx = 0

For m = 11 To 12

Sheets("data").Select

Cells.Select
Selection.Clear

With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.data.jma.go.jp/obd/stats/etrn/view/daily_" & kd(i) & "1.php?prec_no=" & pn(i) & "&block_no=" & bn(i) & "&year=" & y & "&month=" & m & "&day=&view=" _
, Destination:=Range("$A$1"))
.Name = _
"daily_a1.php?prec_no=12&block_no=1055&year=2012&month=1&day=&view=_1"
   (中略)
End With

Call コピー

Next m

For m = 1 To 4

Sheets("data").Select

Cells.Select
Selection.Clear

With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.data.jma.go.jp/obd/stats/etrn/view/daily_" & kd(i) & "1.php?prec_no=" & pn(i) & "&block_no=" & bn(i) & "&year=" & y + 1 & "&month=" & m & "&day=&view=" _
, Destination:=Range("$A$1"))
.Name = _
"daily_a1.php?prec_no=12&block_no=1055&year=2012&month=1&day=&view=_1"
   (中略)
End With

Call コピー

Next m
Next i

End Sub

-------------------------------------------------------------------------------

 <data>タブに取り込んだデータを<20xx年度>にコピーする部分のマクロ。
 コピーする行数は月によって変わるので、先頭と末尾を指定する必要があります。
 先頭は、日にちが記述されているA列で「1」が入っている行、というのは問題ありません。
 ところが、末尾は大問題。
 ここでシノップ(気象台・測候所)とふつうのアメダス(気象台・測候所以外)を分けることになるとは・・・。

-------------------------------------------------------------------------------
Sub コピー()

Application.ScreenUpdating = False


Sheets("data").Select

For j = 1 To 47
If Cells(j, 1) = 1 Then
st = j
End If
Next j

For j = st To 47
If kd(i) = "a" Then
If Cells(j, 1) = "" Then
ed = j - 1
GoTo 100
End If
ElseIf kd(i) = "s" Then
If Cells(j, 1) = "データに付加している記号の意味 " Then
ed = j - 1
GoTo 100
End If
End If
Next j

100

If i = 1 Then '日にちをコピー
Range(Cells(st, 1), Cells(ed, 1)).Select
Selection.Copy

Sheets(y & "年度").Select
Cells(xx + 2, 1) = m
Cells(xx + 2, 2).Select
ActiveSheet.Paste

End If

Sheets("data").Select

For j = 10 To 15
For k = 1 To 25
If Cells(j, k) = "降雪" Then
Range(Cells(st, k), Cells(ed, k)).Select
Selection.Copy
End If
Next k
Next j

Sheets(y & "年度").Select
Cells(xx + 2, i + 2).Select
ActiveSheet.Paste

xx = xx + ed - st + 1

End Sub

-------------------------------------------------------------------------------

 なぜ、シノップ(気象台・測候所)とふつうのアメダス(気象台・測候所以外)を分ける必要があるのか?
 当初は、どちらも「データに付加している記号の意味」を末尾のフラグにしてマクロを組んでいたのですが、ふつうのアメダス地点が毎月一行ずつずれてしまいます。

 謎は深まるばかり・・・。
 仕方がないので、<data>タブに取り込まれたデータをよくよく見ると・・・。

 下はシノップ(気象台・測候所)地点の旭川、2013年4月のデータ。
 4月30日のデータが45行目にあり、A46のセルには「データに付加している記号の意味」が入っています。

画像

 下はふつうのアメダス(気象台・測候所以外)の和寒、2013年4月のデータ。
 4月30日のデータが44行目にあるのは、スタートが違うから。
 1行ずらせば、A45のセルに「データに付加している記号の意味」が入るはずですが、空白・・・。
 「データに付加している記号の意味」が入っているのはA46で、4月30日のデータの2行下なのです。
 この違いはいったい・・・?

画像

 両者の違いの理由は分かりません。
 意図されたものなのか、意図せざるものなのかも・・・。

 ただ、理由が分からなくても、データは正しく取り込まれなくてはいけません。
 そんなわけで、末尾を指定する箇所も無理やり場合分けしてしまいました。。

 で、結果の一例がこれ・・・。
 2011年度の降雪量で、10月1日〜11月21日までを示しています。


 それにしても、こんな落とし穴があるとは思いませんでした。
 まあ、勝手にデータを取り込んでいるので、何も言えませんが・・・。
 ほかのDBもちゃんと扱えるようにならないといけませんね。。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
*** 気象庁HPから日別の降雪量を取り込んでみた *** Untidy Bookshelves/BIGLOBEウェブリブログ
文字サイズ:       閉じる