ACCESSで自動スクショ
最近、業務自動化を研究していてその過程で
Webのスクショ取る業務があってそれ自動化できないかと
思ってACCESS/VBAでやってみました。
IEしか対応していませんが・・・・・
IEShotという全画面キャプチャ取得できるコードがあり
有効活用させていただきました。ありがとうございます。
下記の構造でテーブルの準備が必要です
seqNo
targetURL
targetSheetName
startCol
endCol
statRow
endRow
targetComent
エラーハンドリングも適当です。ご使用は自己責任で
お願いします。
最初の1回目でエラー出たりでなかったりするんですが
そこの原因がわからない・・・・。
誰か助けていただけると幸いです。
Webのスクショ取る業務があってそれ自動化できないかと
思ってACCESS/VBAでやってみました。
IEしか対応していませんが・・・・・
IEShotという全画面キャプチャ取得できるコードがあり
有効活用させていただきました。ありがとうございます。
下記の構造でテーブルの準備が必要です
seqNo
targetURL
targetSheetName
startCol
endCol
statRow
endRow
targetComent
エラーハンドリングも適当です。ご使用は自己責任で
お願いします。
Option Compare Database 'Sleep関数用 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Sleep関数用 'キャプチャ用 Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) '画面アクティブ制御 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function ShowWindowAsync Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long '取得対象用構造体 Type RetVal SiteUrl As String ExcelsheetName As String ExcelComent As String ExcelStartCol As String ExcelEndCol As String ExcelStartRow As Long ExcelEndRow As Long End Type '//******************************************************************* '// '// テーブルからURLを取得しIEを開きキャプチャを取得しEXCELに貼付 '// '//******************************************************************* Sub AutoCapmain() Dim targetObject As RetVal Dim objIE As InternetExplorer Dim targetCnt As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'テーブルを読込んでURLとEXCELシート名を取得する Dim rs As New ADODB.Recordset rs.Open "select * from t_TargetCap order by seqNo", CurrentProject.Connection targetCnt = DCount("*", "t_TargetCap") 'EXCEL起動 Dim xlApp As Excel.Application Dim xlbook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim nextxlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") xlApp.Visible = True Set xlbook = xlApp.Workbooks.Add Dim i As Long Dim CngSheetName As String Dim chckVal As Boolean Do Until rs.EOF targetObject = getTarget(rs) Call ieNavi(objIE, targetObject.SiteUrl) Call ieCheck(objIE) 'IEの画面キャプチャ取得 Call getCapture(objIE) i = xlbook.Worksheets.Count 'シート判別 Set xlSheet = xlbook.Worksheets(i) If targetObject.ExcelsheetName <> "" Then CngSheetName = targetObject.ExcelsheetName Else CngSheetName = xlSheet.Name End If chckVal = searchSheetName(xlbook, targetObject.ExcelsheetName) If chckVal = True Then Set xlSheet = xlbook.Worksheets(CngSheetName) '最終レコードでシート名が同一でない場合はシート名変更のみ ElseIf i = targetCnt And chckVal = False Then xlSheet.Name = CngSheetName ElseIf i <> targetCnt And chckVal = False Then 'シートを追加 xlSheet.Name = CngSheetName Set nextxlSheet = xlbook.Worksheets.Add(after:=xlbook.Worksheets(i)) Set xlSheet = xlbook.Worksheets(CngSheetName) i = i + 1 Else MsgBox ("シート設定関連でエラー発生") End If '画面貼付 With targetObject Call runExcel(xlSheet, .ExcelStartCol, .ExcelEndCol, .ExcelStartRow, .ExcelEndRow, .ExcelComent) End With rs.MoveNext xlApp.CutCopyMode = False Loop ' 終了処理 xlbook.Worksheets(1).Activate rs.Close objIE.Quit Set objIE = Nothing End Sub '//**************************************************** '// '// EXCELの操作(指定シートにEXCEL貼付) '// '//**************************************************** Function runExcel(xlSheet As Worksheet, startCol As String, _ endCol As String, startRow As Long, endRow As Long, eComment As String) 'On Error GoTo Error_Sub Dim resizeRFlg As Long Dim resizeCFlg As Long resizeRFlg = 1 resizeCFlg = 1 'EXCELをアクティブにする xlSheet.Activate '列の設定(何も入っていない場合の措置) Dim sWidth As Long If startCol = "" Then startCol = "A" End If Dim sCol As Variant Dim eCol As Variant If endCol = "" Then endCol = "F" resizeCFlg = 0 End If '行の設定(何も入っていない場合の措置) Dim sHeight As Long Dim rows As Long If startRow < 1 Then startRow = 1 End If If endRow < 1 Then endRow = 20 resizeRFlg = 0 End If If endRow - startRow > 0 Then rows = endRow - startRow Else rows = 50 End If '高さ、幅指定 sWidth = xlSheet.Range(startCol & "1" & ":" & endCol & "1").Width sHeight = xlSheet.Range("A" & startRow & ":A" & endRow).height Dim shapeName As String 'クリップボードのスクリーンショット貼付 xlSheet.Paste 'TODO:クリップボードの貼付けが失敗したりするので安定しない shapeName = selection.ShapeRange.Name 'リサイズが必要な場合 If resizeCFlg = 1 Or resizeRFlg = 1 Then With xlSheet.Shapes(shapeName) .LockAspectRatio = msoFalse .height = sHeight .Width = sWidth .Top = xlSheet.Range(startCol & startRow).Top .Left = xlSheet.Range(startCol & startRow).Left End With End If 'コメント記載 If eComment <> "" Then Dim comCol As Variant comCol = CNumAlp(xlSheet, endCol) + 1 comCol = CNumAlp(xlSheet, comCol) xlSheet.Range(comCol & startRow).Value = eComment xlSheet.Range(comCol & "1").select End If Exit Function 'Error_Sub: ' MsgBox ("EXCELとブラウザを終了させて再度ACCESSを実行してください。" & _ ' "頻発する場合はエラー内容をお伝えください。" & _ ' "エラー番号: " & Err.Number & Chr(13) & Err.Description) End Function '同一名のシート名称があるか判別 Function searchSheetName(xlsbook As Excel.Workbook, sheetName As String) As Long Dim ws As Worksheet For Each ws In xlsbook.Sheets If ws.Name = sheetName Then ' 存在する searchSheetName = True Exit Function End If Next searchSheetName = False End Function '//**************************************************** '// '// テーブルから対象のURLとシート名、貼付位置を取得する '// '//**************************************************** Function getTarget(rs As ADODB.Recordset) As RetVal With getTarget .SiteUrl = Nz(rs!targetURL) .ExcelsheetName = Nz(rs!targetSheetName) .ExcelStartCol = Nz(rs!startCol) .ExcelEndCol = Nz(rs!endCol) .ExcelStartRow = Nz(rs!statRow) .ExcelEndRow = Nz(rs!endRow) .ExcelComent = Nz(rs!targetComent) End With End Function '//**************************************************** '// '// 画面をキャプチャする '// '//**************************************************** Sub getCapture(objIE As Object) 'IEを最前面に表示 'http://www.macrogirls.net/iesamplecode/vbaie_day2_3.html If IsIconic(objIE.hWnd) Then ShowWindowAsync objIE.hWnd, &H9 End If SetForegroundWindow (objIE.hWnd) 'IEShotを使用しスクロール対応 IEShot.IEShot4IE11 objIE, , "" 'Alt+PrintScreen 'http://www.excel.studio-kazu.jp/kw/20080423200952.html 'keybd_event &H2C, 1, 0, 0 End Sub 'https://www.vba-ie.net/ie/iefind.html '指定したURLを表示 Sub ieNavi(objIE As InternetExplorer, _ urlName As String) objIE.navigate urlName Call ieCheck(objIE) End Sub '完全にページが表示されるまで待機する Sub ieCheck(objIE As InternetExplorer) Dim timeOut As Date timeOut = Now + TimeSerial(0, 0, 20) Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Sleep 1 If Now > timeOut Then objIE.Refresh timeOut = Now + TimeSerial(0, 0, 20) End If Loop timeOut = Now + TimeSerial(0, 0, 20) Do While objIE.Document.ReadyState <> "complete" DoEvents Sleep 1 If Now > timeOut Then objIE.Refresh timeOut = Now + TimeSerial(0, 0, 20) End If Loop End Sub 'https://ateitexe.com/change-alphabet-integer/ 'カラムのアルファベットを数値に変換する関数 Function CNumAlp(xlSheet As Worksheet, va As Variant) As Variant Dim al As String If IsNumeric(va) = True Then '数値だったら al = xlSheet.cells(1, va).Address(RowAbsolute:=False, ColumnAbsolute:=False) '$無しでAddress取得 CNumAlp = Left(al, Len(al) - 1) Else 'アルファベットだったら CNumAlp = xlSheet.Range(va & "1").Column '列番号を取得 End If End Function
最初の1回目でエラー出たりでなかったりするんですが
そこの原因がわからない・・・・。
誰か助けていただけると幸いです。
コメント