【问题标题】:delete an active x combobox with vba使用 vba 删除活动的 x 组合框
【发布时间】:2019-07-30 09:18:39
【问题描述】:

我有一张表格,在其中选择一个单元格时,在该行上创建一个 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

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

【问题讨论】:

  • 我猜那个组合框有一个名字。你可以用它来删除它吗?
  • 我没有指定任何名称,因为它们应该以不确定的数字动态添加。我希望从行号开始的解决方案,但我没有像在工作表中那样引用行中的组合框
  • 如果您不跟踪组合框,我相信您需要遍历所有组合框并查看它们的位置。听起来效率不高
  • 您可以在添加组合框时重命名它们。以后会更容易删除。
  • 名称附加到OLEObject,而不是ComboBox。试试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).Name = cfgRows + 1。

标签: excel vba combobox activex


【解决方案1】:

我知道这篇文章发表已经有一段时间了;另一方面,我想提供一些解决方法以防其他人可能需要它。

因此,由于可以在 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 以获取我们对象的特定 TypeName(它们是:ComboBox 和 CommandButton)将检查对象本身的名称并将其与:“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”按钮,这样就可以删除整行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多