我需要从75个Excel用户表单中删除一些控件。我让VBA代码循环遍历文件,并使用VBIDE删除了代码。但是,一直无法获得控件的句柄。
以下是我一直在使用的对象,而不是浪费时间在我尝试过的代码上:
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim CompItem As Object
Dim objVBFrm As UserForm
Set VBProj = ActiveWorkbook.VBProject
Set VBComp = VBProj.VBComponents("frmSend")
Set CodeMod = VBComp.CodeModule
Set objVBFrm = VBComp.Designer
With objVBFrm
.Controls.Remove chkNewCNV
End With感谢所有人
发布于 2016-02-14 18:24:49
也许我没有达到你的确切目标,但下面的内容至少应该能帮助你入门
Sub RemoveControlsFromUserForm()
Dim VBP As VBIDE.VBProject
Dim VBC As VBIDE.VBComponent
Dim cntrls As Controls
Dim cntrl As Control
Set VBP = ActiveWorkbook.VBProject
For Each VBC In VBP.VBComponents
With VBC
If .Type = vbext_ct_MSForm And .Name = "UserForm1" Then
Set cntrls = .Designer.Controls
For Each cntrl In cntrls
If TypeName(cntrl) = "CheckBox" Then
If cntrl.Name = "chkNewCNV" Then cntrls.Remove cntrl.Name
End If
Next cntrl
End If
End With
Next VBC
End Sub只需根据需要更改组件类型(vbext_ct_MSForm)和名称("UserForm1")以及控件("CheckBox“、"chkNewCNV")即可
至于“无效的前向引用”错误,可能是在您试图更改(删除)其控件时加载了"frmSend“用户表单。如果是这样的话,你必须先卸载它(只是隐藏它不起作用),然后对它采取行动,最后加载它。或者,您必须在删除控件之前运行删除逻辑子模块,或者是其中一个或两个的混合...然后,由于所有这些操作(卸载表单、处理表单及其控制/逻辑)的实际计时,它们不适当地(尽管是不由自主地)干扰,因此仍然可能存在一些问题。
为了摆脱这些(也可能是其他的!)可能的副作用一个简单的解决方案可以简单地隐藏不需要的用户表单控件,并且在显示之前加载用户表单的代码中可以做到这一点。或者,如果您“必须”以编程方式执行操作,则可以添加处理(而不是删除)逻辑的“隐藏”代码行
https://stackoverflow.com/questions/35388423
复制相似问题