【问题标题】:Log every time a sheet is protected or unprotected in excel VBA每次工作表在 excel VBA 中受保护或不受保护时记录
【发布时间】:2020-10-07 22:47:56
【问题描述】:

每次有人保护或取消保护我的工作簿中的工作表时,我都在寻找一种在 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】:

Excel VBA 没有可以检测工作表是否受到保护/不受保护的事件。

不要向信使开枪。

【讨论】:

  • 我有自己的自定义按钮用于保护或取消保护工作表,因此我可以将它作为一个函数添加到那里,它可以检测它是受保护还是不受保护。我只需要一个我想在一张纸上记录时间的功能。
  • 那么这很简单。但是您将无法阻止用户使用功能区命令取消保护/保护,这不会触发您的代码。
  • 这对我来说没问题,并不理想,但就是这样
  • 那么,您的问题得到解答了吗?或者您是在问如何将时间戳写入单元格?这已经被问和回答了 1000 次了
  • 我正在寻找一种方法来写入不同的工作表,在最新的空单元格中,时间戳和旁边的消息。
【解决方案2】:

谷歌会在这里找到你:https://www.ozgrid.com/forum/index.php?thread/43816-unprotect-worksheet-event/,作者甚至给你一个示例: https://www.ozgrid.com/forum/core/index.php?attachment/1082834-52719-xls/

这不是 100% 万无一失的,因为事件处理程序无法判断用户何时取消保护/取消保护对话框。

本工作簿

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

【讨论】:

    【解决方案3】:

    切换和记录工作表保护

    • 代码仅在使用按钮(分配有toggleWorksheetProtection_Click)或从VBE 运行toggleWorksheetProtection_Click 时记录保护。
    • 将完整代码复制到标准模块中(例如Module11)。
    • 调整五个 constant 的值。
    • 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)
        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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2012-09-04
      相关资源
      最近更新 更多