裏の高速大量回転法

KTK(高速大量回転)法のやり方、習得へのヒントを中心に発信していきます

【 VBAでIEを操作】読んだ本の一覧を自動的に作成する【 読書メーターの情報を自動取得 】

 

高速大量回転法実践家のデビっちんです。

 

今回、エクセルマクロVBAの機能を使って、ExcelからIE(インターネットエクスプローラー)を操作してウェブから情報を自動取得することをお伝えします。

 

題材は、このブログでも何度かご紹介している「読書メーター」というサイトから、読んだ本の情報をエクセルのシートに書き出す、というものです。

 

 

VBAで自作した理由

読書メーターの使い勝手が今一つ

簡単かつ気軽に本の登録ができて便利な読書メーターですが、使い勝手が今一つなところもあります。

読んだ本の内容は覚えているけどタイトルを忘れてしまったり、なんとなく表紙の絵柄は覚えている、あるいは、いつ読んだかは覚えている

というような本を探すときに、今まで読んだ本の履歴を確認したいときに20冊ずつしか表示されませんから、目的の本を見つけるまで、何度も次のページを押して表示を待つということが度々あり困っていました。

 

KTK(高速大量回転)法に出会うと、読書に対するハードルが下がって読む本が増えますからね。

 

最近読んだ著者の割合は過去1年は表示機能がありますが、過去2年とか全期間とかは表示機能がありません。

 

手作業でリストを作るのは嫌

その他にも色々と集計するためには、過去に読んだ本の内容が一覧化されたデータがあると便利なのですが、20冊ずつ表示されるデータを何度もコピペして、エクセルで一覧データを作るとか嫌です。

読書メーターに読んだ本のCSV出力したいと希望を伝えても、採用されるかは不明ですし、実装されるとしても時間がかかったりと現実的ではありません。

 

ネットで探してみても、この問題は解決しそうにありませんでした。

 

だったら、自分で効率化してみちゃいますか!
という感じてで今回のマクロを作成してみました。

 

僕はこちらのサイトで勉強して、有意義な時間と思考法を取得できました。

エクセルマクロVBA「Web連携」 | エクセルマクロ達人養成塾

 

今回、かなり高度な知識も使っています。


エクセルマクロ?VBA?って何?という人は、こちらをご覧ください。
以下の講座は無料で、僕もこちらから学習をスタートしました。

エクセルマクロ 3日がかりのその仕事、3分で終わらせる方法教えます。 | エクセルマクロ達人養成塾

エクセルマクロ・VBA導入編講座 | エクセルマクロ達人養成塾

 

VBAでIEを操作して、読書メーターの読んだ本をエクセルに書き出す

自動処理の概要

この記事でお伝えするのは、次の画像のように、エクセルからIEを操作して「読書メーター」から自分が過去に読んだ本をExcelに書き出すとというマクロです。

 

sheet_before

の表が、IEの自動入力によって、

 

sheet_after

 

このようになります。

 

リストを書き出している最中に、IEの画面が自動的に変わっていくことに最初は感動します!

 

それなりに感動したら、次からはその時間を本を読んだり別のことをしたりと時間を有意義に使えるので便利です。

 

事前準備

エクセルからウェブの情報を自動的に取得するのですから、以下の準備が必要です。

 

・エクセル
・インターネットエクスプローラー
・インターネットがつながる環境

 

また、エクセルについては以下の2つの準備が必要です。
1. シート名の変更、 URL、ログインID、パスワードの記載
2. VBEの参照設定

 

それでは1つずつ説明していきます。

 

1. シート名の変更、 URL・ログインID・パスワード、取得項目名の記載

エクセルのシートを2つ用意して、1つのシートを「読んだ本の一覧」、もう1つのシートを「ログイン情報」という名前に変更してください。

 

シートの順番は関係ありませんが、シート名は正確に入力してください。

 

 

シート「読んだ本の一覧」のA1~E1のセルに画像と同じ文字を入力してください。

こちらは順番も含めて入力してくださいね。

 

A1セル: NO
B1セル: 読了日
C1セル: タイトル
D1セル: 著者名
E1セル: 感想記載のURL

 

続いて、シート「ログイン情報」に以下の情報を入力してください。

sheet_login

 

C2セル:https://bookmeter.com/login
C3セル:メールアドレス
C4セル:パスワード

 

2. VBEの参照設定

エクセル画面上からVBEを起動し、参照設定を選択してください。
VBEは、shift + F11 で起動できます。

 

参照設定は、メニューバーの「ツール」→「参照設定」です。

 

reference- settings

 

参照設定の中から、以下2つのライブラリにチェックを入れ、
OKをクリックしてください。
1. Microsoft HTML Object Library
2. Microsoft Internet Controls

 

reference-select

 

以上で準備は終了です。

 

サンプルコード

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(高速大量回転)法の習得に行き詰まっている人は、エクセルマクロの習得から再挑戦してみてください。


僕は以下の講座から学びました。

online.pc5bai.com

 

それでは今回はこのへんで。
デビっちんでした♪