如何创建一个宏,该宏将添加一个新按钮,该按钮将在添加另一个新行时移动

时间:2017-03-25 20:20:58

标签: excel excel-vba vba

我想创建一个以一行开头的表(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

2 个答案:

答案 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

如果您这样做,那么您将不会有数百甚至数千个按钮减慢您的程序。

enter image description here

如果您想这样做,您需要将此代码放在包含列表的表单中(VBAProject&gt; Microsoft Excel Objects&gt; [SHEET]),您需要将一些值更改为与您的项目合作,但这应该是一个很好的起点。

答案 1 :(得分:0)

您可以考虑将单元格格式化为按钮,而不是使用按钮,并在单击单元格或双击单元格时使用单元格的Selection_Change或Double-Click事件来触发宏。 如果您选择单击解决方案,则应控制周围单元格的Enter行为。这是为了避免Excel自动将光标移动到这样的单元格。使用Application.MoveAfterReturnDirection = xlToRight