t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 改良版 スクリーンショットを撮るたびに自動でシートに張り付けるマクロ ~ OnTimeによる恒常ループ




thom.hateblo.jp

Excel
ExcelExcel

ActiveSheetActive
Exit


 
Declare Function OpenClipboard Lib "user32" (Optional ByVal hwnd As Long = 0) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long

Sub Kicker()
    MsgBox "AutoCaptureを開始します。" & vbNewLine & _
        "終了するにはStopボタンをクリックしてください。", vbInformation
    Application.Caption = "★AutoCapture★"
    Sheets.Add After:=Sheets(Sheets.Count)
    Call AutoCapture
End Sub

Sub AutoCapture()
        DimCBAs VariantCB= Application.ClipboardFormats
        Dim TargetRowTop As Double

        If Left(Application.Caption, 3) = "停止中" Then GoTo Quit
        IfCB(1) <> -1 Then
            Fori= 1 To UBound(CB)
                IfCB(i) = xlClipboardFormatBitmap Then
                    With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                        If .Shapes.Count > 0 Then
                            With .Shapes(.Shapes.Count)
                                TargetRowTop = .Top + .Height
                            End With
                        Else
                            TargetRowTop = 0
                        End If
                        cnt = 1
                        Do While TargetRowTop > .Cells(cnt, 1).Top
                            cnt = cnt + 1
                        Loop
                        .Paste Destination:=.Cells(cnt, 1)
                    End With
                    'クリップボードを空にする。
                    OpenClipboard
                    EmptyClipboard
                    CloseClipboard
                End If
            NextiEnd If
        DoEvents
        Application.OnTime DateAdd("s", 1, Now), "AutoCapture"
        Exit Sub
Quit:
    MsgBox "AutoCaptureを停止しました。", vbInformation
    Application.Caption = ""
End Sub

Sub StopCapture()
    Application.Caption = "停止中"
End Sub

画面

MainシートにはStartとStopの2つのボタンがあり、StartはKickerプロシージャを、StopはStopCaptureプロシージャを呼び出す。
f:id:t-hom:20151129120653p:plain

OnTimeループの解説


ExcelDoEvents
Do WhileOnTime

OnTimeApplication


Application.OnTime 時刻, マクロ名

OnTime使5
Sub OnTimeTest()
    Debug.Print Now
    Application.OnTime DateAdd("s", 5, Now), "OnTimeTest"
End Sub

Application

Excel

Excel
OnTime1

ActiveSheetA1ExitApplicationCaption

Excel
Application.Caption = "停止中"

f:id:t-hom:20151129114749p:plain

Application.Caption = ""

使
Sub OnTimeTest()
    If Left(Application.Caption, 3) = "停止中" Then GoTo Quit
    Debug.Print Now
    Application.OnTime DateAdd("s", 5, Now), "OnTimeTest"
    Exit Sub
Quit:
    Application.Caption = ""
    MsgBox "OnTimeTestを終了しました。", vbInformation
End Sub

Sub Stopper()
    Application.Caption = "停止中"
End Sub

StopperOnTimeTest

Application.Caption
Application.Caption
f:id:t-hom:20151129115346p:plain
Left3

OnTimeTest
OnTimeTest
Sub Kicker()
    MsgBox "OnTimeTestを開始します。", vbInformation
    Application.Caption = "実行中"
    Call OnTimeTest
End Sub


OnTimeTest


貼り付け場所の解説


Kicker
Sheets.Add After:=Sheets(Sheets.Count)

AutoCaptureWith
With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    If .Shapes.Count > 0 Then
        With .Shapes(.Shapes.Count)
            TargetRowTop = .Top + .Height
        End With
    Else
        TargetRowTop = 0
    End If
    cnt = 1
    Do While TargetRowTop > .Cells(cnt, 1).Top
        cnt = cnt + 1
    Loop
    .Paste Destination:=.Cells(cnt, 1)
End With

WithIf
    If .Shapes.Count > 0 Then
        With .Shapes(.Shapes.Count)
            TargetRowTop = .Top + .Height
        End With
    Else
        TargetRowTop = 0
    End If

Top
f:id:t-hom:20151129122028p:plain

Top調TargetRowTop
    cnt = 1
    Do While TargetRowTop > .Cells(cnt, 1).Top
        cnt = cnt + 1
    Loop

使


.Paste Destination:=.Cells(cnt, 1)


当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。