首页 > 解决方案 > 无法完全保护 Excel 工作表

问题描述

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

文本字段和下拉菜单

复选框

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

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 个文本框、复选框和组合框。执行代码时,调试时给我错误“找不到对象”

标签: excelvbaactivex

解决方案


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

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

就像是

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

推荐阅读