在日常工作中,尽管 Microsoft 已不再推荐使用“共享工作簿(Shared Workbook)”功能,但工作中,由于协作方式的限制,旧版共享工作簿功能依然广泛存在。
在使用共享工作簿进行多人同时编辑时,我们常常会遇到这样的需求:
👀“现在到底有哪些人在同时编辑这个文件?”
这个问题可以通过 Excel VBA 的一个隐藏功能——Workbook.UserStatus
来轻松解决。本文将通过一个完整的 VBA 实例,教你如何快速获取共享工作簿中的在线用户列表,并将其写入工作表中进行记录。
我们编写了一个实用的 VBA 宏,命名为:
Sub WriteSharedUsersToSheet_showMessage()
功能亮点包括:
Sub WriteSharedUsersToSheet_showMessage()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Set ws = wb.Sheets(1)
Dim userArray As Variant
Dim i As Long, rowStart As Long
Dim userCount As Long
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' 清除旧数据
ws.Range("D5:E24").ClearContents
ws.Range("D3").ClearContents
' 检查是否为共享工作簿
If Not wb.MultiUserEditing Then
MsgBox "该工作簿未启用共享编辑功能。", vbExclamation
GoTo CleanUp
End If
' 获取用户状态
userArray = wb.UserStatus
rowStart = 5
For i = LBound(userArray, 1) To UBound(userArray, 1)
ws.Cells(rowStart, 4).Value = userArray(i, 1) ' 用户名
ws.Cells(rowStart, 5).Value = Format(userArray(i, 2), "yyyy/m/d hh:mm") ' 打开时间
rowStart = rowStart + 1
Next i
userCount = UBound(userArray, 1) - LBound(userArray, 1) + 1
ws.Cells(3, 4).Value = userCount ' D3 显示用户数
MsgBox "当前在线用户,共 " & userCount & " 人。", vbInformation
CleanUp:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
End Sub
📘深入解读:Workbook.UserStatus 的结构与用法
当共享工作簿启用后,VBA 提供的 Workbook.UserStatus
属性可以让你获取当前所有在线用户的信息。它返回的是一个 二维数组(Variant 类型),每一行代表一个用户,每一列提供如下信息:
数组下标 | 含义 | 类型 | 说明 |
---|---|---|---|
(i, 1) | 用户名(User Name) | String | 当前正在使用此共享工作簿的用户名称 |
(i, 2) | 打开时间(Access Time) | Date | 用户打开该工作簿的日期与时间 |
(i, 3) | 清单类型(Edit Type) | Integer | 1 = 独占 (Exclusive),2 = 共享 (Shared) |
UserStatus
只读,不能用于控制其他用户行为; 虽然“共享工作簿”功能正在逐步淡出,但在现实中,它仍是某些企业和团队协作的重要工具。通过 VBA 的 Workbook.UserStatus
,我们可以清晰了解当前正在协作的用户,提升文件协同的透明度和管理效率。