その他

VBA:作業前後のwindowHandleを調べる[No72]

投稿日:2020年10月21日 更新日:

スポンサーリンク

動作準備

次の記事のエクセル、プログラムを利用前提の紹介となります。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

また、作成したexcelに「TARGET01」「TARGET02」「MATCHED」「MIS_MATCHED」シートを用意しておきます。

プログラム


Option Explicit

'注意シートに何もないと変数がオーバーフローします。

Const SHEET_TARGET01    As String = "TARGET01"
Const SHEET_TARGET02    As String = "TARGET02"
Const SHEET_MATCHED     As String = "MATCHED"
Const SHEET_MISMATCHED  As String = "MIS_MATCHED"

Public Sub CompareBeforeAndAfterHandle()
    Dim arrayBefore01() As String
    Dim arrayBefore02() As String
    Dim arrayBefore03() As String
    Dim arrayBefore04() As String

    Dim arrayAfter01() As String
    Dim arrayAfter02() As String
    Dim arrayAfter03() As String
    Dim arrayAfter04() As String
    
    Call InitSHEET(SHEET_MATCHED)
    Call InitSHEET(SHEET_MISMATCHED)
    
    Call PutIntoAnArray(SHEET_TARGET01, arrayBefore01, arrayBefore02, arrayBefore03, arrayBefore04)
    Call PutIntoAnArray(SHEET_TARGET02, arrayAfter01, arrayAfter02, arrayAfter03, arrayAfter04)
        
    If UBound(arrayBefore01) >= UBound(arrayAfter01) Then
        Call Comparison(SHEET_TARGET01, arrayBefore01, arrayBefore02, arrayBefore03, arrayBefore04, _
                        SHEET_TARGET02, arrayAfter01, arrayAfter02, arrayAfter03, arrayAfter04)
    Else
        Call Comparison(SHEET_TARGET02, arrayAfter01, arrayAfter02, arrayAfter03, arrayAfter04, _
                        SHEET_TARGET01, arrayBefore01, arrayBefore02, arrayBefore03, arrayBefore04)
    End If
    
    Call SelectSheetRangeA1(SHEET_TARGET01)
    Call SelectSheetRangeA1(SHEET_TARGET02)
    Call SelectSheetRangeA1(SHEET_MATCHED)
    Call SelectSheetRangeA1(SHEET_MISMATCHED)
End Sub

スポンサーリンク


Private Sub Comparison(ByVal SheetNameA As String, ByRef a01() As String, ByRef a02() As String, ByRef a03() As String, ByRef a04() As String, _
                       ByVal SheetNameB As String, ByRef b01() As String, ByRef b02() As String, ByRef b03() As String, ByRef b04() As String)
    Dim matchCounter As Integer
    matchCounter = 2
    
    Dim notMatchCounter As Integer
    notMatchCounter = 2
    
    Dim a As Long
    Dim b As Long
    
    Dim nothingFlg As Boolean
    For a = 0 To UBound(a01)
        For b = 0 To UBound(b01)
            nothingFlg = False
            
            If (StrComp(a01(a), b01(b), vbTextCompare) = 0 And _
                StrComp(a02(a), b02(b), vbTextCompare) = 0 And _
                StrComp(a03(a), b03(b), vbTextCompare) = 0 And _
                StrComp(a04(a), b04(b), vbTextCompare) = 0) Then
                
                Call WriteToCell(SHEET_MATCHED, a, matchCounter, SheetNameA, a01, a02, a03, a04)
                matchCounter = matchCounter + 1
                nothingFlg = True
                Exit For
            End If
        Next b
        
        If nothingFlg = False Then
            Call WriteToCell(SHEET_MISMATCHED, a, notMatchCounter, SheetNameA, a01, a02, a03, a04)
            notMatchCounter = notMatchCounter + 1
        End If
    Next a
End Sub

Private Sub InitSHEET(ByVal sheetName As String)
    With Worksheets(sheetName)
        .Select
        .Cells.Clear
        
        .Cells(1, 1) = "シート名"
        .Cells(1, 2) = "HAND種類"
        .Cells(1, 3) = "HANDID"
        .Cells(1, 4) = "captionName"
        .Cells(1, 5) = "className"
         
        .Range(.Cells(1, 1), .Cells(1, 5)).Font.Color = RGB(0, 0, 0)
        .Range(.Cells(1, 1), .Cells(1, 5)).Interior.Color = RGB(169, 208, 142)
         
        .Range(.Cells(1, 1), .Cells(1, 5)).Borders.LineStyle = True
        .Range(.Cells(1, 1), .Cells(1, 5)).BorderAround Weight:=xlMedium
    End With
End Sub

Private Sub PutIntoAnArray(ByVal sheetName As String, _
        ByRef array01() As String, _
        ByRef array02() As String, _
        ByRef array03() As String, _
        ByRef array04() As String)

    With Worksheets(sheetName)
        .Select
        
        Dim maxRow As Long
        maxRow = .Cells(1, 1).End(xlDown).Row
        
        Dim counter As Integer
        counter = 0
        Dim i As Long
        For i = 2 To maxRow
            ReDim Preserve array01(counter)
            ReDim Preserve array02(counter)
            ReDim Preserve array03(counter)
            ReDim Preserve array04(counter)
            
            array01(counter) = .Cells(i, 1).Value
            array02(counter) = .Cells(i, 2).Value
            array03(counter) = .Cells(i, 3).Value
            array04(counter) = .Cells(i, 4).Value
            
            counter = counter + 1
        Next
    End With
End Sub

スポンサーリンク


Private Sub WriteToCell(ByVal targetSheetName As String, _
        ByVal i As Integer, _
        ByVal counter As Integer, _
        ByVal sheetName As String, _
        ByRef arrayTemp01() As String, _
        ByRef arrayTemp02() As String, _
        ByRef arrayTemp03() As String, _
        ByRef arrayTemp04() As String)

    With Worksheets(targetSheetName)
        .Select
        .Cells(counter, 1) = sheetName
        .Cells(counter, 2) = arrayTemp01(i)
        .Cells(counter, 3) = arrayTemp02(i)
        .Cells(counter, 4) = arrayTemp03(i)
        .Cells(counter, 5) = arrayTemp04(i)
    End With
End Sub

Private Sub SelectSheetRangeA1(ByVal sheetName As String)
    Sheets(sheetName).Activate
    ActiveWindow.Zoom = 70
    Range("A1").Select
End Sub

実行イメージ

次の記事内で紹介の「ハンドル情報出力」を実行し「HWND」シートに出力し、「TARGET01」シートに内容をコピー。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

何か作業した後に、再度「ハンドル情報出力」を実行し「TARGET02」に内容をコピー。

その後、この記事の「CompareBeforeAndAfterHandle」を実行すると、
①「TARGET01」「TARGET02」で一致したものは「MATCHED」シートに出力し、②不一致したものは「MIS_MATCHED」シートに出力しました。

「TARGET01」「TARGET02」の内容は意図的に不一致するようにしています。

関連記事

no image
ウィンドウハンドル関連の記事一覧[No74]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

タグ

-その他

© 2021 BookALittle