删除项目 "Object required" excel VBA

Delete item "Object required" excel VBA


我知道问题是什么,但我不知道如何解决它...... 所以我正在做的是我在我的工作sheet("costing")中点击一个按钮(addSceneButton),它将插入另一个sheet("Scene Template") 就在按钮 (addSceneButton) 的上方。它还将在先前插入的 sheet 的最右侧创建一个按钮 (deleteSceneButton)。
单击此按钮 (deleteSceneButton) 时,必须删除其旁边的区域。 如果我只添加 1 个场景,它就可以正常工作。但是当我添加多于一个然后点击 deleteButton 时,它会自动删除最后插入的 sheet。
当我想删除第二个时,它给了我 "Object Required" 错误。
一定是因为我覆盖了 delteButtonPos 而不是动态创建,但我不知道如何创建。
有人可以帮我解决这个问题吗?

这是我的代码

Public buttonPos As Range
Public deleteButtonPos As Range
Public deleteButton As Object

Private Sub AddSceneButton_Click()

    Set buttonPos = Sheets(AddSceneButton.Parent.Name).Cells(AddSceneButton.TopLeftCell.Row - 1, _
                                             AddSceneButton.TopLeftCell.Column)
    Sheets("Scene Template").Activate
    Sheets("Scene Template").Select
    Sheets("Scene Template").Range("A1:H22").Select
    Selection.Copy
    Sheets("Costing").Select
    buttonPos.Select
    Selection.Insert Shift:=xlDown

    'Insert the Add Scene Button


    'Insert the Delete Button
    Set deleteButtonPos = Selection.Range("H1")
    Set deleteButton = ActiveSheet.Buttons.Add(deleteButtonPos.Left, _
                                               deleteButtonPos.Top, _
                                               deleteButtonPos.Width, _
                                               deleteButtonPos.Height)
    With deleteButton
        .Caption = "Delete Button"
        .Name = "deleteButtonFunct"
        .OnAction = "Sheet1.deleteButtonFunct_Click"
    End With
End Sub

Private Sub deleteButtonFunct_Click()
    deleteButtonPos.Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.EntireRow.Delete
    buttonPos.Select
End Sub

范围变量 buttonPosdeleteButtonPos 似乎只包含一个单元格引用。添加第二个场景时,您需要使用 Application.Union() 方法将另一个单元格添加到范围中。您需要一些方法将场景关联到相应的删除按钮。

如果您将以下代码添加到一个新模块中,它会显示您可以如何独特地处理所有动态按钮。

我的示例使用数字(计数)来跟踪和索引新按钮,它可以相当简单地修改为单元格引用(在您的示例中要删除的范围)。

Public Count As Integer ' Used to index the controls in my example

Sub addButton()
Dim P As Range: Set P = Selection
Dim B As Object
Dim S As String: S = CStr(Count) ' string representation of count

Set B = ActiveSheet.Buttons.Add(P.Left, P.Top, P.Width, P.Height)

With B
    .Caption = "Id#" & S
    .Name = "Id" & S
    .onAction = "'onAction " & Chr(34) & S & Chr(34) & "'"
End With

Count = Count + 1 ' Increase the counter

End Sub

Public Sub onAction(ByVal Index As String)
MsgBox "You Pressed Button #" & Index & "!", vbOKOnly, "Action"
End Sub

您的代码抛出所需对象的原因是因为它找不到按钮。所以为了更正我们需要在第一次删除后再次设置按钮。

这里我又添加了 3 个变量作为 public introw, selnum, colnum

AddSceneButton 子部分没有变化。

我添加了一个额外的 Check 函数来再次设置按钮并正确设置行号和列号。

检查函数在 deleteButtonFunct 子函数中调用,因此每次单击删除按钮时,它都会删除复制的 current/latest 行 到 sheet 并将新的删除按钮设置到最后一列。

而如果Row number is 1,则不需要设置额外的按钮,因此检查功能中的条件。

我已经修改了你的代码。请查找更新后的代码。

Public buttonPos As Range
Public deleteButtonPos As Range
Public deleteButton As Object
Public introw, selnum, colnum As Integer


Private Sub AddSceneButton_Click()

    Set buttonPos = Sheets(AddSceneButton.Parent.Name).Cells(AddSceneButton.TopLeftCell.Row - 1, _
                                             AddSceneButton.TopLeftCell.Column)
    Sheets("Scene Template").Activate
    Sheets("Scene Template").Select
    Sheets("Scene Template").Range("A1:H22").Select
    Selection.Copy
    Sheets("Costing").Select
    buttonPos.Select
    Selection.Insert Shift:=xlDown

    'Insert the Add Scene Button


    'Insert the Delete Button
    Set deleteButtonPos = Selection.Range("H1")
    Set deleteButton = ActiveSheet.Buttons.Add(deleteButtonPos.Left, _
                                               deleteButtonPos.Top, _
                                               deleteButtonPos.Width, _
                                               deleteButtonPos.Height)
    With deleteButton
        .Caption = "Delete Button"
        .Name = "deleteButtonFunct"
        .OnAction = "Sheet1.deleteButtonFunct_Click"
    End With
End Sub

Private Sub deleteButtonFunct_Click()

    deleteButtonPos.Select
    Range(Selection, Selection.End(xlDown)).Select
    introw = Selection.Count
    Selection.EntireRow.Delete
    buttonPos.Select
    Call check

End Sub

Function check()

rownum = ActiveCell.Row
colnum = ActiveCell.Column
selnum = rownum - introw

If (rownum > 1) Then
Cells(selnum, colnum).Select

    Set deleteButtonPos = Selection.Range("H1")
    Set deleteButton = ActiveSheet.Buttons.Add(deleteButtonPos.Left, _
                                               deleteButtonPos.Top, _
                                               deleteButtonPos.Width, _
                                               deleteButtonPos.Height)
    With deleteButton
        .Caption = "Delete Button"
        .Name = "deleteButtonFunct"
        .OnAction = "Sheet1.deleteButtonFunct_Click"
    End With
End If

End Function

代码已经过测试,运行良好。 希望这会有所帮助:)