[英]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.