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

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

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

2011年7月1日金曜日

自己と意義

合宿を通して、自己実現を図りながら仕事をしていく過程において、仕事の意義とは大変重要なものであることを再認識した。
何に意義を感じて仕事をしていくのかというのは自分がどんな人であるのかを表すものでもあると感じ、自信がそれを把握しておくことが今後の仕事の仕方にも大きく影響するのではないかと思った。

ここでは私がどのように仕事に向き合っているのかを振り返り、同じような場面に遭遇したときにどうすればよいのかを考える。そして意義を明確にするという手段によって自分がどうであるかを把握する機会を日々の生活の中で設けられるようにしていきたいと思う。



仕事と意義

私にとってその仕事がどんな意義を持つかということはとても重要なことだ。
それは私が取り組んでいるものにある意義を原動力として仕事を推進し、学習の動機を得ているからだ。
その仕事にどんな意義があるのかわからないと原動力は失われ、勉強しようにも何を勉強すべきなのかわからなくなる。
とはいえ、仕事をしていれば意義がどうであろうとやらなければいけないことがある。しかし体が動かない、仕事が進まない。そうなると、やらなければいけないことに対して行動することができない自分に嫌悪感を抱き、負のスパイラルに陥ってしまう。

このままの状態で考え続けることが現実的でないことは明らかだ。では一体どうすればいいのだろうか。


意義の再発見―第1のステップ

抱えている仕事に意義を感じられないとき、その仕事に対して何らかの疑問が生じている場合が多い。
その疑問は自分がどんなことに意義を感じるのかということと関係している。
例えば私は「自分の作っているものがユーザの役に立ち、喜んでもらえる」ということに意義を感じるが、意義を感じられない状況では「この成果物は本当にユーザに使ってもらえるのだろうか、必要とされているのだろうか」という疑問を感じていたりする。
このような場合、疑問を解決することで再び仕事の意義を見つけることが出来る。
関係する人に質問をしたり、自分が思っていることを提案してみたりして疑問をひとつずつクリアしてくことでぼやけていた意義が鮮明になってくるのだ。


しかし疑問の解消が意義の発見に結びつかないこともある。期待する答えが得られなかったり、そもそも関心を持ってもらえないこともあるのだ。


意義の再発見―第2のステップ

仕事とそれに付随する疑問や課題の解決によって意義を見いだせないとき、目の前にある仕事よりももっと先にある目的を再度見直すことが有効だと思う。
意義を見いだせず、行き詰まってしまったときの私は目の前のことで頭がいっぱいになり、広い視野で物事を考えることができなくなっている。
そこで意図的に遠くを見、自分が何をしたいのか、どこに向かいたいのかを自問自答する。
そうすることでまず目の前の問題の重さが変わってくる。
それまでは頭の中の大半を占領していた問題が、取るに足りない些細な問題であると思えてくる。そして今目の前にある課題よりももっと考えるべきことがあるということに気づく。
個々のタスクがどうであるかというより、そのタスクを包括しているプロジェクトがどうあるか、どうであるべきかを考えるという具合だ。

このような考え方をするのは当たり前のことかもしれないが、ある目標からブレークダウンされたタスクに取り組んでいるともとの目標に立ち返った視点を忘れてしまいがちだ。
思い描く成果をあげるためにも、こうして広い視野がもてる場所に立ち返ることが必要だ。


意義の再発見―第3のステップ

取り戻した広い視野の中でさえも意義が見いだせないことがある。そもそも進むべき方向は正しいのか、という疑問があったり、自分のしていることに自信がなくなったりするのだ。
意識して遠くを見つめることができても納得する答えが得られない、もはや何がいけなくて何に悩んでいるのかもよくわからない。

こうして一生懸命考えても先へ進めなくなったとき、自分の中にある知識や経験からではアウトプットできない次元のことをしようとしているのだと思う。
今までにない次元のことをアウトプットしたいができないもどかしさに苦しんでいる状態だ。
それを解決するには自分にはない情報に触れることが必要だと思う。書籍やインターネットなどで得られる新しい知識や考え方、誰かの経験談や意見、あるいはアウトプットの手法などがそれに当たると思う。
こうして自分の中には存在しない要素を取り込むことでどこに目標を置くのか、その意義は何かを形にできるはずだ。


発見の繰り返しで見つかる自分

意義を見いだし意欲的にものごとに取り組む、その意義を見失ってしまった時には新たな意義を見いだすための行動をする。
このサイクルによって意義とそれによる動機を得ながら仕事を進められる。また、ひとつひとつの仕事に対して意義を明確にしていく行為は自分がどんな人であるのかを明らかにしていく。

こうして何によって意義を感じられるのかを把握していくことで「自分」という存在をいろんな側面から見つめることができると思う。そして自分を把握することで今後自分が関わっていく仕事や、それを一緒に進めて行くメンバーとの関わり方をより実りあるものにしていきたい。