2014-11-18 2 views
0

Есть ли способ или, возможно, объект в сочетании с методом applicaton., который при использовании будет записывать в журнал (в диапазоне на листе), была ли рабочая книга открыта или закрыта ,excel vba метод рабочая книга открыта или закрыта true или false

Вместо того, чтобы делать две процедуры, один журнал для открытия и журнал для закрытия, я собираюсь объединить оба журнала.

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?

+0

Поскольку вы хотите записать ** дату/время ** для открытия и закрытия, вам нужны два макроса. –

+0

А я не видел различий в столбцах. Но на самом деле я не вижу в этом большой пользы. Так как открытые/закрытые будут на пятках друг друга, они могут быть записаны последовательно, а не параллельно одному и тому же эффекту. –

ответ

0

Поместите код для записи в журнал в отдельной подпрограмме или функции и вызовите функцию sub/из обоих событий. Используйте переменную для различения, какое действие записывается в журнал:

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 
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 + строки, которые могут быстро закончиться, в зависимости от использования.

--EDIT--

Если вы не против записи «суммируется до» вместо того, чтобы быть бок о бок, это будет работать. В противном случае вам нужно построить смещение, чтобы переместить данные вправо, или иметь второй подканал, как упоминает ученик Гэри в комментариях.

Смежные вопросы