ワークシートの比較ツール
Mainの【ワークシート比較ツール.xlsm】と、結果を書き込む【ワークシート比較結果雛形.xlsm】の
2つのブックを作成します。(Microsoft365 64bit環境推奨)
マクロコードの貼り付け
作成された雛形ファイルに標準モジュールを追加します。
- 【Alt】+【F11】キーを押下し、VBE画面を表示
- 【挿入】タブから【標準モジュール】を選択し、標準モジュールを作成
- 下記ボックス内をコピーし、標準モジュールに貼り付け
- モジュール名を【M01_Main】に変更
モジュール名:M01_Main
Option Explicit Private ErrProsName As String '================================================ ' ファイルを読み取りリンク更新なしで開く '================================================ Sub openFile() Dim FilePath As String Dim fName As String Dim bookName As String Dim IsOpen As Boolean Dim wb As Workbook Dim OpenBook As Workbook Dim i As Long On Error GoTo openFile_Err Call SetObject Call StopUpdating IsOpen = False '指定ファイルを開く With wsComp If Application.Caller = "開く1" Then FilePath = .Range("E8").Value fName = "比較ファイル①" ElseIf Application.Caller = "開く2" Then FilePath = Range("E10").Value fName = "比較ファイル② " End If If FilePath = "" Then MsgBox fName & "ファイルパスを確認して下さい。 " & vbCr & _ "処理を終了します。", vbExclamation GoTo openFile_Exit End If End With For Each wb In Workbooks If wb.Name = bookName Then IsOpen = True Exit For End If Next wb If IsOpen Then MsgBox fName & ": 同名ファイルを既に開いています。 " & vbCr & _ "処理を終了します。", vbExclamation GoTo openFile_Exit End If If IsBookOpened(FilePath) Then MsgBox fName & ": 他のPCで開かれていますが、" & vbCr & _ "読み取りで開きます。", vbExclamation End If '読み取り、リンク更新なしで開く Set OpenBook = Workbooks.Open(FilePath, ReadOnly:=True, UpdateLinks:=0) On Error Resume Next '開いたファイル With OpenBook For i = .Worksheets.Count To 1 Step -1 '最初に再計算が走らないように全シート設定 .Worksheets(i).EnableCalculation = False Next i End With 'エラー制御を戻す On Error GoTo 0 openFile_Exit: On Error Resume Next Call ReSetObject Call Updating Exit Sub openFile_Err: '【ESC】で止められた場合 If Err.Number = 18 Then If MsgBox("マクロを終了しますか?", vbYesNo) = vbNo Then DoEvents Resume End If 'その他のエラー Else MsgBox "実行時エラー:" & Err.Number & "" & _ Err.Description & vbCr & _ "処理を終了します。", vbExclamation End If Resume openFile_Exit: End Sub '================================================ ' 【保存して閉じる】ボタン押下で作動 ' 実行ファイル以外の開いているファイルに ' 対して実行 '================================================ Sub exeSaveClose() Dim i As Long Dim ii As Long Dim MaxRow As Long Dim buf As String Dim Cnt As Long Dim wb As Workbook Dim FilePath As String Dim fName As String Dim bookName As String Dim myWbName As String Dim strRng As String Dim myProcd As String ErrProsName = "exeSaveClose" On Error GoTo exeSaveClose_Err myProcd = "【保存して閉じる】" Application.StatusBar = "保存後ブックを閉じています。" Call SetObject Call StopUpdating '指定ファイルを開じる With wsComp If Application.Caller = "保存1" Then FilePath = .Range("E8").Value strRng = "L8" fName = "比較ファイル①" ElseIf Application.Caller = "保存2" Then FilePath = .Range("E10").Value strRng = "L10" fName = "比較ファイル②" End If End With FilePath = Replace(FilePath, " /", "\") bookName = Mid(FilePath, InStrRev(FilePath, "*") + 1) If IsBookOpened(FilePath) Then MsgBox fName & " : 他のPCで開かれていますので、" & vbCr & _ "処理を終了します。", vbExclamation GoTo exeSaveClose_Exit End If myWbName = ThisWorkbook.Name Call showStatus("更新して保存中") For Each wb In Workbooks '実行ファイル以外の開いているファイルの場合 If wb.Name = bookName Then 'エラーを無視 On Error Resume Next With wb '読み取り設定の場合 If .ReadOnly Then '編集可能な設定に変更 .ChangeFileAccess Mode:=xlReadWrite End If .Save .Close End With 'エラー制御を戻す On Error GoTo 0 End If Next wb ThisWorkbook.Activate With wsComp .Range(strRng).Value = FileDateTime(FilePath) End With DoEvents MsgBox "完了♪" exeSaveClose_Exit: 'エラーを無視 On Error Resume Next Call ReSetObject Call Updating 'エラー制御を戻す On Error GoTo 0 Exit Sub exeSaveClose_Err: '【ESC】で止められた場合 If Err.Number = 18 Then If MsgBox("マクロを終了しますか?", vbYesNo) = vbNo Then DoEvents Resume End If 'その他のエラー Else Bln_Err = True MsgBox "実行時エラー:" & Err.Nuer & "" & _ Err.Description & vbCr & _ "処理を終了します。", vbExclamation, ErrProsName End If Resume exeSaveClose_Exit: End Sub 'ファイルが開かれているかチェック 'filecheckは「フルパス」を設定 Public Function IsBookOpened(filecheck As String) As Boolean IsBookOpened = False If filecheck = "" Then IsBookOpened = False Else On Error Resume Next '保存済みのファイルか判定 Open filecheck For Append As #1 Close #1 If Err.Number > 0 Then '既に開かれている場合 IsBookOpened = True Else '開かれていない場合 IsBookOpened = False End If End If On Error GoTo 0 End Function
コメント