在excel VBA中,每当一个工作表被保护或未被保护时,都会有日志记录。

问题描述 投票:0回答:1

我正在寻找一种方法,在excel中写进另一个工作表,每次有人保护或取消保护我工作簿中的工作表。我希望它能记录它是否被保护或未被保护以及旁边的时间。谢谢!现在我有以下代码

现在,我有以下代码用于保护或取消保护工作表,并有一个更友好的按钮。

If ActiveWorkbook.Sheets("Calendar").ProtectContents = True Then
    ActiveSheet.Unprotect
    MsgBox "Sheet unprotected"
    Exit Sub
End If

ActiveSheet.Protect ("password")
MsgBox "Calendar has been protected"
excel vba logging protected
1个回答
0
投票

Excel VBA没有一个事件可以检测一个工作表是否被保护unprotected。

不要射杀信使。


0
投票

一个google就能让你落到这里。https:/www.ozgrid.comforumindex.php?thread43816-unprotect-worksheet-event,笔者甚至给你一个样本。https: /www.ozgrid.comforumcoreindex.php?attachment1082834-52719-xls

这并不是100%的万无一失,因为当用户取消protectunprotect对话框时,eventhandler无法判断。

这个工作簿

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    StartEventListiner False

End Sub

Private Sub Workbook_Open()

    StartEventListiner True

End Sub

模块

Option Explicit
Public g_clsEvnt As CProtectEvt

Public Sub StartEventListiner(Action As Boolean)

    If Action Then
        Set g_clsEvnt = New CProtectEvt
    Else
        Set g_clsEvnt = Nothing
    End If

End Sub

级别

Option Explicit

Public WithEvents cbbProtect As CommandBarButton

Private Sub m_ProtectControls(State As Boolean)

    Dim objX As OLEObject

    On Error Resume Next
    For Each objX In ActiveSheet.OLEObjects
        objX.Object.Enabled = State
    Next

End Sub

Private Sub cbbProtect_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)

    m_ProtectControls (InStr(1, Ctrl.Caption, "Un&protect", vbTextCompare) > 0)

End Sub

Private Sub Class_Initialize()

    On Error Resume Next

    ' hook into Tools > Protection > Protect Sheet event
    Set cbbProtect = Application.CommandBars.FindControl(msoControlButton, ID:=893)

End Sub

0
投票

切换和记录工作表保护

  • 该代码只在使用按钮时记录保护情况(该按钮有 toggleWorksheetProtection_Click 分配给它的)或当运行 toggleWorksheetProtection_ClickVBE.
  • 将完整的代码复制到一个标准的模块中(如 Module11).
  • 调整五个 常设蚂蚁。
  • ThisWorkbook 指的是包含该代码的工作簿。
  • 此外,调整日期格式,在 writeLogRow.

守则

Option Explicit

Sub toggleWorksheetProtection_Click()
    ' Constants
    Const srcName As String = "Calendar"
    Const tgtName As String = "Log"
    Const tgtCol As Variant = 1
    Const msgProtect As String = "Sheet protected."
    Const msgUnProtect As String = "Sheet unprotected."
    ' Workbook
    Dim wb As Workbook: Set wb = ThisWorkbook
    ' Other Variables
    Dim src As Worksheet: Set src = wb.Worksheets(srcName)
    Dim tgt As Worksheet: Set tgt = wb.Worksheets(tgtName)
    Dim msg As String
    ' Protection
    If src.ProtectContents Then
        src.Unprotect: msg = msgUnProtect
    Else
        src.Protect: msg = msgProtect
    End If
    ' Log
    Dim cel As Range
    Set cel = getEmptyCell(tgt, tgtCol)
    Call writeLogRow(cel, msg)

End Sub

Function getEmptyCell(Sheet As Worksheet, ByVal writeColumn As Variant)
    Dim cel As Range
    Set cel = Sheet.Columns(writeColumn).Find("*", , xlValues, , , xlPrevious)
    If Not cel Is Nothing Then
        Set cel = cel.Offset(1)
    Else
        Set cel = Sheet.Cells(1, writeColumn)
    End If
    Set getEmptyCell = cel
End Function

Sub writeLogRow(logRange As Range, ByVal logMessage As String)
    Dim logDate As Date: logDate = Now
    logRange.Value = logDate
    logRange.NumberFormat = "mm/dd/yyyy hh:mm:ss (ddd)"
    logRange.Offset(, 1).Value = logMessage
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.