删除项目“Object required”excel VBA

我明白什么是问题,但我不知道如何解决它…所以我在做的是,我点击一个button(addSceneButton)在我的工作表(“成本”),它将在button(addSceneButton)正上方插入另一个工作表(“场景模板”)的副本。 它也会在先前插入的图纸的最右边创build一个button(deleteSceneButton)。
这个button(deleteSceneButton),单击时,必须删除它旁边的区域。 如果我只添加1个场景,它工作正常。 但是,当我添加更多,然后单击deleteButton,它会自动删除插入的最后一张。
而当我想删除第二个,它给了我“对象需要”的错误。
它必须是因为我覆盖delteButtonPos而不是dynamic创build一个,但我不知道如何。
有人可以帮我吗?

这是我的代码

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 

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

在这里,我添加了3个variables作为公共introw, selnum, colnum

AddSceneButton子部分没有变化。

我添加了一个额外的检查function,再次设置button,并正确设置行号和列号。

deleteButtonFunct子句中调用Check函数,每次点击删除button时,删除复制到工作表的当前/最新行,并在最后一列设置一个新的删除button。

如果Row number is 1 ,则不需要设置额外的button,因此是检查function中的条件。

我修改了你的代码。 请find更新的代码。

 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 

代码已经过testing,工作正常。 希望这应该帮助:)

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

如果将以下代码添加到新模块中,它将显示如何唯一地处理所有dynamicbutton。

我的例子使用一个数字(count)来跟踪和索引新的button,它可以相当简单地修改成一个单元格引用(在你的例子中你想删除的范围)。

 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