簡體   English   中英

用 vba 刪除一個活動的 x 組合框

[英]delete an active x combobox with vba

我有一個工作表,在選擇一個單元格時,在該行上創建一個 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

在網上,我只找到了刪除工作表中所有組合框的方法

我知道這篇文章已經有一段時間了; 另一方面,我想在其他人可能需要的情況下提供一些解決方法。

因此,由於可以在 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

實際例子

因此,第一步是轉到普通模塊並粘貼此腳本。 並在空白 Sheet 中使用它。 這將生成:1 個ComboBox 、1 個CommandButton並在右側打印 1 個文本 (但您可以增加“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中的每個對象以獲取我們對象的特定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”按鈕,這樣就可以刪除整行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM