金融市場祝日カレンダーをどこかのウェブサイトから社内で管理しているエクセルに自動で取り込みたいと思っているのですが、どのようにすれば実現できるでしょうか?
具体的に参照する(信頼性のある)ホームページとそれをエクセルに落とす関数・VBAのサンプルを教えていただけると助かります。
祝日カレンダーは国によっては年の途中で変更される可能性もあると理解しているため、都度ウェブサイトに参照しにいく仕組みなのかな、と考えています。
よろしくお願いします。
Naoki
2019.02.14 07:37:34
1044
単純な表ならデータタブのWebからでできるのですが、最近は取り込めない場合もあるようです。
もしテキストファイルで配布されているのであれば、データタブのデータの取得の中のテキストファイルとかでURLを指定して取り込めばいいのではないかと思います。
これらで取り込んだものは、リアルタイムでは更新されないのですが、そのブックを開いたタイミングで読み込み自動で更新してくれます。
ただこれらの方法で取り込めない時もたくさんあるので、そうなってくるとVBAで取り込む必要も出てきます。
でもVBAで作ればそれなりにコストもかかるでしょうから、その前にWEBSERVICE関数とかFILTERXML関数とかでなんとかできないか考えてみたほうがいいでしょう。
佐藤嘉浩(Excelの魔法使い・スピラー)
2019.02.16 23:39:02
追記です。
http://klug-fx.jp/holiday/
ここのURLでカレンダーをWebからで取り込めましたね。
うまく文字を処理すれば関数だけでなんとかなりそうな気もしないでもないですね。ただ、何月かの情報がとれないです・・・
|
さらに追記です。http://klug-fx.jp/holiday/?calendar=201903のように年月でURLを指定すればその月のカレンダーになりそうなので、VBAと組み合わせればさらにさらにいけると思います。でもそれだとWebから取り込みじゃなくてフルVBAにした方がいいんですかねー。
|
ありがとうございます。やはり世界各国のカレンダーを取得しようとするこのサイトがいいのかもしれないですね。関数だけで解決できる方法があったらかなりとっつきやすいのですが、VBAとなると少し敷居が高そうです。関数のスペシャリストが現れることを期待します!
|
多分、WEEKDAY関数とかと組み合わせればカレンダー文字が何曜日かとか分類できると思うので組み合わせればできそうな気がします。最近はカレンダーとWEEKDAY関数の組み合わせの情報もググれば出てくるようなので、使用用途に合ったやり方をチョイスするといいかなと思います。
|
コメントするには ログイン していただく必要があります。
金融市場のカレンダーでしたらJPX(東証)のサイトの情報が信頼できるのではないでしょうか?
https://www.jpx.co.jp/corporate/about-jpx/calendar/
VBAでこのカレンダーから祝日のリストを取得するには、次のステップで行います。
VBAでウェブサイトに接続してデータを取得する方法はいくつかありますが、「MSXML2.XMLHTTP」オブジェクトを利用するのが手軽だと思います。
Dim http: Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://www.jpx.co.jp/corporate/about-jpx/calendar/", False
http.send
Dim res: res = http.responseText
以上で、変数resにはJPXのサイトから取得したHTML文字列が格納されます。
次に取得したHTMLから目的となる休日データを抽出します。VBAでHTMLを解析するには「MSHTML.HTMLDocument(htmlfile)」オブジェクトを利用するのが便利です。
Dim doc: Set doc = CreateObject("htmlfile")
doc.write res
これだけで、文字列のHTMLがパースされHTMLDocumentオブジェクトとして扱えるようになります。
最後に、HTMLDocumentオブジェクトを通じて日付情報を取得し、Excelのシートに出力します。今回はA列の一番上のセルから下方向に日付を入力していきます。
Dim i As Integer: i = 1
Dim table
For Each table In doc.getElementsByTagName("table")
Dim tr
For Each tr In table.getElementsByTagName("tr")
Dim d: d = Left(tr.FirstChild.innerText, 10)
If IsDate(d) Then
Cells(i, 1).Value = CDate(d)
i = i + 1
End If
Next
Next
まず、HTMLに含まれるテーブル(table)要素を抽出し、For Eachを使って一つ一つ処理します。そして、それぞれのテーブルに対して、テーブルに含まれる行(tr)要素を同様に抽出します。日付はtr要素の最初の子要素であるtd要素に含まれているので、FirstChild.innerText
によってその値を取得することができます。
取得した日付は「2019/01/01(火)」という形式になっていますので、Left関数を使って曜日以外の部分を抽出します。そして、IsDate関数を使って日付形式として正しいかどうかをチェックした上で、CDate関数を使って文字列としての日付を日付形式に変換しています。最後にA列のセルにその値を設定して終わりです。
全体のコードは次になります。
Option Explicit
Sub GetHolidays()
'JPXのサイトをスクレイピング
Dim http: Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://www.jpx.co.jp/corporate/about-jpx/calendar/", False
http.send
Dim res: res = http.responseText
'DOMを解析
Dim doc: Set doc = CreateObject("htmlfile")
doc.write res
'日付をExcelに貼り付け
Dim i As Integer: i = 1
Dim table
For Each table In doc.getElementsByTagName("table")
Dim tr
For Each tr In table.getElementsByTagName("tr")
Dim d: d = Left(tr.FirstChild.innerText, 10)
If IsDate(d) Then
Cells(i, 1).Value = CDate(d)
i = i + 1
End If
Next
Next
End Sub
※この投稿は祝日カレンダーをVBAを使って取得する技術的な方法を紹介するが目的です。実際にプログラムを使ってJPXサイトからデータを取得することの可否はJPX社にお尋ねください。
shirohonoka
2019.03.01 01:19:10
(2019.03.01 01:26:26 更新)
ありがとうございます。確かにJPXサイトなら信頼性のあるデータが取得できますね。ただ、私の質問の仕方も不十分でしたが、世界中の金融市場のカレンダーを取得するためには、やはり佐藤嘉浩(Excelの魔法使い・スピラー)さんが紹介いただいているようなまとめサイトを使うしかないのかと思ってます。
|
コメントするには ログイン していただく必要があります。