株式会社シスアナコム

情報システムに関することなら、どんなことでも適切に助言いたします!

この投稿は1年以上前に公開されました。
現在では状況や内容が変わっている可能性があります。
ご注意下さい。m(_ _)m

ACCESSのVBAでHTMLソースの取得

      2014/05/07

株価情報を取得するために

最近、プログラミングを行う機会が激減していることに気がつきました。

2005年末頃までは、Javaを勉強していましたが、それ以降の仕事はインフラ整備や情報システム導入の調整などが多く、また、最近は起業で忙しかったためです。

たまには、プログラムを作らないとやり方を忘れてしまうので、何か目的を見つけてプログラムを作ることにしました。

そこで思いついたのが、株価情報の取得です。

株は私の趣味の一つです。

今回は、株価情報の取得とデータベース化に挑戦してみました。

その前に検索

その前に、誰かが既に良い物を作って公開しているかもと思いベクターで検索してみました。

すると、エクセルやアクセスを使って、株価情報を取得するフリーソフトが多数掲載されています。

いくつかダウンロードして使ってみましたが、残念ながらプログラムソースを公開しているものはなさそうでした。

ソースがないと好きなように改良できないので、やっぱり自分で作ることにしました。

私が一番慣れているのはマイクロソフトアクセス。

バージョンは2000。

ちょっと古いですが、個人的に使うのなら問題ないでしょう。

言語はVBA。

株価情報をデータベース化することまで考えるなら、エクセルよりもアクセスの方が向いています。

久しぶりのプログラミング。

ちょっと楽しくなってきました。

インターネット上のファイルを取得する

まず最初の壁はインターネット上のファイルを扱う方法です。

少し調査してみたら、HTTPの通信を行うためのオブジェクトが存在するとのこと。

これを使えばいけそう。

で、作ってみたのが、以下のコードです。

Function GetHttpDoc1(URL) As String

  Dim Http As Object

On Error GoTo GetHttpDoc1_ERR

  Set Http = CreateObject("MSXML2.XMLHTTP")
  Http.Open "GET", URL, False
  Http.Send

  GetHttpDoc1 = StrConv(Http.responseBody, vbUnicode)

GetHttpDoc1_RESUME:

On Error GoTo 0

  Exit Function

GetHttpDoc1_ERR:

  Debug.Print "GetHttpDoc1:" & Err.Description
  Resume GetHttpDoc1_RESUME

End Function

こりゃ簡単。エラー処理がなければほんの数行です。

使い方は、「GetHttpDoc1(“http://www.sysana.com”)」のようにURLをパラメータに指定すれば、ソースファイルをテキスト形式で取得できます。

取得後は、テキスト形式ならば、文字列検索関数などを使って処理すれば何とでもできるはず。

もちろん、インターネットに接続している必要があります。

今は常時接続が普通なので問題にならないとは思いますが。

インターネット経由で株価情報を入手できるサイトは複数存在します。

ほとんどのサイトで株価情報は約20分遅れで表示されます。

そのため、デイトレード用のリアルタイム分析は不可能ですが、中期~長期投資のための日々の株価情報の入手なら全く問題ありません。

文字化け対策

試してみると...あれ?文字化けしてる。

どうやら、ウェブサーバで使っている文字コードがEUC-JPのようで、これをUnicodeに変換している部分で文字化けしているみたい。

漢字が正しく変換できないと文字列検索できません。

昔から文字コードの変換は非常に困難で、変換テーブルを作成したり、変換するための専用の外部プログラムを使ったりしていたのを思い出しました。

これは結構面倒かも...と思ったのですが、調べてみたら最近は便利なオブジェクトが存在するとのこと。

オブジェクト指向万歳!ストリームというファイルや文字列を扱うためのオブジェクトを使えば、Windowsでよく利用されるShiftJISという文字コードへ変換することもできるようなのです。

おお便利だ。

作り直したのが以下のコードです。

これでどんなサイトのHTMLソースでも、正しくShiftJISのテキスト形式に変換できます。

Function GetHttpDoc2(URL) As String

  Dim Stream As Object
  Dim Http As Object

On Error GoTo GetHttpDoc2_ERR

  Set Http = CreateObject("MSXML2.XMLHTTP")
  Http.Open "GET", URL, False
  Http.Send

  Set Stream = CreateObject("ADODB.Stream")
  Stream.Open
  Stream.Type = 2 'テキスト
  Stream.Charset = "Shift_JIS"
  Stream.WriteText Http.responseText
  Stream.Position = 0
  GetHttpDoc2 = Stream.readText(-1)

GetHttpDoc2_RESUME:

On Error GoTo 0

  Exit Function

GetHttpDoc2_ERR:

  Debug.Print "GetHttpDoc2:" & Err.Description
  Resume GetHttpDoc2_RESUME

End Function

最近はプログラム言語そのものを覚えるよりも、便利なオブジェクトの使い方を覚える方が重要になってきていますね。

 - ひとこと

↓ブログランキングに参加しています!


ネット・PC(全般) ブログランキングへ
にほんブログ村 IT技術ブログ ITコンサルティングへ
にほんブログ村

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です