2011年7月12日火曜日

VBAでHTMLのTableタグ内データを取得する

HTMLファイルからデータを取得するプログラムをVBAで作りました。

具体的にはhtml、body、table、tdタグをキーにしてTableタグ内のデータを取得する仕組みです。
tdタグ内に記述されたデータ(innertext)が取得対象となります。
実行環境はExcel VBA、IE6です。
VBA側の参照設定はデフォルトのままで実行できます。


TDタグ内のデータを取得するプロシージャ



Sub getTDinnertext()

    Dim intIndex As Integer
    Dim objTag As Object
    Dim objTagTable As Object
    Dim varTDinner(371) As Variant
  
    intIndex = 0
  
    For Each objTag In objIE.document.body.all
      
        If objTag.tagname = "TABLE" Then
      
            For Each objTagTable In objTag.all
              
                If objTagTable.tagname = "TD" Then
              
                    varTDinner(intIndex) = objTagTable.innertext
                  
                    '取得したデータに対する処理
                    'Debug.Print intIndex &  "::" & varTDinner(intIndex)
                    'Cells(intIndex + 1, 1).Value = intIndex
                    'Cells(intIndex + 1, 2).Value = varTDinner(intIndex)
          
                    intIndex = intIndex + 1
                  
                End If
              
            Next objTagTable
          
        End If
      
    Next objTag
  
End Sub


取得した値は配列型の変数に格納しています。
このプログラムではTD要素が371個存在したので371個の要素を持つ配列を宣言しています。
(動的配列を使った方がスマートに書けるのかな)
なのでTD要素の個数が372以上の場合、上記プログラムでは「インデックスが有効範囲にありません」というエラーが発生します。

また、このプログラムは先にIEオブジェクトを生成して取得対象のWebページを開いておく必要があります。
実際には以下のようなプログラムの中で上記プロシージャを呼び出して使っています。


アクセスしたサイトからデータを取得するプロシージャ

Sub test110712()

    'IEオブジェクトを作るサブルーチン
    Call CreateIE
    
    objIE.navigate "http://www.shimatetsu.co.jp/bus/busjikoku/bust01.htm"
    
    'ページの読み込みを待機するサブルーチン
    Call WaitIE
    
    objIE.Visible = True
    
    Call getTDinnertext

    Set objTag = Nothing
    Set objTagTable = Nothing
    Set objIE = Nothing
    
End Sub


※CreateIEプロシージャとWaitIEプロシージャについてはお手数ですがVBAでJavaScriptが埋め込まれたリンクをクリックするエントリーを参照してください。


例えば長崎空港線(島原港⇔長崎空港)のデータを取得すると次のような結果が返ってきます。

仕事場の環境的な制約でVBAを使ってこんなものを作っていますが、これが意外に役に立っていたりします。

イミディエイトウィンドウの限界

VBE(Visual Basic Editor)を使ったVBAプログラミングのお話です。

テストコードの動作確認のためにDebug.printを使ってイミディエイトウィンドウに取得した値を出力していました。
一度に371行のデータを出力するプログラムなのですが、お?
全てのデータが出力されていません。
※テキストは一部マスキングしています。

プログラムが悪いのかと思ってステップ実行をしてみたところ、ちゃんと1行目から順に出力されていました。
つまり、イミディエイトウィンドウで一度に出力できるデータ数は
371 - 172 = 199 行?

イミディエイトウィンドウの最終行は常にプログラムが1行入力できる状態にしてあります。
従ってイミディエイトウィンドウで使用できる行数は199 + 1 = 200 行ということです。

199を超えるデータを出力してテストする場合は出力のロジックか出力先を考えてあげないといけないですね。

2011年7月11日月曜日

WARファイルのデプロイ

勉強が進まなすぎて悲しくなってくるので、もうちょっとしたことでもいいからアウトプット。
WARファイルのデプロイについてメモっておく。

サンプルプログラムをインポートして参照するためにはWARファイルをデプロイしてEclipseで使えるようにする必要がありますよ、ということで以下デプロイ手順。

1.[ファイル]→[インポート]
ファイルをインポートする、っていうところが入り口。

2.インポート対象を選択
[Web]フォルダの中にある[WARファイル]を選択して次へ進む。

3.インポートするWARファイルを選択する

4.選択したファイルが表示されたら完了!

…これでデプロイは完了。
ここからインポートしたソースを見ながら勉強していくことになります。



Sample通りに構成できない〜JavaとJDBCで奮闘中〜

一向に進まないJavaの勉強。
JDBCを使ったMySQLDBへのアクセスがどうにもこうにも行き詰ってしまったので一旦離れてみることに。
で、Sampleとして提供されたプロジェクトをそっくりそのまま真似してクローンを作ってみることにした。
Sampleがやっていることはログインログアウトの実装、StrutsとMySQLなDBを使っている。

コピーするだけとは言ってもコードは全部自分で入力した。
必要なライブラリのインポートも一個一個確認しながら遂行。
どうにかこうにかできあがったので実行してみたけど動かない。

こんなエラーが出ている。
 The server encountered an internal error () that prevented it from fulfilling this request.

気になっているのは真似できていない箇所。
ライブラリの構成がSampleプロジェクトとは違っている。しかし同じにする方法がわからない。
Sampleのライブラリ

私が作ったプロジェクトのライブラリ

うーむ。
「Web Apps ライブラリー」フォルダの下にどうしても配置できない。
どうやったらいいんだろう。
これをSampleどおりに配置したところで問題が解決できるかどうかはわからないが、とりあえず同じにして間違いの可能性を検証したいところ。

もうひと踏ん張り調べてきますかぁ。


2011年7月6日水曜日

その2:MySQLへJDBCを使って接続する〜ドライバのインストール〜

2.MySQLドライバのインストール


その前に、やさしいJavaさんを読んでみると「共通するファイルの設定」というのがある。
Tomcatで共通して使用するファイルをTomcatがインストールされたディレクトリのlibディレクトリ内に配置する必要があるらしい。
で、その共通して使用するファイルというのは「derby.jar」でmこれはJDKに添付されているJavaDBなんだそうだ。
私の環境ではこのファイルが
「/Users/Anri/eclipse/plugins/com.aptana.ide.libraries_2.0.0.1253913567」
っていうところにあった。
勢いでインストールしたAptanaのプラグインの中?!
他には見当たらず。よくわからないけどこのまま続けてみよう。

というわけでこのファイルをコピーしてTomcatの下に配置する。
「/usr/local/lib」
がその場所みたい。このディレクトリには他に「tomcat-coyote.jar」とかっていう「tomcat〜」っていうjarのファイルが存在している。
※メモ:そもそも「Tomcat〜」っていうディレクトリが存在していない状態のTomcatのインストール状況には問題ないのかな?!
それと問題のMySQL用のドライバもここと同じ場所にコピーしておくらしい。
これは別のWebサイトを参考にしたもの。
"今回はサーブレットでの利用を前提としていますので"と書いてあるのが気になるんだけど(サーブレットの使用が前提ではなかったらここにコピーしないの?!)、ひとまず試してみることに。

※参考
JDBCドライバの取得(MySQL用)
http://www.javadrive.jp/servlet/database/index1.html

インストールはこれでおしまいみたい。
次は何をするんだ?

やさしいJavaの記載を参考にすると「web.xml」を編集するらしい。
Eclipseを使っているとどこまで自動でやってくれていて、どこは自分で設定してあげないといけないのかよくわからない。
この本はEclipseの使用を前提にしてはいないので、Eclipseを使用した場合にこの本にあることすべてをやる必要はないのかもしれない。

ま、わかんないことはやってみるしかない!ということで。

3.web.xmlの編集(※次のページへリンク予定)

その1:MySQLへJDBCを使って接続する〜ドライバの入手〜

やさしいJava活用編を参考にしながらEclipseを使ってMySQLへの接続を試みているが成功しない。
The requested resource () is not available.
というわけでエラーが返ってくる。
・MySQLのドライバがちゃんと設定出来ていないのか?
・URLが間違っているのか?
・クラスパスのところを見ればいいのか?

原因を探りつつあれこれ挑戦してみるも、出続けるのは同じエラー。
嫌になってやる気も失せてしまったり…しかしそれでは先に進めないので手順をひとつひとつ追いかけながらどうにかこうにか解決に導きたいと思う。
いろんなソースにあたればそのうち原因がわかるかもしれない…よね…(とてもとても淡い希望)


1.JDBCドライバの取得

MySQLのサイトから当該ドライバをもらってくる。
http://dev.mysql.com/downloads/
Java用のドライバはここ

で、私はMacを使って勉強しているので拡張子tar.gzの方をダウンロードする。
アカウントは作りませんよ、を選択してミラーサイトからダウンロード。
解凍するとファイルがざざっと出現。
「mysql-connector-java-5.1.16-bin.jar」ってのがそのドライバらしい。

【Berak Point】
…多分ここまでは手順(準備)として間違っていないと思う。
で、ダウンロードしたら次の課題はこれだよね?

2.MySQLドライバのインストール(※次の記事へリンク予定)




2011年7月3日日曜日

勉強が進まない〜Java〜

Javaの勉強をしていますがなんだかやる気がわかず、しかし時間ばかり過ぎて何も習得出来ていないことに焦りを覚える…

どうしてやる気が出ないんだろう、と思って色々考えてみました。
とりあえず、遠くを見る。
今月勉強したいと思っていることをざっとマインドマップにしてみました。
※基本情報技術者のところは読んでいる参考書の目次をマッピングしただけなので必ずしも7月にやるってわけではないです(そこもちゃんと計画しましょう>私)。

主にJavaの勉強について遅々として進まない状況にストレスを感じているのですが、マインドマップにしてみるとよくわかります。
みえているものの少なさ。

つまり何をしたらいいのかよくわかっていないんでしょうね。
一応課題は与えられていますが、課題と自分ができることとの間には隔たりがあるわけです。
勉強しているんだから当然のことですが、その隔たりの埋め方がわからない。
ひとつひとつ、構成要素を埋めつつ進んでいくしかないんでしょうが、焦燥感と不安(これでいいのかな、っていう)がやる気を奪ってしまうのです。

仕事をする上でのメンタルな部分のコントロールが私は苦手だなと思います。
感情の起伏が激しいし、自分が納得したことでないとすごくストレスを感じます。
こんなふうに不安な要素があるとやる気までなくなってしまったり…
そのたびにまたこうやって何が悪いのか、何をすべきなのか考えるわけですが、悩むたびに少しは強くなっていっててほしいものです。