删除项目 "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
范围变量 buttonPos
和 deleteButtonPos
似乎只包含一个单元格引用。添加第二个场景时,您需要使用 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
代码已经过测试,运行良好。
希望这会有所帮助:)
我知道问题是什么,但我不知道如何解决它......
所以我正在做的是我在我的工作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
范围变量 buttonPos
和 deleteButtonPos
似乎只包含一个单元格引用。添加第二个场景时,您需要使用 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
代码已经过测试,运行良好。 希望这会有所帮助:)