office交流網(wǎng)--QQ交流群號(hào)及微信交流群

Access培訓(xùn)群:792054000         Excel免費(fèi)交流群群:686050929          Outlook交流群:221378704    

Word交流群:218156588             PPT交流群:324131555

微信交流群(請(qǐng)用微信掃碼)

        

使用Controls.Remove CStr(ctr.Name) 刪除動(dòng)態(tài)創(chuàng)建的控件提示出錯(cuò):不能在此上下文中使用此命令

2020-05-04 08:00:00
zstmtony
原創(chuàng)
3791

使用Controls.Remove CStr(ctr.Name) 刪除動(dòng)態(tài)創(chuàng)建的控件提示出錯(cuò):不能在此上下文中使用此命令

運(yùn)行到此即出錯(cuò)、提示: '運(yùn)行時(shí)錯(cuò)誤 '444': 無(wú)法刪除控件 。不能在此上下文中使用此命令。


先看看微軟官方對(duì)Controls.Remove的幫助


Remove 方法                        

從集合中刪除一個(gè)成員,或者從框架、頁(yè)面或窗體中刪除一個(gè)控件。

語(yǔ)法

object.Remove( collectionindex)

Remove 方法的語(yǔ)法有以下幾個(gè)成分:

成分 說(shuō)明 
object 必需。一個(gè)有效對(duì)象。 
collectionindex 必需。成員在集合內(nèi)的位置或索引??梢允菙?shù)字,也可是字符串。如果該值是數(shù)字,則最小值為零,最大值比集合中的成員數(shù)少一。若該值為字符串,則必須對(duì)應(yīng)有效的成員名。 

說(shuō)明

此方法只刪除在運(yùn)行時(shí)間添加的控件。但如果想刪除在設(shè)計(jì)時(shí)間添加的控件,則會(huì)出錯(cuò)。



VBA動(dòng)態(tài)創(chuàng)建控件使用的是以下的代碼


    Dim ctrLable As Control
    Dim ctrTextBox As Control
    Dim ctrComboBox As Control
    Dim i As Integer
    With Me
        For i = 1 To 10
            '添加標(biāo)簽控件
            Set ctrLable = .Controls.Add("Forms.Label.1", "lblAuto" & i, True)
            With ctrLable
                .Caption = "第" & i & "個(gè)標(biāo)簽"
                .Left = 10
                .Top = 35 + (i - 1) * 35
                .Tag = "AutoControl"
                .Visible = True
                'Debug.Print .Name
            End With
            '添加文本框控件
            Set ctrTextBox = .Controls.Add("Forms.TextBox.1", "txtAuto" & i, True)
            With ctrTextBox
                .Left = 10 + 50
                .Top = 35 + (i - 1) * 35
                .Width = 70
                .Height = 20
                .Tag = "AutoControl"
                'Debug.Print .Name
            End With
            '添加組合框件
            Set ctrComboBox = .Controls.Add("Forms.ComboBox.1", "cboAuto" & i, True)
            With ctrComboBox
                .Left = 10 + 50 + 70
                .Top = 35 + (i - 1) * 35
                .Width = 70
                .Height = 20
                .Tag = "AutoControl"
                '.Visible = false
                .RowSource = "系統(tǒng)_庫(kù)位列表"
                'Debug.Print .Name
            End With
            
        Next i
        
    End With

    Me.cmdRemoveControl.SetFocus
    Me.cmdCreateControl.Enabled = False


而刪除控件使用的是這樣的代碼


 Dim ctr As Control
 For Each ctr In frmWuLiaoXinXi.Controls
 
    If ctr.Tag & "" = "AutoControl" Then
        Me.Controls.Remove CStr(ctr.Name)  'If Not (TypeOf ctr Is MSForms.TextBox) Then
    End If
 Next



但提示出錯(cuò):不能在此上下文中使用此命令。


后經(jīng)過(guò)不斷嘗試調(diào)試,發(fā)現(xiàn)原來(lái)是VBA的一個(gè)Bug, 即如果是使用 Me.Controls.Add("Forms.TextBox.1", "txtAuto" & i, True) 這種方式 在運(yùn)行狀態(tài)動(dòng)態(tài)創(chuàng)建的控件,不會(huì)去判斷與已有控件是否重名。

原來(lái)是因?yàn)橹孛脑?,自?dòng)創(chuàng)建的控件,即使與原設(shè)計(jì)時(shí)加的控件重名,系統(tǒng)也不會(huì)報(bào)錯(cuò)。
現(xiàn)修改將我代碼創(chuàng)建的控件使用特殊的前綴后完美解決了


另注意 Me.Controls.Remove 只能刪除代碼在運(yùn)行狀態(tài)動(dòng)態(tài)創(chuàng)建的控件,而不能刪除在設(shè)計(jì)狀態(tài)添加的控件


相關(guān)知識(shí)


下面程序是在EXCEL-VBA運(yùn)行
Sub adf()

  Dim Ctl As Control

  For Each Ctl In Formtest.Controls

    Debug.Print Ctl.Name, TypeName(Ctl)

    Formtest.Controls.Remove Ctl

  Next

End Sub
 
上面程序是參考編寫的

cc = UserForm1.Controls.Count

For TC = 1 To cc - 1

If TypeName(UserForm1.Controls.Item(TC)) = "Image" Then

IC = IC + 1

End If

Next

If IC >= 1 Then

For DC = 1 To IC

UserForm1.Controls.Remove "image" & DC + 1

Next

End If

在網(wǎng)上又找了一段程序。目標(biāo)實(shí)現(xiàn)

Sub RemoveBtn()

    Dim ctl As MSForms.Control

    Set vbc = ThisWorkbook.VBProject.VBComponents("UserForm1")

    For Each ctl In vbc.Designer.Controls

        vbc.Designer.Controls.Remove ctl.Name

    Next ctl

End Sub
要注意:Designer.Controls.Remove ctl.Name
運(yùn)行不成功,有兩個(gè)注意事項(xiàng):
1是確保VBE當(dāng)前模式是設(shè)計(jì)模式。
2如果仍報(bào)錯(cuò),使用CStr函數(shù),強(qiáng)制返回控件名字符串,(今天剛剛摸索出來(lái)的技巧,原理暫時(shí)不知道)
Designer.Controls.Remove CStr(ctl.Name)

分享
文章分類
聯(lián)系我們
聯(lián)系人: 王先生
Email: 18449932@qq.com
QQ: 18449932
微博: officecn01
移動(dòng)訪問(wèn)