G-Tool2-Main-M01_WS比較用

Excel VBA

ワークシートの比較ツール

Mainの【ワークシート比較ツール.xlsm】と、結果を書き込む【ワークシート比較結果雛形.xlsm】の
2つのブックを作成します。(Microsoft365 64bit環境推奨)

マクロコードの貼り付け

 作成されたMainファイルに標準モジュールを追加します。
 1. 【Alt】+【F11】キーを押下し、VBE画面を表示
 2. 【挿入】タブから【標準モジュール】を選択し、標準モジュールを作成
 3. 下記ボックス内をコピーし、標準モジュールに貼り付け
 4.モジュール名を【M01_Main】に変更


 G-Tool2-Main-B00_WS比較用 につづく

 モジュール名:M01_Main
Option Explicit
'====================================================
'     【Main】シート 【比較】ボタン押下で作動
'====================================================
Sub CompSheets()

    Dim Ans As Integer
    
    Dim formatFile As String
    Dim formatFName As String
    Dim dstFolder As String
    Dim compFile1 As String
    Dim compFile2 As String
    Dim compFileName1 As String
    Dim compFileName2 As String
    Dim compFName1 As String
    Dim compFName2 As String
    Dim strCompSht1 As String
    Dim strCompSht2 As String
    Dim NewPath As String
    Dim dstFLen As Long
    Dim nowFLen As Long
    Dim MaxLen As Long
    Dim cnt1 As Long
    Dim cnt2 As Long
    Dim errMsg As String
    Dim MSG As String
    Dim hcAry As Variant
    Dim tHC As String               'tempHeadCharacter: A, B, C
    
    Dim tempName1 As String
    Dim tempName2 As String
    Dim nameHead As String
    Dim shtName As String
    Dim shtName1 As String
    Dim shtName2 As String
    Dim buf As String
    Dim buf1 As String
    Dim buf2 As String
    Dim buf3 As String
    Dim buf4 As String

    Dim tmp1 As Variant
    Dim tmp2 As Variant
    Dim tabColor As Variant
    Dim dstShtAry As Variant
    Dim dstShtAryl As Variant
    Dim dstShtAry2 As Variant
    Dim myColor As Long
    
    Dim CompBook1 As Workbook
    Dim CompBook2 As Workbook
    Dim formatBook As Workbook
    Dim dstBook As Workbook
    Dim dstfileName As String
    Dim dstBookName As String
    Dim orgSht1 As Worksheet
    Dim orgSht2 As Worksheet
    Dim dstSht1 As Worksheet
    Dim dstSht2 As Worksheet
    Dim dstSht3 As Worksheet
    Dim dstSht4 As Worksheet
    Dim orgSht As Worksheet
    Dim wb As Workbook
    
    Dim diffColor As Long
    Dim strPrefix As String
    Dim strTemp As String
    Dim strVisi As String
    
    '【比較結果】ブック
    Dim wsComp As Worksheet         '【比較結果】シート
    Dim wsFst As Worksheet
    Dim wsScd As Worksheet
    Dim wsDiff As Worksheet
    Dim wsRatio As Worksheet
    
    Dim fstMaxRow As Long           '最終行
    Dim fstMaxCol As Long           '最終列
    Dim scdMaxRow As Long           '最終行
    Dim scdMaxCol As Long           '最終列
    
    Dim preAry1() As Variant
    Dim preAry2() As Variant
    Dim fstAry() As Variant
    Dim sedAry() As Variant
    Dim orgMemoAry() As Variant
    Dim diffAry() As Variant
    Dim ratioAry() As Variant
    Dim diffMemoAry() As Variant
    Dim compAry() As Variant
    Dim rsltAry() As Variant
    Dim wdwZoom() As Variant

    Dim strFst As String
    Dim strSed As String
    Dim strDiff As String
    Dim strRatio As String
    Dim tmpMemo As String
    Dim diffMemo As String
    Dim cFormat As String
    
    Dim dblFst As Double
    Dim dblScd As Double
    Dim dblDiff As Double
    Dim dblRatio As Double
    Dim dblZoom As Double
    
    Dim chkCnt As Double            '比較検証セル数
    Dim misMCnt As Double           '不一致(ミスマッチ)件数
    Dim misCnt As Long              '不一致(ミスマッチ)表示件数(1,000件まで)
    Dim addNo As Long

    Dim i As Long
    Dim ii As Long
    Dim j As Long
    Dim x As Long
    Dim xx As Long
    Dim xRow As Long            '1列の最終行
    Dim MaxRow As Long          '最終行
    Dim MaxCol As Long          '最終列
    Dim CopyRng As Range
    Dim shp As Shape
    Dim sttTime As Double
    Dim ngStr As Variant
    
    Dim makeDiffSht As Boolean
    Dim addPrefix As Boolean
    Dim IsOpen As Boolean
    Dim IsSht1 As Boolean
    Dim IsSht2 As Boolean
    Dim notComp As Boolean
    Dim nmlTmn As Boolean       '正常終アフラグ:normal Termination

    Bln_Err = False
    nmlTmn = False
    
    ErrProsName = "CompSheets"
    On Error GoTo CompSheets_Err
    
    IsCall = False              '初期値

    '処理開始確認
    Ans = MsgBox("ファイルをワークシート毎に比較し、結果を作成します。" & _
            vbCrLf & vbCrLf & _
            "ツール実行中は、ラァイルのコピー&ペースト作業を行わないでください。" _
            & vbCrLf & "処理を開始します。", _
            vbQuestion + vbOKCancel + vbDefaultButton1, "【ワークシート比較ツール】")
    
    Select Case Ans
        Case vbOK
            '処理続行
        Case vbCancel
            MsgBox "キャンセルしました。"
            Exit Sub
    End Select

    Call SetObject
    
    With wsMain
    
        .Range("C12").Value = "比較開始日時:" & Now
        Sleep 300
        
        'ステータスバーに状況表示
        Call showStatus("比較処理中")
        Call StopUpdating
        
        '比較結果雛形ファイル
        formatFile = .Range("E4").Value
        formatFile = Replace(formatFile, "/", "\")
        formatFName = Mid(formatFile, InStrRev(formatFile, "*") + 1)
        '保存フォルダ
        dstFolder = Range("E5").Value
        '比較結果ファイル名
        dstfileName = Range("E6").Value
        
        '比較ファイル① パス&ワークシート
        compFile1 = .Range("E9").Value
        strCompSht1 = .Range("G9").Value
        '比較ファイル② パス&ワークシート
        compFile2 = .Range("E10").Value
        strCompSht2 = .Range("G10").Value
        
        makeDiffSht = False
        If .OptionButtons("Option 作成する").Value = xlOn Then
            makeDiffSht = True
        ElseIf .OptionButtons("Option 作成しない").Value = xlOn Then
            makeDiffSht = False
        End If
        
    End With

'----------------------------------------------------------------------------
'     入カチェック
'----------------------------------------------------------------------------
    
    'ステータスバーに状況表示
    Call showStatus("(2) 入力チェック中")
    '空白、存在チェック
    errMsg = ""     '初期値
    If formatFile = "" Then
        errMsg = "比較結果雛形ファイルを指定してください。"
        GoTo InputCheck_Err
    Else
        If Dir(formatFile, vbNormal) = "" Then
            errMsg = "比較結果雛形ファイルパスを確認してください。"
            GoTo InputCheck_Err
        End If
    End If
    
    If dstFolder = "" Then
        errMsg = "保存先フォルダを指定してください"
        GoTo InputCheck_Err
    Else
        If Right(dstFolder, 1) = "\" Then
            dstFolder = Trim(Left(dstFolder, Len(dstFolder) - 1))
        End If
        
        dstFLen = Len(dstFolder)
        
        If Dir(dstFolder, vbDirectory) = "" Then
            errMsg = "保存先フォルダを確認してください。"
            GoTo InputCheck_Err
        End If
      
    End If
    
    If dstfileName = "" Then
        '比較ファイル①から結果ファイル名を作成
    Else
        'ユーザ指定がある場合、名前チェック
        'フルパス:218文字を超えると保存できない(Windowsは255文字)
        nowFLen = dstFLen + Len(dstfileName) + 21
        If nowFLen > 218 Then
            MaxLen = 218 - dstFLen - 21
            nowFLen = Len(dstfileName)
            errMsg = "【比較結果ファイル名】文字数が長すぎます。" & vbCr & _
            "現在:" & Len(dstfileName) & " 文字 " & MaxLen & " 文字までに" & vbCr & _
            "変更してください。"
            GoTo InputCheck_Err
        End If
        
        ngStr = Array("\", "/", """""", "<", ">", "?", "[", "]", ":", "|", "*")
        For i = 0 To UBound(ngStr)
            buf = ngStr(i)
            If InStr(dstfileName, buf) > 0 Then
                errMsg = "使用不可文字【比較結果ファイル名】:" & buf
                Exit For
            End If
            If errMsg <> "" Then
                GoTo InputCheck_Err
            End If
        Next i
    End If
    If compFile1 = "" Then
        errMsg = "比較ファイル①を指定してください。"
        GoTo InputCheck_Err
    Else
        If Dir(compFile1, vbNormal) = "" Then
            errMsg = "比較ファイル①を確認してください。"
            GoTo InputCheck_Err
        Else
            compFile1 = Replace(compFile1, "/", "\")
            compFName1 = Mid(compFile1, InStrRev(compFile1, "\") + 1)
        End If
    End If
    
    If compFile2 = "" Then
        errMsg = "比較ファイル②を指定してください。"
        GoTo InputCheck_Err
    Else
        If Dir(compFile2, vbNormal) = "" Then
            errMsg = "比較ファイル②を確認してください。"
            GoTo InputCheck_Err
        Else
            compFile2 = Replace(compFile2, "/", "\")
            compFName2 = Mid(compFile2, InStrRev(compFile2, "\") + 1)
            
            If compFile1 = compFile2 Then
                errMsg = "比較ファイル①,②は同じファイルです。"
                GoTo InputCheck_Err
            End If
        End If
    End If
    
    If strCompSht1 = "" Then
       errMsg = "比較ファイル①ワークシートを指定してください。"
       GoTo InputCheck_Err
    Else
        'vbCrをvbLfに変換  ''本当は不要
        strCompSht1 = Replace(strCompSht1, vbCr, vbLf)
        tmp1 = Split(strCompSht1, vbLf)
    End If
    If strCompSht2 = "" Then
        errMsg = "比較ファイル②ワークシートを指定してください。"
        GoTo InputCheck_Err
    Else
        'vbCrをvbLfに変換    ''本当は不要
        strCompSht2 = Replace(strCompSht2, vbCr, vbLf)
        tmp2 = Split(strCompSht2, vbLf)
    End If
    
    If UBound(tmp1) <> UBound(tmp2) Then
        errMsg = "比較シート数が異なります。確認してください。"
        GoTo InputCheck_Err
    End If
    
    
    '↑↑↑ 入カチェックここまで ↑↑↑
'----------------------------------------------------------------------------
    dstFolder = dstFolder & "\"
    If dstfileName = "" Then
        'ユーザ指定がない場合
        NewPath = dstFolder & "比較_" & compFName1 & Format(Now, "_YYMMDD _hhmm") & ".xlsm"
    Else
        'ユーザ指定がある場合
         NewPath = dstFolder & "比較_" & dstfileName & Format(Now, "_YYMMDD _hhmm") & ".xlsm"
    End If
    
    dstBookName = Mid(NewPath, InStrRev(NewPath, "\") + 1)
    
    'ステータスバーに状況表示
    Call showStatus("(3)転記処理中")
    
    '比較結果雛形ファイルについて
    '開かれているファイルかどうか確認
    IsOpen = False
    For Each wb In Workbooks
        If wb.Name = formatFName Then
            If wb.FullName = formatFile Then
                IsOpen = True
                Set formatBook = wb
                Exit For
            Else
                wb.Close
            End If
        End If
    Next wb
    
    If IsOpen Then
        formatBook.Saves Filename:=NewPath
        Set dstBook = Workbooks(formatFName)
        Set formatBook = Nothing
    Else
        'フォーマットファイルをコピーし、結果ファイルを作成
        FileCopy formatFile, NewPath
        '読み取りではなく、リンク更新なしで開く
        Set dstBook = Workbooks.Open(NewPath, ReadOnly:=False, UpdateLinks:=0)
        If Err.Number > 0 Then
            MsgBox "Open時エラー: 比較結果ファイルが開けませんでした。" & vbCr & _
                    "確認してください。処理を終了します。", vbExclamation
            Err.Clear
            GoTo CompSheets_Exit
        End If
    End If

    '【比較結果】ファイルにおいて
    With dstBook
        If IsShtOwb("比較結果", dstBookName) = False Then
            MsgBox "比較結果ファイルに比較結果シートが存在しません。" & vbCr & _
                    "確認してください。処理を終了します。", vbExclamation
            GoTo CompSheets_Exit
        End If
    End With
    
'----------------------------------------------------------------------------
    hcAry = Array("a", "b", "с")
    tabColor = Array(rgbMidnightBlue, rgbRoyalBlue, rgbDarkTurquoise)

    If compFName1 = compFName2 Then
    '【比較ファイル①】ファイル名と【比較ファイル②】 ファイル名が同じ場合
        For Each wb In Workbooks
            If wb.Name = compFName2 Then
                If wb.FullName = compFile2 Then
                    '【比較ファイル②】を開いていたら閉じる
                    wb.Close
                    Exit For
                End If
            End If
        Next wb
    End If
    
    '【比較ファイル①】ファイルについて
    '開かれているファイルかどうか確認
    IsOpen = False
    For Each wb In Workbooks
        If wb.Name = compFName1 Then
            If wb.FullName = compFile1 Then
                IsOpen = True
                Set CompBook1 = wb
                Exit For
            Else
                '比較ファイル①ではない
                '同名ファイルは閉じる
                wb.Close
             End If
        End If
    Next wb

    '【比較ファイルの】のシートを【比較結果】ファイルにコピー
    '読み取り、リンク更新なしで開く
    If IsOpen = False Then
        Set CompBook1 = Workbooks.Open(Filename:=compFile1, ReadOnly:=True, UpdateLinks:=0)
    End If
    '【比較ファイル①】において
    With CompBook1
        ReDim wdwZoom(UBound(tmp1))
        For x = 0 To UBound(tmp1)
       
            shtName1 = CStr(tmp1(x))
            myColor = tabColor(x)
            tHC = CStr(hcAry(x))
            tempName1 = Left(shtName1, 24)
    
            'シートが存在するか確認
            If IsShtOwb(shtName1, compFName1) Then
            
                '存在する場合
                Set orgSht1 = .Sheets(shtName1)
                orgSht1.Copy After:=dstBook.Worksheets(dstBook.Worksheets.Count)
                Sleep 200
                Application.CutCopyMode = False
                Set dstSht1 = ActiveSheet
                wdwZoom(x) = ActiveWindow.Zoom
                buf1 = tHC & "①_" & tempName1
                
                With dstSht1
                    .Name = buf1
                    .Tab.Color = myColor
                    '値貼り付け
                    With .UsedRange
                        .Value = .Value
                    End With
                End With
                '指定シートの余分な余白やマクロボタンを削除等を行う
                Call cutShtExtra(buf1, dstBookName)
               
                Set orgSht1 = Nothing
            Else
                
                '存在しない場合
                With dstBook
                    Worksheets.Add After:=.Worksheets(.Worksheets.Count)
                    Set dstSht1 = ActiveSheet
                    buf1 = tHC & "①_" & tempName1
                    dstSht1.Name = buf1
                    dstSht1.Tab.Color = myColor
                    dstSht1.Range("A1").Value = "【比較ファイル①】に対象シートなし"
                End With
            End If
            
            Set dstSht1 = Nothing

        Next x
        
        '保存せずに閉じる
        .Close False
    End With
    Set CompBook1 = Nothing
    
    '【比較ファイル②】ファイルについて
    '開かれているファイルかどうか確認
    IsOpen = False
    For Each wb In Workbooks
        If wb.Name = compFName2 Then
            If wb.FullName = compFile2 Then
                IsOpen = True
                Set CompBook2 = wb
                Exit For
            Else
                '比較ファイル②ではない
                '同名ファイルは閉じる
                wb.Close
            End If
        End If
    Next wb
    
    '読み取り、リンク更新なしで開く
    If IsOpen = False Then
        Set CompBook2 = Workbooks.Open(Filename:=compFile2, ReadOnly:=True, UpdateLinks:=0)
    End If
    With CompBook2

        For x = 0 To UBound(tmp2)
        
            shtName2 = CStr(tmp2(x))
            myColor = tabColor(x)
            tHC = CStr(hcAry(x))
            tempName2 = Left(shtName2, 24)
            
            buf2 = tHC & "②_" & tempName2
            buf3 = tHC & "③_" & tempName2 & "(差分)"
            buf4 = tHC & "④_" & tempName2 & "(比率)"
            
            '【tHC & "①_" ~】シートの位置を確認
            nameHead = tHC & "①_"
            If IsShtNo(nameHead, dstBook.Name) > 0 Then
                xx = IsShtNo(nameHead, dstBook.Name)
            End If
            
            'シートが存在するか確認
            If IsShtOwb(shtName2, compFName2) Then
                
                '存在する場合
                Set orgSht2 = .Sheets(shtName2)
                orgSht2.Copy After:=dstBook.Worksheets(xx)
                ActiveWindow.Zoom = wdwZoom(x)
                If makeDiffSht Then
                    orgSht2.Copy After:=dstBook.Worksheets(xx)
                    ActiveWindow.Zoom = wdwZoom(x)
                    orgSht2.Copy After:=dstBook.Worksheets(xx)
                    ActiveWindow.Zoom = wdwZoom(x)
                End If
                Sleep 100
                Application.CutCopyMode = False
                Set dstSht2 = dstBook.Worksheets(xx + 1)
                
                With dstSht2
                    .Name = buf2
                    .Tab.Color = myColor
                    '値貼り付け
                    With .UsedRange
                        .Value = .Value
                    End With
                End With
                '指定シートの余分な余白やマクロボタンを削除 等を行う
                Call cutShtExtra(buf2, dstBookName)
                    
                If makeDiffSht Then
                
                    Set dstSht3 = Worksheets(xx + 2)
                    
                    With dstSht3
                        .Name = buf3
                        .Tab.Color = myColor
                        '値貼り付け
                        With .UsedRange
                            .Value = .Value
                        End With
                    End With
                    '指定シートの余分な余白やマクロボタンを削除 等を行う
                    Call cutShtExtra(buf3, dstBookName)
                    Set dstSht4 = Worksheets(xx + 3)

                    With dstSht4
                        .Name = buf4
                        .Tab.Color = myColor
                        '値貼り付け
                        With .UsedRange
                            .Value = .Value
                        End With
                    End With
                    '指定シートの余分な余白やマクロボタンを削除 等を行う
                    Call cutShtExtra(buf4, dstBookName)
                End If
                
            Else
                '存在しない場合
                With dstBook
                    Worksheets.Add After:=.Worksheets(xx)
                    Set dstSht2 = ActiveSheet
                    buf2 = tHC & "②_" & tempName2
                    dstSht2.Name = buf2
                    dstSht2.Tab.Color = myColor
                    dstSht2.Range("A1").Value = "【比較ファイル②】に対象シートなし"
                End With
            End If
                
            'エラーを無視
            On Error Resume Next
            Set orgSht2 = Nothing
            Set dstSht2 = Nothing
            Set dstSht3 = Nothing
            Set dstSht4 = Nothing
            'エラー制御を戻す
            On Error GoTo 0
            
        Next x
        '保存せずに閉じる
        .Close False
    End With
    Set CompBook2 = Nothing
        
'----------------------------------------------------------------------------
'     比較処理
'----------------------------------------------------------------------------
    'ステータスバーに状況表示
    Call showStatus("(4) 比較処理中")
    With wsMain
        '差異あり: 背景色指定
        If .OptionButtons("Option 青").Value = xlOn Then
            '青
            diffColor = RGB(0, 176, 240)
        ElseIf .OptionButtons("Option 緑").Value = xlOn Then
            '緑
            diffColor = RGB(0, 255, 0)
        ElseIf .OptionButtons("Option 黄").Value = xlOn Then
            '黄
            diffColor = RGB(255, 255, 0)
        End If
        
    End With

    With dstBook
        Call BreakLink
        Set wsComp = .Worksheets("比較結果")
        With wsComp
            .Range("E8").Value = compFile1
            .Range("L8").Value = FileDateTime(compFile1)
            .Range("E10").Value = compFile2
            .Range("L10").Value = FileDateTime(compFile2)
        End With

        'いったん保存:UsedRangeを反映するため
        .Save
        strPrefix = "'"
        For x = 0 To UBound(tmp1)

            shtName1 = CStr(tmp1(x))
            shtName2 = CStr(tmp2(x))
            '【比較結果】シート
            With wsComp
                addNo = 6 * x
                .Cells(14, 5 + addNo).Value = shtName1
                .Cells(14, 6 + addNo).Value = shtName2
            End With
            Call showStatus("(4) 比較処理中ワークシート:" & shtName1)
            IsSht1 = True
            IsSht2 = True
            tHC = CStr(hcAry(x))
            nameHead = tHC & "①_"
            If IsShtNo(nameHead, dstBook.Name) > 0 Then
                xx = IsShtNo(nameHead, dstBook.Name)
                Set wsFst = .Worksheets(xx)
            End If
            If InStr(wsFst.Range("A1").Value, "に対象シートなし") > 0 Then
                IsSht1 = False
            End If
            
            nameHead = tHC & "②_"
            If IsShtNo(nameHead, dstBook.Name) > 0 Then
                xx = IsShtNo(nameHead, dstBook.Name)
                Set wsScd = .Worksheets(xx)
            End If
            If InStr(wsScd.Range("A1").Value, "に対象シートなし") > 0 Then
                IsSht2 = False
            End If
            If makeDiffSht Then
                nameHead = tHC & "③_"
                If IsShtNo(nameHead, dstBook.Name) > 0 Then
                    xx = IsShtNo(nameHead, dstBook.Name)
                    Set wsDiff = .Worksheets(xx)
                End If
                nameHead = tHC & "④_"
                If IsShtNo(nameHead, dstBook.Name) > 0 Then
                    xx = IsShtNo(nameHead, dstBook.Name)
                    Set wsRatio = .Worksheets(xx)
                End If
            End If

            If IsSht1 = False Or IsSht2 = False Then
                '【比較結果】シート
                With wsComp
                    If IsSht1 = False Then
                        .Cells(14, 5 + addNo).Value = "なし:" & shtName1
                        .Cells(14, 5 + addNo).Interior.Color = RGB(255, 255, 102)
                    End If
                    If IsSht1 = False Then
                        .Cells(14, 6 + addNo).Value = "なし:" & shtName2
                        .Cells(14, 6 + addNo).Interior.Color = RGB(255, 255, 102)
                    End If
                    .Cells(12, 6 + addNo).Value = "対象シートなし"
                    .Cells(12, 6 + addNo).Interior.Color = RGB(255, 255, 102)
                    .Cells(13, 6 + addNo).Value = ""
                    .Cells(13, 6 + addNo).Interior.Color = RGB(255, 255, 102)
                End With
                GoTo NextX
                
            End If
            
            With wsFst
                '使用済み範囲の最終行、最終列
                With .UsedRange
                    fstMaxRow = .Rows(.Rows.Count).Row
                    fstMaxCol = .Columns(.Columns.Count).Column
                End With
            End With
            With wsScd
                '使用済み範囲の最終行、最終列
                With .UsedRange
                    scdMaxRow = .Rows(.Rows.Count).Row
                    scdMaxCol = .Columns(.Columns.Count).Column
                End With
            End With
            
            MaxRow = WorksheetFunction.Max(fstMaxRow, scdMaxRow)
            MaxCol = WorksheetFunction.Max(fstMaxCol, scdMaxCol)

            If MaxRow = 1 And MaxCol = 1 Then
                '【比較結果】シート
                With wsComp
                    addNo = 6 * x
                    .Cells(12, 6 + addNo).Value = "対象データなし"
                    .Cells(13, 6 + addNo).Value = 0
                End With
                GoTo NextX

            End If

            With wsFst
            
                ReDim preAry1(1 To MaxRow, 1 To MaxCol)
                ReDim fstAry(1 To MaxRow, 1 To MaxCol)
                
                preAry1 = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol))
                fstAry = Range(.Cells(1, 1), .Cells(MaxRow, MaxCol))
                
                For i = 1 To MaxRow
                    For j = 1 To MaxCol
                        addPrefix = False
                        strTemp = ""
                        If .Cells(i, j).PrefixCharacter = strPrefix Then
                            If Left(preAry1(i, j), 1) <> strPrefix Then
                                addPrefix = True
                                strTemp = strPrefix & CStr(preAry1(i, j))
                            Else
                                strTemp = CStr(preAry1(i, j))
                            End If
                        Else
                           strTemp = CStr(preAry1(i, j))
                        End If
                        If IsDate(strTemp) Then
                            strTemp = "'" & strTemp
                        End If
                        strVisi = .Cells(i, j).Text
                        If InStr(strVisi, "年度") > 0 Then
                            If addPrefix Then
                                strTemp = strPrefix & strVisi
                            Else
                                strTemp = strVisi
                            End If
                        End If
                        strTemp = Replace(strTemp, vbCrLf, "")
                        fstAry(i, j) = strTemp
                    Next j
                    
                Next i
                Erase preAry1
            End With
            
            With wsScd
                
                ReDim preAry2(1 To MaxRow, 1 To MaxCol)
                ReDim scdAry(1 To MaxRow, 1 To MaxCol)
                
                preAry2 = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol))
                scdAry = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol))
                orgMemoAry = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol))

                For i = 1 To MaxRow
                    For j = 1 To MaxCol
                        addPrefix = False
                        strTemp = ""
                        If .Cells(i, j).PrefixCharacter = strPrefix Then
                            If Left(preAry2(i, j), 1) <> strPrefix Then
                                addPrefix = True
                                strTemp = strPrefix & CStr(preAry2(i, j))
                            Else
                                strTemp = CStr(preAry2(i, j))
                            End If
                        Else
                            strTemp = CStr(preAry2(i, j))
                        End If
                        If IsDate(strTemp) Then
                            strTemp = "'" & strTemp
                        End If
                        strVisi = .Cells(i, j).Text
                        If InStr(strVisi, "年度") Then
                            If addPrefix Then
                                strTemp = strPrefix & strVisi
                            Else
                                strTemp = strVisi
                            End If
                        End If
                        strTemp = Replace(strTemp, vbCrLf, "")
                        scdAry(i, j) = strTemp
'========================================================================================
                        With .Cells(i, j)
                            If TypeName(.Comment) = "Nothing" Then
                                'セルにコメントなし
                                tmpMemo = ""
                            Else
                                'セルにコメントあり
                                tmpMemo = .Comment.Text
                            End If
                            orgMemoAry(i, j) = tmpMemo
                        End With
                    Next j
                    
                Next i
                
                ReDim diffAry(1 To MaxRow, 1 To MaxCol)
                ReDim ratioAry(1 To MaxRow, 1 To MaxCol)
                ReDim diffMemoAry(1 To MaxRow, 1 To MaxCol)
'*** 比較 ****************************************************
                misMCnt = 0
                misCnt = 0
                chkCnt = MaxRow * MaxCol
                cFormat = "#,##0.0############;-#,##0.0################;0;@"
                For i = 1 To MaxRow
                    For j = 1 To MaxCol
                        strFst = CStr(fstAry(i, j))
                        strSed = CStr(scdAry(i, j))
                        strRatio = ""
                        diffMemo = ""

                        If strFst <> strSed Then
                            '不一致の場合
                            misMCnt = misMCnt + 1
                            
                            If misMCnt <= 1000 Then
                                misCnt = misCnt + 1
                                ReDim Preserve compAry(1 To 5, 1 To misCnt)
                                
                                compAry(1, misCnt) = misMCnt
                                compAry(2, misCnt) = .Cells(i, j).Address(False, False)
                                compAry(3, misCnt) = strFst
                                compAry(4, misCnt) = strSed
                                compAry(5, misCnt) = " "
                            End If
                            
                            If IsDate(strFst) = True And IsDate(strSed) = True Then
                                '両方 日付の場合
                                dblDiff = 0
                                dblRatio = 0
                            
                                diffMemo = "前値:" & fstAry(i, j) & vbCrLf & _
                                           "今値:" & scdAry(i, j)
                           
                            ElseIf IsNumeric(strFst) = True And IsNumeric(strSed) = True Then
                                '両方 数値の場合
                                dblFst = CDbl(fstAry(i, j))
                                dblScd = CDbl(scdAry(i, j))
                                
                                If makeDiffSht Then
                                    dblDiff = dblScd - dblFst
                                    diffMemo = "前値:" & Format(fstAry(i, j), cFormat) & vbCrLf & _
                                               "今値:" & Format(scdAry(i, j), cFormat) & vbCrLf & _
                                               "差分:" & Format(dblDiff, cFormat)
                                Else
                                    diffMemo = "前値:" & fstAry(i, i) & vbCrLf & _
                                               "今値:" & scdAry(i, j)
    
                                End If
                                If dblFst = 0 Then
                                    If makeDiffSht Then
                                        strRatio = "ー"
                                        diffMemo = diffMemo & vbCrLf & _
                                                   "比率:" & strRatio
                                    End If
                                Else
                                    If makeDiffSht Then
                                        dblRatio = dblScd / dblFst
                                        diffMemo = diffMemo & vbCrLf & _
                                                   "比率:" & Format(dblRatio, "0.0%")
                                        wsRatio.Cells(i, j).NumberFormatLocal = "0.0%;[赤]-0.0%;"
                                    End If
                                End If
                                    
                            Else
                                'それ以外
                                dblDiff = 0
                                dblRatio = 0
                                
                                diffMemo = "前値:" & Format(fstAry(i, j), cFormat) & vbCrLf & _
                                           "今値:" & Format(scdAry(i, j), cFormat)
                            End If
                            wsScd.Cells(i, j).Interior.Color = diffColor
                            If makeDiffSht Then
                                wsDiff.Cells(i, j).Interior.Color = diffColor
                                wsRatio.Cells(i, j).Interior.Color = diffColor
                            End If
                        Else
                            '一致の場合
                            dblDiff = 0
                            dblRatio = 0
                        End If
                        If dblDiff = 0 Then
                            diffAry(i, j) = preAry2(i, j)
                        Else
                            diffAry(i, j) = dblDiff
                        End If

                        If dblRatio = 0 Then
                            ratioAry(i, j) = preAry2(i, j)
                        ElseIf strRatio = "ー" Then
                            ratioAry(i, j) = strRatio
                        Else
                            ratioAry(i, j) = dblRatio
                        End If
                        
                        If orgMemoAry(i, j) = "" Then
                            If diffMemo = "" Then
                                diffMemoAry(i, j) = ""
                            Else
                                diffMemoAry(i, j) = diffMemo
                            End If
                        Else
                            If diffMemo = "" Then
                                diffMemoAry(i, j) = ""
                            Else
                                diffMemoAry(i, j) = orgMemoAry(i, j) & vbCrLf & _
                                "'" & WorksheetFunction.Rept("=", 15) & vbCrLf & _
                                diffMemo
                            End If
                        End If

                    Next j
                Next i
            End With
            '【比較結果】シート
            With wsComp
                .Cells(12, 6 + addNo).Value = chkCnt
                .Cells(13, 6 + addNo).Value = misMCnt
                If misMCnt > 0 Then
                    .Cells(19, 3 + addNo).Resize(misCnt, 5) = _
                        WorksheetFunction.Transpose(compAry)
                End If
            End With
            With wsScd
                '記入されたコメント削除(なくてもエラーは出ない)
                .Cells.ClearComments
                'コメント記入
                For i = 1 To MaxRow
                    For j = 1 To MaxCol
                        If diffMemoAry(i, j) <> "" Then
                            .Cells(i, j).AddComment diffMemoAry(i, j)
                            .Cells(i, j).Comment.Shape.TextFrame.AutoSize = True
                        End If
                    Next j
                Next i
            End With
            If makeDiffSht Then
                With wsDiff
                    .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value = diffAry
                End With
                With wsRatio
                    .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value = ratioAry
                End With
            End If
            Erase fstAry
            Erase scdAry
            Erase compAry
            Erase diffAry
            Erase ratioAry
NextX:
'**↑比較 ↑ ****************************************************************************
        Next x
        'エラーを無視
        On Error Resume Next
        Application.GoTo Reference:=.Range("Al"), Scroll:=True
        
        With wsComp
            .Activate
            .Range("Q2") = Now
            Application.GoTo Reference:=.Range("Al"), Scroll:=True
        End With
        'エラー制御を戻す
        On Error GoTo 0
        ActiveWindow.WindowState = xlMaximized
        .Save
    End With

'↑↑↑ シート比較ここまで ↑↑↑
'----------------------------------------------------------------------------------------
    Twb.Activate
    With wsMain
        .Range("C11").Value = .Range("C11").Value & vbCrLf & "比較終了日時:" & Now
    End With
        
    '============================================
    nmlTmn = True
    'End If
CompSheets_Exit:
    'エラーを無視
    On Error Resume Next

    If nmlTmn Then
        MsgBox "比較処理完了♪"
        Windows(ThisWorkbook.Name).WindowState = xlMinimized
        ActiveWindow.WindowState = xlMaximized
    Else
        wsMain.Range("C12") = ""
        If errMsg = "" Then
            MsgBox "比較処理未完了", vbExclamation
        End If
    End If
    Call ReSetObject
    Call Updating
  'エラー制御を戻す
    On Error GoTo 0
    Exit Sub
    
CompSheets_Err:

    Bln_Err = True
    MsgBox "実行時エラー:" & Err.Nuer & "" & _
    Err.Description & vbCr & _
    "処理を終了します。", vbExclamation, ErrProsName
    Err.Clear       'エラー情報クリア
    GoTo CompSheets_Exit
    
InputCheck_Err:
    '入カチェックエラー時
    If errMsg <> "" Then
        MsgBox errMsg & vbCr & _
            "処理を終了します。", vbExclamation, "入力チェック_エラー "
        Err.Clear       'エラー情報クリア
        GoTo CompSheets_Exit
    End If
End Sub

コメント

タイトルとURLをコピーしました