【问题标题】:excel vba method workbook opened or closed true or falseexcel vba方法工作簿打开或关闭true或false
【发布时间】:2014-11-19 02:13:23
【问题描述】:

是否有与applicaton. 方法结合使用的方法或对象,当使用该方法时,无论工作簿是打开还是关闭,都会在日志中写入(在工作表的范围内)。

我没有创建两个子程序,一个用于打开的日志,一个用于关闭的日志,我希望将两个日志结合起来。

Option Explicit
Private Sub workbook_open()

Call Unprot
Sheets("log").Activate
Range("A1").Value = "Workbook Opened"
Range("B1").Value = "User"
Range("C1").Value = "LAN ID"
Range("D1").Value = "Computer"
Range("E1").Value = "Domain"
Range("F1").Value = "Count"
Rows("2:2").Insert
Range("F2").Value = Sheets("log").Range("F2").Value + 1
Range("A2").Value = Now
Range("B2") = Application.UserName
Range("C2") = Environ$("username")
Range("D2") = Environ$("computername")
Range("E2") = Environ$("USERDOMAIN")
    Cells.EntireColumn.AutoFit
Call Prot

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Call Unprot
Sheets("log").Activate
Range("H1").Value = "Workbook Closed"
Range("I1").Value = "User"
Range("J1").Value = "LAN ID"
Range("K1").Value = "Computer"
Range("L1").Value = "Domain"
Range("M1").Value = "Count"
Rows("2:2").Insert
Range("M2").Value = Sheets("log").Range("M2").Value + 1
Range("H2").Value = Now
Range("I2") = Application.UserName
Range("J2") = Environ$("username")
Range("K2") = Environ$("computername")
Range("L2") = Environ$("USERDOMAIN")
    Cells.EntireColumn.AutoFit
Call Prot
End Sub

附:我相信我可以将此代码压缩为 for 循环?

【问题讨论】:

  • 由于要记录打开和关闭的日期/时间,因此需要两个宏。
  • 啊,我没有看到列差异。但实际上我认为这并没有什么好处。由于打开/关闭将紧随其后,因此它们可以按顺序而不是并行写入以达到相同的效果。

标签: excel vba


【解决方案1】:

将用于写入日志的代码放在单独的子例程或函数中,并从两个事件中调用子/函数。使用变量来区分正在写入日志的操作:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    call writeToLog "Workbook Closed"
End sub

Private Sub workbook_open()
    call writeToLog "Workbook Opened"
end sub


sub writeToLog(strAction as string)
    Call Unprot
    Sheets("log").Activate
    Range("H1").Value = strAction
    Range("I1").Value = "User"
    Range("J1").Value = "LAN ID"
    Range("K1").Value = "Computer"
    Range("L1").Value = "Domain"
    Range("M1").Value = "Count"
    Rows("2:2").Insert
    Range("M2").Value = Sheets("log").Range("M2").Value + 1
    Range("H2").Value = Now
    Range("I2") = Application.UserName
    Range("J2") = Environ$("username")
    Range("K2") = Environ$("computername")
    Range("L2") = Environ$("USERDOMAIN")
    Cells.EntireColumn.AutoFit
    Call Prot
end sub

【讨论】:

    【解决方案2】:

    怎么样:

    Private Sub Workbook_Open()
    
      Call Unprot
      writeLog "Workbook Opened"
      Call Prot
    
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
      Call Unprot
      writeLog "Workbook Closed"
      Call Prot
    
    End Sub
    
    Sub writeLog(openClose as String)
    
      With Sheets("log")
        Rows("2:2").Insert
        Range("A2").Value = Now()
        Range("B2") = Application.UserName
        Range("C2") = Environ$("username")
        Range("D2") = Environ$("computername")
        Range("E2") = Environ$("USERDOMAIN")
        Range("F2")= Sheets("log").Range("F2").Value + 1
        Range("G2").Value = openClose
        Cells.EntireColumn.AutoFit
      End With
    
    End Sub
    

    我不会每次都写那个标题。手动写一次就行了,每次都用代码重写真的没有什么价值……除非你觉得人家会重写。

    注意:此代码未考虑页面空间何时用完。 Excel 2007 及更高版本仅限于超过一百万行,因此您有很多时间,但如果您运行的是 2003,则只有 64k+ 行,这可能会很快用完,具体取决于使用情况。

    --编辑--

    如果您不介意条目“堆叠”而不是并排,这将起作用。否则,您必须建立一个偏移量才能将数据向右移动,或者像 Gary 的学生在 cmets 中提到的那样拥有第二个子项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多