【チュートリアル】VBAでIE自動化ツールを作る(その13) 書籍検索ツール開発(実装・シートへ出力)

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

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

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

この章では、これまでに実装した共通部品を使用したIEの自動化ツールの開発を行っていきます。出版社(秀和システム)のWebサイトから指定した条件で新しい本を検索するツールを開発します。前回は詳細ページの情報取得処理を作成したので、今回は取得した情報をシートに出力する処理を実装していきます。

1.対象者

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

2.開発環境

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

3.出力手順

取得した検索結果の情報をシートに出力する手順として以下の順番で行います。

① 検索結果を出力するシートの準備
② データを出力するエリアを準備する
③ 1行ごとにデータをシートに出力する

4.検索結果を出力するシートの準備

検索結果を出力するシートとして「アウトプットひな形」シートをコピーしシート名を「検索結果」とします。1度実行した場合は「検索結果」シートが残っているためシートを削除してから「アウトプットひな形」シートをコピーします。「Sheet1(インプット)」に以下の通りにコードを編集してください。

'検索結果出力
Private Sub OutputSearchResult(ByRef bookInfos() As SearchBooks.BookInfo)
   'シートを削除する
   If ExistsSheet(SHEET_NAME_RESULT) Then
       Application.DisplayAlerts = False
       ThisWorkbook.Sheets(SHEET_NAME_RESULT).Delete
       Application.DisplayAlerts = True
   End If
   
    'ひな形シートをコピーする
   ThisWorkbook.Worksheets(SHEET_NAME_HINAGATA).Copy _
       After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
   ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).name = SHEET_NAME_RESULT

End Sub

'シート存在確認
Private Function ExistsSheet(ByVal sheetName As String) As Boolean
   Dim result As Boolean
   
   Dim sheet As Worksheet
   For Each sheet In ThisWorkbook.Sheets
       If sheet.name = sheetName Then
           result = True
           Exit For
       End If
   Next
   
   ExistsSheet = result
End Function

5.データを出力するエリアを準備する

空のデータ行が1行のみのため、行をコピーしデータ件数分追加します。「Sheet1(インプット)」に以下の通りにコードを編集してください。2行目の空行をコピーし、その下にデータ行数分になるように貼り付けます。「PasteSpecial 」メソッドの引数に「xlPasteAll」を指定しコピーした内容を全て貼り付けることで、セルの書式設定をコピーし罫線の枠が作られます。

'検索結果出力
Private Sub OutputSearchResult(ByRef bookInfos() As SearchBooks.BookInfo)
   '省略

    With ThisWorkbook.Worksheets(SHEET_NAME_RESULT)
       'データを出力するエリアを準備する
       .Range("2:2").Copy
       .Range("3:" & (3 + UBound(bookInfos) - 1)).PasteSpecial (xlPasteAll)
       
   End With
End Sub

6.1行ごとにデータを出力する

出力する準備ができましたので、データを出力します。まずは列を定数として定義します。

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

'列(検索結果(アウトプットひな形)シート)
Private Const COL_RESULT_TITLE As String = "B"
Private Const COL_RESULT_AUTHOR As String = "C"
Private Const COL_RESULT_GENRE As String = "D"
Private Const COL_RESULT_RELEASE As String = "E"
Private Const COL_RESULT_ISBN As String = "F"
Private Const COL_RESULT_BOOK_FORMAT As String = "G"
Private Const COL_RESULT_PRICE As String = "H"
Private Const COL_RESULT_URL As String = "I"

次に、「OutputSearchResult」にセルに値を設定処理を追加します。

'検索結果出力
Private Sub OutputSearchResult(ByRef bookInfos() As SearchBooks.BookInfo)
   '省略

   With ThisWorkbook.Worksheets(SHEET_NAME_RESULT)
       'データを出力するエリアを準備する
       .Range("2:2").Copy
       .Range("3:" & (3 + UBound(bookInfos) - 1)).PasteSpecial (xlPasteAll)
       
       'データを出力する
       Dim i As Integer
       For i = 0 To UBound(bookInfos)
           .Range(COL_RESULT_TITLE & (2 + i)).Value = bookInfos(i).Title
           .Range(COL_RESULT_AUTHOR & (2 + i)).Value = bookInfos(i).Author
           .Range(COL_RESULT_GENRE & (2 + i)).Value = bookInfos(i).Genre
           .Range(COL_RESULT_RELEASE & (2 + i)).Value = bookInfos(i).Release
           .Range(COL_RESULT_ISBN & (2 + i)).Value = bookInfos(i).ISBN
           .Range(COL_RESULT_BOOK_FORMAT & (2 + i)).Value = bookInfos(i).BookFormat
           .Range(COL_RESULT_PRICE & (2 + i)).Value = bookInfos(i).Price
           .Range(COL_RESULT_URL & (2 + i)).Value = bookInfos(i).Url
       Next
   End With
   
End Sub

最後に、「OutputSearchResult」プロシージャの呼び出しを追加します。

Public Sub 書籍検索()
   '省略
   
   '取得結果出力
   Call OutputSearchResult(bookInfos)

   MsgBox ("書籍検索が完了しました。")
   
End Sub

7.出力結果確認

「インプット」シートの「実行」ボタンをクリックし、マクロを実行してみます。以下の画像のように検索結果が出力されれば問題ありません。

結果1

8.微調整

行をコピーし貼り付けているため行が選択状態になっています。また、セルに設定されている文字が見切れたりはみ出して表示されています。以下の通りに修正してください。実行すると以下の画像の通りになります。前回と比べて見やすくなりました。

'検索結果出力
Private Sub OutputSearchResult(ByRef bookInfos() As SearchBooks.BookInfo)
   '省略

   With ThisWorkbook.Worksheets(SHEET_NAME_RESULT)
       '省略
       
       '微調整
       .Range("A:" & COL_RESULT_URL).Columns.AutoFit
       .Range("A1").Select
   End With
   
End Sub

結果2


ここまでで、一通りの機能が完成しました。次回は中途半端になっていたマスタシートを完成させます。

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