【チュートリアル】VBAでIE自動化ツールを作る(その10) 書籍検索ツール開発(実装・インプット情報取得)

こんにちは、自動化エンジニアをしています。kozuです。

エクセルVBAによりWebページの要素(テキストボックス、ボタンなど)を操作したり、表示されている情報を取得する自動化ツールの開発方法を紹介します。実際のWebサイトを自動操作し情報を取得するマクロの開発を通して、自動化ツールの開発について学ぶことができます。

本連載では、チュートリアルということでVBAの開発手順から始め、IEの操作についてどのようなページでも共通で使用できるコード(共通部品)を作成します。最初に共通部品を作成しておくことで、自分でIEの自動化ツールを作成する際に少量の実装で効率よく開発できるようになります。

この章では、これまでに実装した共通部品を使用したIEの自動化ツールの開発を行っていきます。出版社(秀和システム)のWebサイトから指定した条件で新しい本を検索するツールを開発します。前回は仕様検討を行いインターフェースを作成したので、今回はVBAの実装としてインプットの取得をしていきます。

1.対象者

ブラウザで定期的に手作業で行っているデータ入力やデータ収集等の作業から開放されたい、楽したいと考えている方を対象に、エクセルVBAで自動化するツールの開発ができるようになることを目指しています。プログラミングの経験がない方でも、コードをコピーすれば開発できるようになっています。

2.開発環境

以下の環境を使用します。
バージョンは異なっていても問題ないと思います。
・OS:Windows10
・エクセル:Microsoft Excel2007
・ブラウザ:InternetExploer11

3.マクロ準備

前回に新規のエクセルブックでインターフェースを作成しました。以下の手順でマクロブックとして保存します。

① 参照設定の追加
VBEを表示し、「ツール」→「参照設定」から「Microsoft HTML Object Library」と「Microsoft Internet Controls」をチェックする
② 共通部品のインポート
ファイルツリーで右クリック→「ファイルのインポート」→「IEControl」を選択する
③ マクロブック「.xlsm」として保存する

4.インプット情報を取得する

「インプット」シートからセルに入力した情報を取得します。

まずは、書籍検索用のモジュールを用意します。標準モジュールとして「SearchBooks」を追加し、以下のコードを追加してください。検索フォームに入力する情報の項目が多いため、構造体として使用することで1つのオブジェクト(変数)にまとめることができます。「Type」の内部は構造体のプロパティになります。取得した情報を格納するための構造対も合わせて定義を追加します。

'検索情報構造体
Public Type SearchInfo
   Keyword As String
   Title As String
   Author As String
   Genre As String
   Seriese As String
   ISBN As String
   Amount As String
   Order As String
End Type

'本情報構造体
Public Type BookInfo
   Title As String
   Author As String
   Genre As String
   Release As String
   ISBN As String
   BookFormat As String
   Price As String
   Url As String
End Type

次に、「Sheet1(インプット)」に以下のコードを追加してください。「info」として構造体を変数を作り、「info.プロパティ名」で値を設定します。

'シート名
Private Const SHEET_NAME_INPUT As String = "インプット"

'セル位置(インプットシート)
Private Const RANGE_URL As String = "D3"
Private Const RANGE_KEYWORD As String = "D4"
Private Const RANGE_TITLE As String = "D5"
Private Const RANGE_AUTHOR As String = "D6"
Private Const RANGE_GENRE As String = "D7"
Private Const RANGE_SERIESE As String = "D8"
Private Const RANGE_ISBN As String = "D9"
Private Const RANGE_AMOUNT As String = "D10"
Private Const RANGE_ORDER As String = "D11"
Private Const RANGE_GET_MAX_COUNT As String = "D12"

Public Sub 書籍検索()
   'インプット情報
   Dim url As String
   Dim getMaxCount As Integer
   Dim info As SearchBooks.SearchInfo
   
   'シートに設定した値を取得
   With ThisWorkbook.Sheets(SHEET_NAME_INPUT)
       url = .Range(RANGE_URL).Value
       info.Keyword = .Range(RANGE_KEYWORD)
       info.Title = .Range(RANGE_TITLE)
       info.Author = .Range(RANGE_AUTHOR)
       info.Genre = .Range(RANGE_GENRE)
       info.Seriese = .Range(RANGE_SERIESE)
       info.ISBN = .Range(RANGE_ISBN)
       info.Amount = .Range(RANGE_AMOUNT)
       info.Order = .Range(RANGE_ORDER)
       getMaxCount = CInt(.Range(RANGE_GET_MAX_COUNT))
   End With
   
End Sub

5.マスタ情報を取得する

「Sheet1(インプット)」に以下のコードを編集してください。「GetMstValue」プロシージャ内で「Find」メソッドを使用することで、指定範囲のセルに一致する文字列が存在するRange(セルオブジェクト)を取得することができます。取得したRangeのRow(行)からテキストに対応するvalueを取得しています。

'シート名
Private Const SHEET_NAME_INPUT As String = "インプット"
Private Const SHEET_NAME_MST As String = "マスタ" '★追加

'セル位置(インプットシート)
'省略

Public Sub 書籍検索()
   'インプット情報
   Dim url As String
   Dim getMaxCount As Integer
   Dim info As SearchBooks.SearchInfo
   
   'シートに設定した値を取得
   With ThisWorkbook.Sheets(SHEET_NAME_INPUT)
       url = .Range(RANGE_URL).Value
       info.Keyword = .Range(RANGE_KEYWORD)
       info.Title = .Range(RANGE_TITLE)
       info.Author = .Range(RANGE_AUTHOR)
       info.Genre = GetMstValue("A", "B", .Range(RANGE_GENRE)) '★修正
       info.Seriese = GetMstValue("C", "D", .Range(RANGE_SERIESE)) '★修正
       info.ISBN = .Range(RANGE_ISBN)
       info.Amount = .Range(RANGE_AMOUNT)
       info.Order = GetMstValue("E", "F", .Range(RANGE_ORDER)) '★修正
       getMaxCount = CInt(.Range(RANGE_GET_MAX_COUNT))
   End With
   
End Sub

 '★追加
'マスタ情報取得
Private Function GetMstValue(ByVal ColText As String, ByVal ColValue As String, ByVal text As String) As String
   Dim result As String
   Dim rangeFind As Object
   Set rangeFind = ThisWorkbook.Sheets(SHEET_NAME_MST).Range(ColText & ":" & ColText).Find(text, LookAt:=xlWhole)
   If rangeFind Is Nothing = False Then
       result = ThisWorkbook.Sheets(SHEET_NAME_MST).Range(ColValue & rangeFind.row).Value
   End If
   
   GetMstValue = result
End Function

6.ボタンとマクロを紐付ける

「インプット」シートの「実行」ボタンからマクロを実行できるように設定します。以下の手順でマクロのシートのオブジェクトとマクロの紐付けを行います。

① 「インプット」シートの「実行」ボタン(図形)を右クリック
② メニューの「マクロの登録」をクリック
③ 「マクロの登録」ダイアログで「Sheet1.書籍検索」を選択
④ 「OK」ボタンクリック

マクロ紐付け

マクロ紐付け2

「書籍検索」プロシージャの中にブレークを追加するかメッセージボックスを表示する処理を追加してから「実行」ボタンをクリックすることでマクロが実行されることを確認できます。


ここまでで、インプット情報の取得ができましたので、次回はIEの操作を実装していきます。

この記事が気に入ったらサポートをしてみませんか?