我想创建一个以一行开头的表(B14:H14),它在B15中有一个按钮,它将运行一个宏来插入一个新行(并将公式从初始行复制并粘贴到新行)。但是我还想在A列中添加一个按钮来删除按钮所在的行。我遇到了按钮位置的一些问题,我采用了两种不同的方式。
1)我在表格的底部插入新行,并且我不能将按钮相对于新行放置,因为顶部和左侧位置将始终不同,或者
2)(这就是我现在的代码)我在表格的顶部插入行,每次都将按钮放在A14中。这是宏第一次运行时的工作原理,但是当我再次运行它时,添加的第一个按钮会被拉伸。第二行的按钮最后是A14的顶部,A15的底部。
代码很好地插入新行,但是当添加另一个新行时如何让按钮向下移动?
另外,我总共n00b。这是我的代码。
Sub Add()
'
' Add Macro
'
Rows("14:14").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("B15:H15").Select
Selection.Copy
Range("B14").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Buttons.Add(0, 207, 57.65, 14.598).Select
Application.CutCopyMode = False
Selection.OnAction = "Remove"
Selection.Characters.Text = "Remove"
With Selection.Characters(Start:=1, Length:=6).Font
.Name = "Calibri"
.FontStyle = "Regular"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 1
End With
Application.CutCopyMode = False
'
End Sub
答案 0 :(得分:0)
我做了类似的事情,但我没有为每一行创建一个新按钮,而是只按了一个按钮移动到选择了哪一行。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
set_selected_row Target
End Sub
Sub set_selected_row(ByVal Target As Range)
Dim tbl As ListObject
Set tbl = shtList.ListObjects("tblList")
Dim r, c, t
r = tbl.Range.Rows.Count + 1
c = tbl.Range.Columns.Count
If Target.Row < r And Target.Column <= c Then
Dim btnRemoveItem As Shape
Set btnRemoveItem = shtList.Shapes("btnRemoveItem")
t = ((Target.Row - 1) * 15)
btnRemoveItem.Top = t
End If
End Sub
Sub remove_item()
Dim answer As Integer
answer = MsgBox("Are you sure you want to remove this item?", vbYesNo + vbQuestion, "Remove Item")
Dim btnRemoveItem As Shape
Set btnRemoveItem = shtList.Shapes("btnRemoveItem")
Dim SelectedRow
SelectedRow = (btnRemoveItem.Top / 15) + 1
If answer = vbYes Then
Dim tbl As ListObject
Set tbl = shtList.ListObjects("tblList")
tbl.ListRows(SelectedRow - 1).Delete
tr = tbl.Range.Rows.Count
tc = tbl.Range.Columns.Count
If SelectedRow > tr Then
ar = ActiveCell.Row
ac = ActiveCell.Column
If ar > tr Or ac > tc Then 'check if the active cell is in the table.
nr = ar
nc = ac
If nr > tr Then nr = tr
If nc > tc Then nc = tc
shtList.Cells(nr, nc).Select
shtList.Cells(ar, ac).Select
End If
End If
End If
End Sub
如果您这样做,那么您将不会有数百甚至数千个按钮减慢您的程序。
如果您想这样做,您需要将此代码放在包含列表的表单中(VBAProject&gt; Microsoft Excel Objects&gt; [SHEET]),您需要将一些值更改为与您的项目合作,但这应该是一个很好的起点。
答案 1 :(得分:0)
您可以考虑将单元格格式化为按钮,而不是使用按钮,并在单击单元格或双击单元格时使用单元格的Selection_Change或Double-Click事件来触发宏。
如果您选择单击解决方案,则应控制周围单元格的Enter行为。这是为了避免Excel自动将光标移动到这样的单元格。使用Application.MoveAfterReturnDirection = xlToRight