我已经创建了几个宏,一个宏在已确定的行中创建一个形状,并指定了一个宏,并指定了宏,在单击该形状时删除该行。添加形状的宏由另一个宏激活,该宏使用相关数据填充表格的最后一个空行,并删除相关行的形状,但我会将其中的一行留下。
因此宏应该将形状添加到正在填充的行中,一旦单击了形状,它就会获得形状的行并将其删除。
以下是宏:
- 创建形状的那个:
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
问题有时(我还没有找到模式)一行中的按钮会删除另一行。我无法找到原因,你能看到它吗?
答案 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
事件非常重要。