ブックを開きたい人が現れたら通知する Excel マクロ

共有ブックを編集モードで開きっぱなしにする人と仕事してた時にこれ埋め込んでた。全く改善する気配なかったけど。

' 通知ファイル名のフルパス (ThisWorkbook の notifyFile と同じ値を保持する)
Dim notifyFilePath As String

' 通知をしたか・通知を出したら True にする
Dim notified As Boolean

' 監視プロシージャの呼び出し
Sub audit(notifyFile As String)
  ' ThisWorkbook から引数で受け取った通知ファイル名をセットし直す (変数のスコープが異なるため)
  notifyFilePath = notifyFile
  
  ' 通知をしたか管理する変数の初期化
  notified = False
  
  ' 監視プロシージャを呼び出す
  Call intervalAction
End Sub

' 監視プロシージャ
Sub intervalAction()
  ' 既に通知済なら中止する
  If notified = True Then
    Exit Sub
  End If
  
  ' 通知ファイルを取得する
  If Dir(notifyFilePath) <> "" And notified <> True Then
    ' ファイル名が返却され、通知が未済なら通知を行う
    MsgBox "ブックを閉じて欲しい人が現れました!編集が完了したら速やかにブックを閉じてください。"
    
    ' 通知済にする
    notified = True
  Else
    ' 通知ファイルがないようであれば5秒後に再実行する
    Application.OnTime Now + TimeValue("00:00:05"), "intervalAction"
  End If
End Sub
' 通知ファイル名のフルパスを保持する
Dim notifyFile As String

' ブックを開いた時に実行する
Sub Workbook_Open()
  ' 通知ファイル名の生成
  notifyFile = ThisWorkbook.FullName & "_.notify"
  
  If ThisWorkbook.ReadOnly = True Then
    ' 読み取り専用で開いた場合、ファイルを開いている人に通知を投げるか確認する
    Dim prompt As Integer
    prompt = MsgBox("ファイルを開いている人に通知を送信しますか?", vbYesNo + vbQuestion)
    
    If prompt = vbYes Then
      ' 通知ファイルを生成する
      CreateObject("Scripting.FileSystemObject").CreateTextFile notifyFile
      MsgBox "通知を送信しました。"
    End If
  Else
    ' 編集モードで開いた場合、通知ファイルがあるか定期的に監視して、通知ファイルができたらアラートを出す
    audit notifyFile
  End If
End Sub

' ブックを閉じる時に実行する
Sub Workbook_BeforeClose(Cancel As Boolean)
  ' 編集モードだった人がファイルを閉じる時は、通知ファイルを削除する
  If ThisWorkBook.ReadOnly = False Then
    On Error Resume Next
    Kill notifyFile
    On Error GoTo 0
  End If
End Sub

このマクロをワークブックと標準モジュールにそれぞれ貼り付けておく。

そのブックを読み取り専用で開くと、ブックと同じフォルダに通知ファイル (空ファイル) を作成する。

編集モードで開いてる人は定期的に通知ファイルが存在していないか裏で監視しているので、通知ファイルが見付かったら「同じブックを開きたい人がいるよ!」と通知を出す、という仕組み。

標準の機能だと、開きたい側が静かに待つだけで、編集中の人を急かしたりできないので、こんな仕組みを考えてみた。

今の職場ではちゃんと Git で一元管理しているので、社内共有ドライブの同じファイルを複数人で更新する、なんて機会がなく、このマクロの出番はない。

もし使いどころがあれば…。