高速大量回転法実践家のデビっちんです。
今回、エクセルマクロVBAの機能を使って、ExcelからIE(インターネットエクスプローラー)を操作してウェブから情報を自動取得することをお伝えします。
題材は、このブログでも何度かご紹介している「読書メーター」というサイトから、読んだ本の情報をエクセルのシートに書き出す、というものです。
読書メーター
デビっちんが読んだ本はこちら
https://bookmeter.com/users/435306
VBAで自作した理由
読書メーターの使い勝手が今一つ
簡単かつ気軽に本の登録ができて便利な読書メーターですが、使い勝手が今一つなところに不満がありました。
具体的にはこんなところです。
読んだ本の内容は覚えているけどタイトルを忘れてしまったり、なんとなく表紙の絵柄は覚えている、あるいは、いつ読んだかは覚えているというような本を探したいとき
読書メーターの機能では、今まで読んだ本の履歴を確認したいときに20冊ずつしか表示されませんから、目的の本を見つけるまで何度も次のページを押しては表示を待つという時間にムダを感じていました。
読んだ冊数が少ないうちはよかったんですが、KTK(高速大量回転)法に出会って、読書に対するハードルが下がって読む本が増えてからが大変でした。
最近読んだ著者の割合は過去1年は表示機能がありますが、過去2年とか全期間とかは表示機能がありません。
たまに、過去に読んだ本をザッと見返したいときありませんか?
手作業でリストを作るのは嫌
その他にも色々と集計するためには、過去に読んだ本の内容が一覧化されたデータがあると便利なのですが、20冊ずつ表示されるデータを何度もコピペして、エクセルで一覧データを作るとか嫌です。
読書メーターに読んだ本のCSV出力したいと希望を伝えても、採用されるかは不明ですし、実装されるとしても時間がかかったりと現実的ではありません。
ネットで探してみても、この問題は解決しそうにありませんでした。
だったら、自分で効率化してみちゃいますかっ!
という感じで今回のマクロを作成しました。
僕はこちらのサイトで勉強して、有意義な時間と思考法を取得できました。
エクセルマクロVBA「Web連携」 | エクセルマクロ達人養成塾
今回、かなり高度な知識も使っています。
エクセルマクロ?VBA?って何?という人は、こちらをご覧ください。
以下の講座は無料で、僕もこちらから学習をスタートしました。
エクセルマクロ 3日がかりのその仕事、3分で終わらせる方法教えます。 | エクセルマクロ達人養成塾
エクセルマクロ・VBA導入編講座 | エクセルマクロ達人養成塾
VBAでIEを操作して、読書メーターの読んだ本をエクセルに書き出す
自動処理の概要
この記事でお伝えするのは、次の画像のように、エクセルからIEを操作して「読書メーター」から自分が過去に読んだ本をExcelに書き出すとというマクロです。
↑
の表が、IEの自動入力によって、
このようになります。
リストを書き出している最中に、IEの画面が自動的に変わっていくことに最初は感動します!
それなりに感動したら、次からはその時間を本を読んだり別のことをしたりと時間を有意義に使えるので便利です。
ほーっておいても、Excelの中の小人ちゃんが文句も言わずしっかり仕事をしてくれます。
事前準備
エクセルからウェブの情報を自動的に取得するのですから、以下の準備が必要です。
- エクセル
- インターネットエクスプローラー
- インターネットがつながる環境
また、エクセルについては以下の2つの準備が必要です。
- シート名の変更、 URL、ログインID、パスワードの記載
- VBEの参照設定
それでは1つずつ説明していきます。
1. シート名の変更、 URL・ログインID・パスワード、取得項目名の記載
エクセルのシートを2つ用意して、1つのシートを「読んだ本の一覧」、もう1つのシートを「ログイン情報」という名前に変更してください。
シートの順番は関係ありませんが、シート名は正確に入力してください。
シート「読んだ本の一覧」のA1~E1のセルに画像と同じ文字を入力してください。
こちらは順番も含めて入力してくださいね。
A1セル: NO
B1セル: 読了日
C1セル: タイトル
D1セル: 著者名
E1セル: 感想記載のURL
続いて、シート「ログイン情報」に以下の情報を入力してください。
C2セル:https://bookmeter.com/login
C3セル:メールアドレス
C4セル:パスワード
2. VBEの参照設定
エクセル画面上からVBEを起動し、参照設定を選択してください。
VBEは、shift + F11 で起動できます。
参照設定は、メニューバーの「ツール」→「参照設定」です。
参照設定の中から、以下2つのライブラリにチェックを入れ、
OKをクリックしてください。
1. Microsoft HTML Object Library
2. Microsoft Internet Controls
以上で準備は終了です。
サンプルコード
VBEに以下のコードをコピペしてください。
実行すると、インターネットエクスプローラーが自動的に立ち上がって、読書メーターの読んだ本の情報をエクセル上に記載していきます。
Option Explicit 'Mictosoft HTML Object Library 'Microsoft Internet Controls Sub ReadingMeter_Syutoku() Dim ObjIE As InternetExplorer Set ObjIE = CreateObject("Internetexplorer.Application") Dim Obj As Object 'シートの特定 Dim WsOutpt As Worksheet Set WsOutpt = Worksheets("読んだ本の一覧") Dim WsLogIn As Worksheet Set WsLogIn = Worksheets("ログイン情報") 'ログイン情報の特定 Dim strUrl As String strUrl = WsLogIn.Range("C2").Value Dim strUsername As String strUsername = WsLogIn.Range("C3").Value Dim strPassword As String strPassword = WsLogIn.Range("C4").Value ObjIE.Visible = True ObjIE.navigate strUrl Call IEwait(ObjIE) 'ログイン済みのIEだったら一旦ログアウト Call ScreenChange(ObjIE, "ログアウト") ObjIE.navigate strUrl Call IEwait(ObjIE) Dim htmlDoc As HTMLDocument Set htmlDoc = ObjIE.document 'ログイン対応 htmlDoc.getElementById("session_email_address").Value = strUsername htmlDoc.getElementById("session_password").Value = strPassword ObjIE.document.forms(1).submit Call WaitForIE(3) '読んだ本の一覧へ Call ScreenChange(ObjIE, "読んだ本") '読んだ本の書き出し対応 Dim i As Long For i = 0 To ObjIE.document.Links.Length - 1 Call FinishedReading(ObjIE, WsOutpt) If NextPage(ObjIE) = False Then Exit For End If Next ObjIE.GoBack Call IEwait(ObjIE) ObjIE.Quit End Sub Sub FinishedReading(ByRef ObjIE As Object, ByVal Ws As Worksheet) Dim cTo As Long Dim Obj As Object cTo = Ws.Range("A" & Rows.Count).End(xlUp).Row + 1 For Each Obj In ObjIE.document.getElementsByTagName("li") If InStr(Obj.outerHTML, "group__book") > 0 Then Ws.Range("A" & cTo).Value = cTo - 1 Ws.Range("B" & cTo).Value = Obj.getElementsByTagName("div")(6).innerText Ws.Range("C" & cTo).Value = Obj.getElementsByTagName("a")(2).innerText Ws.Range("D" & cTo).Value = Obj.getElementsByTagName("a")(3).innerText Ws.Range("E" & cTo).Value = Obj.getElementsByTagName("a")(2).href cTo = cTo + 1 End If Next Call NextPage(ObjIE) End Sub Sub ScreenChange(ByRef ObjIE As Object, stKey As String) Dim Obj As Object For Each Obj In ObjIE.document.getElementsByTagName("a") If InStr(Obj.innerText, stKey) > 0 Then Obj.Click Call WaitForIE(3) Exit For End If Next End Sub Function NextPage(ByRef ObjIE As Object) As Boolean Dim Obj As Object For Each Obj In ObjIE.document.getElementsByTagName("a") If Len(Obj.innerText) = 1 Then If InStr(Obj.outerHTML, "次") > 0 Then Obj.Click Call WaitForIE(3) NextPage = True Exit For End If NextPage = False End If Next End Function Function IEwait(ByRef ObjIE As Object) Do While ObjIE.readyState <> READYSTATE_COMPLETE Or ObjIE.Busy = True DoEvents Loop End Function Function WaitForIE(ByVal second As Long) Dim futureTime As Date futureTime = DateAdd("s", second, Now) While Now < futureTime DoEvents Wend End Function
おわりに
自分のやりたいことに時間を使える
今回詳しいコードの解説はしていませんので、興味があったら勉強してみてください。
エクセルマクロVBAの機能を使うと、影分身の術を使ったかのように行動量を増やせます。それはつまり、自分のやりたいコトに時間を使えるようになるということです。
エクセルマクロのおかげで、毎年恒例の記事を書くハードルが下がりました。
www.kousokutairyoinfo.com
いきなり今回のようにウェブの情報をとってくることは難しいですが、普段の仕事でエクセルを使った単純作業があればボタン1つで解決できるようになったりもします。
エクセルマクロを学ぶ過程は、KTK法の学び方と同じだった
そして、冒頭でお伝えした僕が学ばせてもらったエクセルマクロの教室は、KTK(高速大量回転)法と同じ思考で教えてくれています。
例えば、
- いきなり完成形のコードを書くのではなく、とりあえず動くマクロを書いてみる
- そこから少しずつ加工をくり返す
- 仮説を立て実験しつつ、違ったら修正する
- 上記をくり返して完成形に近づける。
これはまさにKTK(高速大量回転)的で、
- 全体像を把握してから部分をとらえる
- くり返しの中で細かい部分を拾っていく
- 仮説を確認しつつ、情報の上書きをする
- センス・オブ・ワンダーも共通
センス・オブ・ワンダーとは、未知なるものに対する興味・関心です。
KTK法で言えば、既に読んだ同じ文章の中にさらに大きな気づきや学びはないか?
マクロで言えば、狙った動きができた後は、もっと簡単に楽に同じ動作ができないか?
というような感じです。
KTK(高速大量回転)法の習得に行き詰まっている人は、エクセルマクロの習得から再挑戦してみてください。
学び方に共通性があるならば、本を読むという見えない頭の中のプロセスを模索するよりは、エクセルという目に見えるもので実験的に行動した方が、その習得は簡単です。
以下の講座から学びました!
ここでマクロを学んでから、書籍や他のサイト等も見ましたが、ダントツで以下のサイト推しです。
マクロだけでなく、キーボードタイピング、データ処理の考え方、仕事のやり方も学べるので大変お得です^^
それだけでも十分なように感じますが、その背景や根底にある身体の使い方や自分自身との向き合い方まで学べてしまいます。
それでは今回はこのへんで。
デビっちんでした♪