删除行按钮删除其他行

时间:2014-11-27 13:27:01

标签: excel vba excel-vba

我已经创建了几个宏,一个宏在已确定的行中创建一个形状,并指定了一个宏,并指定了宏,在单击该形状时删除该行。添加形状的宏由另一个宏激活,该宏使用相关数据填充表格的最后一个空行,并删除相关行的形状,但我会将其中的一行留下。

因此宏应该将形状添加到正在填充的行中,一旦单击了形状,它就会获得形状的行并将其删除。

以下是宏:

- 创建形状的那个:

Sub addDelBt(ByVal Target As Range)
Dim rw As Long
rw = Target.Row
Dim shp As Object
Set shp = Plan1.Shapes.AddShape(msoShapeMathMultiply, Target.Left + 2.5, Target.Top + 2.5, Target.RowHeight - 2, Target.RowHeight - 2)
    'shp.Width = 11
    'shp.Height = 11
    shp.Fill.ForeColor.RGB = RGB(192, 0, 0)
    shp.Fill.BackColor.RGB = RGB(170, 170, 170)
    shp.Line.Visible = msoFalse
    With shp.Shadow
        .ForeColor.RGB = RGB(0, 0, 128)
        .OffsetX = 0.5
        .OffsetY = 2
        .Transparency = 0.5
        .Visible = True
    End With
    With shp.ThreeD
        .BevelTopType = msoBevelCircle
        .BevelTopInset = 15
        .BevelTopDepth = 3
        .PresetLighting = msoLightRigBalanced
        .LightAngle = 145
        .Visible = True
    End With
    shp.Name = "btnDel" & rw
    shp.OnAction = "delRow"
End Sub

- 形状的动作:

Sub delRow()
Plan1.Unprotect ("password")
Dim shp As Object
Set shp = Plan1.Shapes(Application.Caller)
Dim rw As Long
rw = shp.TopLeftCell.Row
Dim doc As String
doc = Plan1.Cells(rw, 2).Value
Dim msgResult As VbMsgBoxResult
msgResult = MsgBox("Você deseja deletar o documento " + doc + "?", vbYesNo)
If msgResult = vbYes Then
    Plan1.Rows(rw).EntireRow.Delete
End If
Plan1.Protect ("password")
End Sub

问题有时(我还没有找到模式)一行中的按钮会删除另一行。我无法找到原因,你能看到它吗?

1 个答案:

答案 0 :(得分:1)

无法理解为什么会发生这种情况。代码看起来都不错。

一旦我也想制作非常相似的功能,并意识到使用许多动态创建的按钮不是最佳选择(至少不适合我)。

我放弃了形状的想法,并使用Worksheet_SelectionChange事件制作了类似的功能。通过一些很好的格式化,您可以使列中的单元格看起来像一些删除按钮。 Worksheet_SelectionChange事件(对于单元格)的作用类似于OnClick事件(对于形状的按钮/ OnAction)。

示例:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo ErrHandler
Application.EnableEvents = False

If Target.Column = 5 Then 'If the clicked cell is in the column 5
    Dim doc As String
    doc = Cells(Target.row, 2).Value
    Dim msgResult As VbMsgBoxResult
    msgResult = MsgBox("Voce^ deseja deletar o documento " + doc + "?", vbYesNo)
    If msgResult = vbYes Then
        Plan1.Rows(Target.Row).EntireRow.Delete
    End If
End If

ErrHandler:
Application.EnableEvents = True

End Sub

包含停用事件的ErrorHandler对于防止row.delete事件触发另一个Worksheet_SelectionChange事件非常重要。