专栏名称: 完美Excel
Excel与VBA技术学习与实践
目录
相关文章推荐
Excel之家ExcelHome  ·  DATEDIF,一个神奇的隐藏函数 ·  昨天  
完美Excel  ·  几段操作工作簿的VBA代码 ·  2 天前  
Excel之家ExcelHome  ·  筛选状态下算乘积,还不会的打屁屁 ·  3 天前  
Excel之家ExcelHome  ·  GROUPBY函数的几个典型应用 ·  4 天前  
Excel之家ExcelHome  ·  这几个动态数组函数,简单又高效 ·  2 天前  
51好读  ›  专栏  ›  完美Excel

VBA:追踪工作簿打开和关闭信息

完美Excel  · 公众号  · Excel  · 2025-01-26 06:00

正文

学习Excel技术,关注微信公众号:
excelperfect

标签:VBA工作簿事件

有时候,出于安全目的,可能希望跟踪工作簿何时打开和关闭以及由谁打开和关闭。可以使用ThisWorkbook模块中的一些事件过程来实现这种跟踪。

下面的代码创建了一个日志,记录了打开工作簿的用户名和计算机名、打开时间、打开时的工作簿名称、关闭时间以及关闭时的工作簿名称。这些信息保存在名为“跟踪”的工作表中,并被深度隐藏(xlVeryHidden)

这段代码来自cpearson.com,供有兴趣的朋友学习参考。

Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" ( _ ByVal lpBuffer As String, _ nSize As Long) As LongPrivate Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" ( _ ByVal lpBuffer As String, _ nSize As Long) As LongPrivate pAuditSheet As WorksheetPrivate Const USERNAME_COL = 1Private Const COMPUTERNAME_COL = 2Private Const OPEN_TIME_COL = 3Private Const CLOSE_TIME_COL = 4Private Const OPEN_WB_NAME_COL = 5Private Const CLOSE_WB_NAME_COL = 6'限制保存记录的条数Private Const KEEP_ONLY_LAST_N_ENTRIES = 10
Private Sub Workbook_Open() Dim WS As Worksheet Dim RowNum As Long Dim N As Long Dim S As String
Application.ScreenUpdating = False On Error Resume Next Err.Clear Set WS = Me.Worksheets("跟踪") If Err.Number = 9 Then Set WS = Me.Worksheets.Add(before:=1) WS.Name = "跟踪" End If On Error GoTo 0 With WS   If .Cells(1, USERNAME_COL).Value = vbNullString Then     .Cells(1, USERNAME_COL).Value = "用户名"     .Cells(1, COMPUTERNAME_COL).Value = "计算机名"     .Cells(1, OPEN_TIME_COL).Value = "开启时间"     .Cells(1, CLOSE_TIME_COL).Value = "关闭时间"     .Cells(1, OPEN_WB_NAME_COL).Value = "打开的工作簿名称"     .Cells(1, CLOSE_WB_NAME_COL).Value = "关闭的工作簿名称" End If .Visible = xlSheetVeryHidden   RowNum = .Cells(.Rows.Count, USERNAME_COL).End(xlUp)(2, 1).Row N = 255 S = String(N, vbNullChar) N = GetUserName(S, N)   .Cells(RowNum, USERNAME_COL).Value = TrimToNull(S) N = 255 S = String(N, vbNullChar) N = GetComputerName(S, N)   .Cells(RowNum, COMPUTERNAME_COL).Value = TrimToNull(S)   .Cells(RowNum, OPEN_TIME_COL).Value = Now ' 让关闭时间为空. 在关闭时输入.   .Cells(RowNum, CLOSE_TIME_COL).Value = vbNullString   .Cells(RowNum, OPEN_WB_NAME_COL).Value = ThisWorkbook.FullName ' 让关闭名称为空. 在关闭时输入.   .Cells(RowNum, CLOSE_WB_NAME_COL).Value = vbNullString .UsedRange.Columns.AutoFit End With Application.ScreenUpdating = TrueEnd Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim WS As Worksheet Dim RowNum As Long Dim EndRow As Long Dim LastDel As Long Dim FirstDel As Long
Application.ScreenUpdating = False Set WS = Worksheets("跟踪") With WS   RowNum = .Cells(.Rows.Count, CLOSE_TIME_COL).End(xlUp).Row + 1   .Cells(RowNum, CLOSE_TIME_COL).Value = Now   .Cells(RowNum, CLOSE_WB_NAME_COL).Value = ThisWorkbook.FullName .UsedRange.Columns.AutoFit If KEEP_ONLY_LAST_N_ENTRIES > 0 Then    EndRow = .Cells(.Rows.Count, USERNAME_COL).End(xlUp).Row If EndRow > 2 Then FirstDel = 2       LastDel = EndRow - KEEP_ONLY_LAST_N_ENTRIES If LastDel > 2 Then         .Cells(FirstDel, "A").Resize(LastDel - 1, 1).Select End If End If End If End With
Application.ScreenUpdating = TrueEnd Sub
' 返回字符串S中vbNullChar, Chr(0)左侧部分.Private Function TrimToNull(S As StringAs String Dim N As Long N = InStr(1, S, vbNullChar) If N = 0 Then TrimToNull = S Else TrimToNull = Left(S, N - 1) End IfEnd Function

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

推荐文章
Excel之家ExcelHome  ·  DATEDIF,一个神奇的隐藏函数
昨天
完美Excel  ·  几段操作工作簿的VBA代码
2 天前
Excel之家ExcelHome  ·  筛选状态下算乘积,还不会的打屁屁
3 天前
Excel之家ExcelHome  ·  GROUPBY函数的几个典型应用
4 天前
Excel之家ExcelHome  ·  这几个动态数组函数,简单又高效
2 天前
笑点研究所  ·  这个锁头需要极高的智商才能开启
8 年前
化妆师MK-雷韵祺  ·  衬衫的6种搭法,让你穿衬衫不再这么土!
7 年前
盖世汽车每日速递  ·  三星无人驾驶研究走出试验场 韩政府批准其路测
7 年前