excel vba方法工作簿打开或关闭true或false

时间:2014-11-18 17:44:09

标签: excel excel-vba vba

是否有一个方法或一个对象与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

P.S。我相信我可以将这段代码压缩成for循环吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

怎么样:

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的学生提到的第二个子数据。