使用vba删除活动的x组合框

时间:2019-07-30 09:18:39

标签: excel vba combobox activex

我有一张工作表,在其中选择一个单元格,在该行上创建一个Activex组合框和一个删除按钮。

当用户按下删除按钮时,应该删除整行。

Rows(ActiveSheet.Shapes(Application.Caller).TopLeftCell.row).Delete

它可以有效删除ActiveX组合框以外的所有内容。 如何将其删除?

代码:

Dim cb as ComboBox
Set cb = ActiveSheet.OLEObjects.add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=Cells(cfgRows+1,1).Left, Top:=Cells(cfgRows+1,1)).Top, Width:=Cells(cfgRows+1,1).width, Height:=Cells(cfgRows+1,1).height).Object

cb.Name = cfgRows + 1

在网络上,我仅找到删除工作表中所有组合框的方法

1 个答案:

答案 0 :(得分:0)

我知道这篇文章已经有一段时间了;另一方面,我想在其他人可能需要的情况下提供一些解决方法。

因此,由于可以在 OLEObjects 中找到 ComboBox,因此您可以通过创建时给它的名称找到它。

示例:如果您有“ComboBox99”名称,在字符串变量中,您可以使用:

Dim combo As Object

For Each combo In ActiveSheet.OLEObjects
    If TypeName(combo.Object) = "ComboBox" Then
        If combo.name = "ComboBox99" Then combo.delete
    End If
Next

实际例子

因此,第一步是转到普通模块并粘贴此脚本。并在空白表中使用它。这将生成:1 ComboBox、1 CommandButton 并在右侧打印 1 Text。 (但您可以增加 'for' 的 i 值,以防您想进行更多测试)

Sub CreateComboAndButton()

Dim combo As OLEObject, button As OLEObject
Dim c, a, t

With ActiveSheet
    .rows.RowHeight = 20

    'Augment 'i' to create more than one.
    For i = 1 To 1
    
    
        Set c = .Cells(i, 1):
            a = c.row
    
            
        Set combo = .OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
            Left:=c.Left, _
            top:=c.top, _
            width:=c.width, _
            height:=c.height _
        )
        
        
        Set button = .OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
            Left:=c.width + 2, _
            top:=c.top, _
            width:=15, _
            height:=c.height _
        )
        
        .Cells(i, 3) = "SomeTextInRow" & c.row  '//Add some text
        
        combo.name = "ComboBox_" & a
        button.name = "CommandButton_" & a: button.Object.fontSize = 7: button.Object.Caption = "X"
        Debug.Print (combo.name & " || " & button.name)
        
    Next
End With



End Sub

触发事件

最后,将下一个脚本粘贴到工作表本身,而不是模块中。

此脚本将首先迭代 OLEObjects 中的每个 Objects 以获取我们对象(即:ComboBox 和 CommandButton)的特定 TypeName将检查对象本身的名称并将其与:“ComboBox_1”(这是我们之前创建的组合的名称)进行比较,然后将其删除。它在第二个 'for' 中执行相同的操作,删除我们命名的 CommandButton 的名称:“CommandButton_1”。

提示: 使用 CommandButton 属性给定的行索引删除该行,因此我们始终可以删除对象所在的行,即使用户之前已经删除了一些行。

Private Sub CommandButton_1_Click()

Dim combo As Object, button As Object
On Error GoTo nameChanged:
Application.DisplayAlerts = False

    myCombo = "ComboBox_1"
    myButton = "CommandButton_1"


    For Each combo In ActiveSheet.OLEObjects
        If TypeName(combo.Object) = "ComboBox" Then
            If combo.Name = myCombo Then combo.Delete
        End If
    Next


    For Each Button In ActiveSheet.OLEObjects
        Debug.Print (TypeName(Button.Object))
        If TypeName(Button.Object) = "CommandButton" Then
            If Button.Name = myButton Then
                r = Button.TopLeftCell.Row
                Button.Delete
            End If
        End If
    Next

    
    ActiveSheet.Rows(r).Delete



nameChanged:
Resume Next


End Sub

简要说明

因此,要使此脚本起作用,请单击“X”按钮,以便可以删除整行。