ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【VBA】VBA初心者がVBAからSeleniumを使ってみる

スポンサードリンク

IT業界6年目で初めてのVBA

ほんとは初めてじゃないんだけど、100%初めてに近いです。5行ぐらい書いて実行して妥協した経験を持っています(`・ω・)=3

とまぁ、ほとんどLinux関連のOSしか触っていない&業務PCはMacな私が突然VBAな理由として。会社の案件でエクセルでとあるウェブサービスに情報を登録していかないといけない作業ができた。

んで、その作業なんだけど、APIがないらしく(あるっぽいけど使い方がよくわからない)ブラウザからぽちぽち作業しなきゃいけないということ。また量も多く複数人で分担して行っている。

先月初めて対応したが、とてもじゃないがだるいので、ブラウザを自動で動作させるならSeleniumがあるじゃないか!と思い、「Selenium VBA」であまり期待せずに検索したわけですよ。

すると。。。

f:id:aipacommander:20160202192018p:plain

まじかGoogle(°Д°;

この世でログを残してくれた人たちに感謝してとりあえずVBASeleniumという黒魔術みたいなことを試してみる。

環境

VBAを勉強する

意気込んだのはいいとして、そもそも私はVBAやらWindows関係のソフトウェアは無知識に等しい。

とはいえ、構文を理解しないとはかどらないことはわかっていたので入門サイトをさがす。

神サイトにありました。

dotinstall.com

休憩入れなければ&他プログラミング言語を理解している人が試せば1時間ぐらいでなんとなく把握できると思う。

  • コメントは'(シングルクォーテーション)の後にコメントを書く
  • Dim Name As StringDimは宣言、Nameは変数名、As Stringが型名になります
  • データ型は色々。StringIntegerDateBooleanVariant(どんな値か不明な場合に使う)、ArrayObjectがある。
  • Objectの変数に値を代入する場合は、Set Name = ObjectみたいにSetを使わなければいけない
  • ループやら条件分岐、イテレーションみたいな処理などの他言語でもできる基本的なことはおk。
  • 関数はある。あと良く使うだろうと思うのはSub getTest()みたいに宣言するプロージャーと呼ばれるもの
  • プロージャーは返り値がない処理メソッド(?)、関数は返り値を返すことができるメソッド
  • 関数で返り値を返す場合は関数名を使って返さなければいけない(これがあんまり好きではない)
Sub testSub()
    Dim result As Integer
    result = Call plusSub(1 + 1) 'Call で、他プロージャー、関数を呼ぶ
    Debug.Print result
End Sub

Function plusSub(ByVal one As Integer, ByVal two As Integer)
    plusSub = one + two '関数名と同じ名前の変数に値をいれて、処理が終了するとそれが返り値になる
End Function

ちょっと慣れないとアレだなってのがあるが、とりあえずおkです。これでコードは読めそう。

Selenium-VBA をインストールする

次にVBA上からSeleniumを操作できるようにライブラリを取得します。

Google Codeなのが心配ですが(近々サービス終了する)、ここで最新のexeファイルを落としてインストールしました。

Google Code Archive - Long-term storage for Google Code Project Hosting.

次にVBAで使用できるように、インポート的なことをやります(VBAではアーリーバインドって言うらしい...)

ツール => 参照設定 => SeleniumWrapper Type Library にチェックをいれてOKを押せばおk

使ってみる

Sub startChrome()
    Dim driver As New SeleniumWrapper.WebDriver
    Call driver.Start ("chrome", "http://www.google.com")
    Call driver.get("")
End Sub

これを実行するとGoogle Chromeが起動して、Googleのトップページが表示すると思います。

色々試して見たところ、いまいちデータの構造が理解できていないので、中々前に進まないのが現状かな。明日から本気だす。

とりあえず以上です。