1

我需要从 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

谢谢大家

4

1 回答 1

2

也许我没有得到你的确切目标,但下面的内容至少可以帮助你入门

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”用户表单。如果是这种情况,您必须先卸载它(仅隐藏它不起作用)然后对其采取行动并最终加载它。或者可能是您必须在删除控制一个或两者的混合之前运行删除逻辑子......然后由于所有这些操作的实际时间(卸载表单,处理它和它的控制/逻辑)让它们不恰当地(尽管是非自愿地)干扰。

为了摆脱那些(可能还有其他!)可能的副作用,一个简单的解决方案可以简单地隐藏不需要的用户窗体控件,并且您可以在代码中正确地在显示它之前加载用户窗体。或者,如果您“必须”以编程方式执行操作,则可以添加那些“隐藏”代码行处理(而不是删除)逻辑

于 2016-02-14T10:24:48.910 回答