3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【SeleniumBasic】キャプチャした画像をエクセルファイルに貼りつける

Last updated at Posted at 2019-06-04

記事の内容

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を使えればわざわざクリップボードにコピーして画像をエクセルファイルに貼りつける必要もなくなりそうです。

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?