記事の内容
VBAでブラウザ自動操作を行える、SeleniumBasicを使ってwebページにアクセス、画面のキャプチャ、エクセルに貼りつけるまでの流れを紹介します。
seleniumでキャプチャした画像をそのままエクセルファイルに貼りつけて保存したい!って方のざっくりとした参考資料になれば…
検証環境
windows8.1
Microsoft Excel 2013
google chrome バージョン: 74.0.3729.169
chromedriver chrome対応バージョン
なぜVBAで?
キャプチャした画像をどこかのディレクトリに保存するのではなく、直接エクセルファイルに貼りつけて保存したかった。
VBAでSeleniumBasicを使用するための準備
こちらのサイトが参考になりました。(丸投げ)
https://sugiyamatatsuya.com/vba-selenium-setup/
実際のコードと解説コメント
ペチョリ…
Option Explicit
' Sleep するために使用
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
' webDriverの生成
Public driver As New ChromeDriver
' 画像を貼りつける位置を設定するために使用。nowHeightPoint はセルの行の位置を表している。
Public nowHeightPoint As Long
' 新規エクセルファイルを開いて、webページにアクセスしてスクショ、それをエクセルファイルに貼りつけて保存して閉じる。
Sub main()
' 新規でファイルを開いた時のワークシートの数を1に設定
Application.SheetsInNewWorkbook = 1
' てはじめにgoogleへアクセス
driver.Get "https://www.google.com/?hl=ja"
driver.Window.Maximize
Dim wb As Workbook
' 新規ワークブックを開く
Set wb = Workbooks.Add
' 最初に貼りつける画像を位置を格納
nowHeightPoint = 1
'qiitaにアクセスしてスクショ、それをエクセルファイルに貼りつける。
screenShotFunction ("https://qiita.com/")
'楽天にアクセスしてスクショ、それをエクセルファイルに貼りつける。
screenShotFunction ("https://www.rakuten.co.jp/")
' webDriverの終了
driver.Close
driver.Quit
' マクロがあるパスと同じ階層に選択したファイル名で保存する。
Dim macroFilePath As String: macroFilePath = ThisWorkbook.Path
wb.SaveAs Filename:=macroFilePath & "\testCapture.xlsx"
MsgBox "保存先:" & macroFilePath & "\testCapture.xlsx"
wb.Close
End Sub
' 受け取ったURLへアクセス、スクショを取って取ったImageをpasteFunctionへ渡す。
Sub screenShotFunction(url As String)
' 引数で受け取ったURL へアクセス
driver.Get url
Sleep 2000
Dim captureImage As Image
' driver.TakeScreenshotで画面を実際にキャプチャしている
Set captureImage = driver.TakeScreenshot
' 画像をリサイズしてエクセルファイルに貼りつけるsub関数を呼ぶ
Call pasteFunction(captureImage)
End Sub
' Imageを受け取ってリサイズしてアクティブシートに貼りつける
Sub pasteFunction(captureImage As Image)
Dim resizeImage As Image
' スクショした画像が大きいのでリサイズ
Set resizeImage = captureImage.Resize(900, 450)
' ここでイメージをクリップボードにコピーしている。
resizeImage.Copy
Sleep 1000
' クリップボードにある画像を nowHeightPoint行 1列目を始点に貼りつける。
ActiveSheet.Paste Destination:=Cells(nowHeightPoint, 1)
' 次に画像を貼りつける位置をセル20個下の位置にしている。
nowHeightPoint = nowHeightPoint + 20
End Sub
コード抜粋(↑のコードを抜き出しただけ。肝の部分的な感じです。)
Dim captureImage As Image
' driver.TakeScreenshotで画面を実際にキャプチャしている
Set captureImage = driver.TakeScreenshot
' スクショした画像が大きいのでリサイズ
Set resizeImage = captureImage.Resize(900, 450)
' ここでイメージをクリップボードにコピーしている。
resizeImage.Copy
' クリップボードにある画像を nowHeightPoint行 1列目を始点に貼りつける。
ActiveSheet.Paste Destination:=Cells(nowHeightPoint, 1)
課題
2枚目以降に貼りつける画像の高さを調節するいい方法が分からなかった。
ImageクラスのToExcel Methodを使ってできそうだったが、読み方がよくわからず死亡…
ToExcel Methodを使えればわざわざクリップボードにコピーして画像をエクセルファイルに貼りつける必要もなくなりそうです。