无法完全保护Excel工作表

问题描述

我正在尝试制作访问请求表格,请求者可以在其中选择所需的访问权限并通过电子邮件提交以供批准。在我的表单中,我在请求者可以在其中手动输入详细信息(例如其名称)的字段中使用了文本框(ActiveX控件)。对于某些字段,例如它们所属的部门,我使用了组合框(ActiveX控件)作为下拉列表,并使用复选框(ActiveX控件)来选择他们要求的访问/权限。

Text Fields and Dropdown

check boxes

一旦他们输入了所有详细信息,然后单击“发送”按钮,则所有字段都将被锁定,并且不再可能进行任何编辑。我添加了下面的宏来保护工作表,一旦单击,它就显示为受保护的,但是我仍然能够在文本框,复选框和下拉菜单中进行更改。

Dim ws As Worksheet

For Each ws In Worksheets
    ws.Protect Password:="P@ssw0rd",UserInterfaceOnly:=True
Next ws

我尝试过

Sub disableBxs() 
    TADeptCombBx1.Enabled = False 
    TADeptCombBx2.Enabled = False 
    CheckBox1.Enabled = False 
    CheckBox10.Enabled = False 
    FirstNameTxtBx.Enabled = False 
    MiddleNameTxtBx.Enabled = False 
    FirstNameTxtBx.Enabled = False 
    MiddleNameTxtBx.Enabled = False 
    FirstNameTxtBx.Enabled = False 
    MiddleNameTxtBx.Enabled = False 
End Sub

我在工作表中总共有170个文本框,复选框和组合框。执行代码时,调试时会出现错误“找不到对象”

解决方法

为防止进入对象,您需要关闭其Enabled属性。

要访问放置在工作表上的ActiveX对象,您需要使用工作表OLEObjects集合。

类似

Sub ProtectAndDisableControls()
    Dim ws As Worksheet
    Dim ctrl As Object
    
    ' to exclude by control Name
    For Each ws In Worksheets
        For Each ctrl In ws.OLEObjects
            If Not LCase$(ctrl.Name) Like "approve*" _
              And Not LCase$(ctrl.Name) Like "reject*" Then
                ctrl.Enabled = False
            End If
        Next ctrl
    Next ws

    ' optional,to exclude specific control type(s)
'    For Each ws In Worksheets
'        For Each ctrl In ws.OLEObjects
'            If Not TypeOf ctrl.Object Is MSForms.CommandButton Then
'                ctrl.Enabled = False
'            End If
'        Next ctrl
'    Next ws
        
End Sub