レシピ OS:Windows 使用言語:VBScript,Excelとインターネット環境は必須 |
今回の主役はVBScriptです。インターネット経由で空港の気象情報を取り込み,取り込んだデータの中から気温と気圧をExcelシートに書き出します。Excelの起動,セルへの書き出し,終了もVBScriptにやらせます。VBScriptの中に書かれたExcel/VBAのコードが実行されていく様をご覧ください。VBScript恐るべしです。
![]() リスト1●NOAAが提供しているMETARの例 [画像のクリックで拡大表示] |
![]() 図1●リスト2の実行結果 [画像のクリックで拡大表示] |
インターネットにありそうでないものとして気象関係のデータがあります。天気予報はあっても,現在の気温や気圧のデータだけを提供しているところは意外に見つかりません。今回は,米海洋大気局(NOAA:National Oceanic & Atmospheric Administration)が提供している気象情報を取り上げます。NOAAは世界中の空港の気象データを,「METAR」(Meteorological Aviaion Report,定時航空気象実況通報式)と呼ばれるフォーマットで書かれたテキスト・ファイルとして配信しています。METARは,およそ30分に一度更新されます。空港によっては数時間に一度の更新だったり長時間更新されないこともありますが,まあサンプルとしては差し支えないでしょう。
では,METARの具体例を掲載してみましょう(リスト1[拡大表示])。この場合,10/08 Q1011の「/(スラッシュ)」の前部分が気温,Q1011の部分が気圧を表します(METARについては那覇航空測候所のサイト,http://www.okinawa-jma.go.jp/nakou/ryakugo2/newpage3.htmに詳解が掲載されています)。
リスト1●NOAAが提供しているMETARの例
2006/02/26 14:38 RJTA 261438Z 35004KT 9999 SCT010 BKN020 10/08 Q1011 RMK 4ST010 7SC020 A2987 |
VBScriptからExcel/VBAプログラムを動かす
サンプルのコードを見てみましょう(リスト2[拡大表示])。このコードを,test.vbsなどと拡張子vbsのファイル名にして「C:\foo」フォルダに保存します。サンプルは「C:\foo\Book1.xls」というファイルを使うので,あらかじめExcelファイルを用意して同じフォルダに配置しておきます。なおBook1.xlsには,A1セルに「日時」,B1セルに「気温」,C1セルに「気圧」と入力しておいてください。test.vbsをダブルクリックして実行させると,METARデータのダイアログが表示され,OKをクリックするとExcelが起動してデータが書き込まれます(図1[拡大表示])。
リスト2 ●空港の気象情報を取得してExcel のシートに格納するプログラム(VBScript )
AreaTXT = "RJTT.TXT" 'HTML/XML アクセス用オブジェクトを生成 Set HTTP = CreateObject("MSXML2.XMLHTTP") HTTP.Open "GET", "http://weather.noaa.gov/pub/data/observations/metar/stations/" & AreaTXT, False HTTP.Send msgbox "取得データ" & vbCrLf& HTTP.responseText BUF = HTTP.responseText Set Excel = CreateObject("Excel.Application") Excel.Workbooks.Open("c:\foo\book1.xls") Set xlSheet = Excel.Worksheets(1) Excel.Visible = True x = 1 OLD = "" while xlSheet.Cells(x, 1).Value<>"" OLD = xlSheet.Cells(x, 1).Value x = x + 1 wend aBUF = Split(BUF, vbLF) aBUF(0) = DateAdd("h",9,aBUF(0)) '直前データと日時が違えば(同一データが複数行にならないように) If aBUF(0)<>OLD Then xlSheet.Cells(x, 1).Value = "'" & aBUF(0) '日時を書き出し aDATA = Split(aBUF(1), " ") 'データ部をスペースで分割 CA = ubound(aDATA) '配列の要素数を取得 For i=0 To CA If InStr(aDATA(i),"/")=3 Then '気温(3 文字目に/を含む) TMPL = Split(aDATA(i),"/") xlSheet.Cells(x, 2).Value = TMPL(0) End If If InStr(aDATA(i),"Q")=1 Then '気圧(先頭がQ) PLZ = Replace(aDATA(i),"Q","") xlSheet.Cells(x, 3).Value = PLZ End If Next Excel.Save Else MsgBox "以前に取得したデータ以降の更新はありません" End If ' 「直前データと違ったら」の終端 Excel.Application.Quit 'Excel は終了 |
![]() リスト2●空港の気象情報を取得してExcelのシートに格納するプログラム(VBScript) [画像のクリックで拡大表示] |
コードの中身を解説しましょう。まず,VBScriptでネットワーク上のドキュメントをHTTP経由で取得するには,リスト2の(1)のようにMSXML2.XMLHTTPオブジェクトを使います。指定されたURL(ここではNOAAのURL)に接続して,変数BUF内にドキュメントを取得できます。
取り出してきたMETARデータは暗号のような状態なので,まず改行部で切り離して前半の日時を取ります。METARの日時はUTC(世界標準時)ですから,9時間を足して日本時間に変換します。改行以降のデータ部はスペース区切りのSSV(CSVのスペース版)になっています。これをスペースごとに分解して配列に取り込み,/(スラッシュ)が3文字目にあるものを気温,Qが頭に付いているものを気圧と識別させます。
続いて,取り出したデータをExcelに書き出す処理です。オブジェクトとしてExcelのインスタンスを作っています。ExcelをVBScriptの支配下に置いてExcel/VBAを動作させるためです。セルに日時と気圧,気温を書き出す部分に注目してください。「xlSheet.Cells(x, 1).Value = ~」という表記が出てきますね。xlSheetというのはExcel起動時に作ったシート・インスタンスです。ここに「Cells(x, 1).Value」の形式でデータをセルに書き出しています。
VBScriptには,もちろんCells( )プロパティはありません。VBScriptからオブジェクトとしてExcelを作り出してやると,本来は持っていないExcel/VBAの機能も使うことができるようになるわけです。なおVBScriptの仕様としてSave(保存)を実行しかけたときに「RESUME.XLWを保存しますか?」のように聞かれますが,そのまま「はい」をクリックしてください。ちゃんとBook1.xlsが上書きされます。
今回のサンプルをもとにすると,LAN内サーバーや外部特定サーバーからHTTP経由で情報を取得し,Excelに書き出していくといった業務アプリケーションも作成できます。気象情報を使ったのはあくまでヒント。今回のコードをどう改造させるかは皆さんのアイデア次第です。