所以我试图创建一个宏来记录用户打开和关闭变量工作簿的用户名和日期时间,即打开和关闭的工作簿将会改变。
到目前为止,我的代码将记录工作簿打开时的上述信息: -
Option Explicit
Private iNextRow As Long
Const HIDDEN_SHEET As String = "Sheet3"
Private Sub Workbook_Open()
With Worksheets(HIDDEN_SHEET)
Range("A65536").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = 1
.Range("A65536").End(xlUp).Value = Environ("UserName")
Range("B65536").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = "01/01/2000 00:01"
.Range("B65536").End(xlUp).Value = Format(Date + Time, "dd mmm yyyy hh:mm:ss")
End With
iNextRow = 1
End Sub
任何人都可以帮助代码记录正在关闭的工作簿吗?
谢谢!
答案 0 :(得分:1)
在这种情况下,我更喜欢将数据保留在工作表之外,因为总有一个人会覆盖它的风险。相反,请尝试使用defined name
。
以下是一个在打开和关闭时捕获用户名和时间戳信息的示例:
Private Sub Workbook_Open()
StoreUserInfo "Open", Environ("UserName"), VBA.Now()
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
StoreUserInfo "Close", Environ("UserName"), VBA.Now()
End Sub
Function StoreUserInfo(eventType As String, userName As String, timeStamp As String)
If (eventType = "Open") Then
ThisWorkbook.Names.Add Name:="OpenUser", RefersTo:=userName, Visible:=False
ThisWorkbook.Names.Add Name:="OpenTime", RefersTo:=timeStamp, Visible:=False
Else
ThisWorkbook.Names.Add Name:="CloseUser", RefersTo:=userName, Visible:=False
ThisWorkbook.Names.Add Name:="CloseTime", RefersTo:=timeStamp, Visible:=False
End If
End Function
注意两件事:
.Add
函数会覆盖任何现有数据,因此您最终不会使用多个名称Visible:=False
表示用户无法通过在左上角的框中输入已定义的名称(例如OpenUser
)来查看工作表中的信息您可以非常轻松地检索信息:
Sub RetriveInformation()
Debug.Print ThisWorkbook.Names("OpenUser").RefersTo //prints username e.g. =JohnDoe
Debug.Print ThisWorkbook.Names("OpenTime").RefersTo //prints timestamp e.g. ="15/07/2014 15:10:48"
End Sub
答案 1 :(得分:0)
对于关闭事件,只需使用Workbook_BeforeClose()
事件,因为如果您想知道,则没有Workbook_Close
。
此外,您似乎很难将行数编码为65536.虽然您可以使用Excel 2003或更高版本,但Excel Excel及更高版本的工作簿可能还有更多。
由于您似乎将A列用于用户名,而B列用于日期,如果我是您,我将使用单个单元格,例如C1,记录条目的 next 可用行号,从1开始。因此,在将条目添加到“隐藏”表单之前,检查单元格C1中的数字并将其用作行索引用于用户名和日期条目。然后将其更新为C1为+1。这样,您始终可以使用下一个索引。如果出现任何问题,在添加条目之前,您可以检查以确保该行没有任何现有数据,或者您可能会覆盖它。