问题描述
我正在尝试制作访问请求表格,请求者可以在其中选择所需的访问权限并通过电子邮件提交以供批准。在我的表单中,我在请求者可以在其中手动输入详细信息(例如其名称)的字段中使用了文本框(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个文本框,复选框和组合框。执行代码时,调试时会出现错误“找不到对象”
解决方法
为防止进入对象,您需要关闭其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