Skip to content

Instantly share code, notes, and snippets.

@KotorinChunChun
Created February 24, 2022 15:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KotorinChunChun/a2cca705e70c7ca0ca9f17f8924a5153 to your computer and use it in GitHub Desktop.
Save KotorinChunChun/a2cca705e70c7ca0ca9f17f8924a5153 to your computer and use it in GitHub Desktop.
Excelブックが読み取り専用の時に現在開いているユーザーを特定する関数
Option Explicit
Private fso As New FileSystemObject
Sub Test_GetLockUserName()
Dim PathName As String
PathName = "ここに試したいファイルのフルパスをかく"
Debug.Print GetLockUserName(PathName)
End Sub
Rem 開こうとしているOfficeファイルのフルパス
Rem @return 使用中のユーザー名 or 空欄(未使用か不明)
Function GetLockUserName(ssFullPath As String, Optional ss不明な時の使用者名 As String) As String
Rem ファイル名を解析しロックファイル名生成
Dim arrSS() As String
arrSS = Split(ssFullPath, "\")
arrSS(UBound(arrSS)) = "~$" & arrSS(UBound(arrSS))
Rem ロックファイル検出 無い場合離脱
Dim PathName As String
PathName = Join(arrSS, "\")
If Not fso.FileExists(PathName) Then Exit Function
Rem PCの一時フォルダへコピー できない場合離脱
Dim LockName: LockName = fso.GetSpecialFolder(2) & "\ExcelLockFile"
On Error Resume Next
fso.CopyFile PathName, LockName
If Err Then Exit Function
On Error GoTo 0
Rem テキストファイルとして読み込み
On Error Resume Next
Dim txt As String
Dim ts As TextStream
Set ts = fso.OpenTextFile(LockName, ForReading, False)
txt = ts.ReadAll()
ts.Close
On Error GoTo 0
Rem ユーザー名部分を抽出
On Error Resume Next
txt = Mid(txt, 2)
txt = Left(txt, InStr(txt, " ") - 1)
On Error GoTo 0
GetLockUserName = txt
End Function
@KotorinChunChun
Copy link
Author

KotorinChunChun commented Feb 24, 2022

このVBAで実現しようとしていること(Excelが自動でやってくれていること)
image

問題点
・Workbook.Openした場合は、この警告が表示されない。
・この使用者名がWorkbookオブジェクトから簡単に取得できない?

解説ツイート
https://twitter.com/KotorinChunChun/status/1496864748616355840?s=20&t=hgcsAKgk_sgR1dVDbOQUCQ

このプログラムでやっているようなことを、手動で行った場合の例と概念
image

@KotorinChunChun
Copy link
Author

KotorinChunChun commented Feb 24, 2022

パソコン単体で検証するときは、Altを押したままExcelを起動して、異なるインスタンスでエクセルを立ち上げると良い。
(Win → excel → Alt+Enter → メッセージボックスが出るまでAltから手を離さない)
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment