将宏分配给与自动生成的按钮行对应的单元格

时间:2018-06-28 05:37:45

标签: excel vba excel-vba

我设法创建了一个表单,用户可以在其中扩展数据透视表的字段,一旦他们完全扩展了字段/分支,则将在E列中显示一个按钮,并在列J(有一些隐藏的列)。

我想要的是用户单击E列中的自动生成按钮,该按钮将J列中的相应数据导出到工作簿上某个位置的列表中。

下面的代码会自动为完全扩展的字段生成按钮,但是我不知道如何编写代码将每个按钮链接到J列中的相应单元格-这可能不是很困难,但是可以得到任何帮助。

Pivot table

Sub buttonGenerator()
Dim btn As Button
Application.ScreenUpdating = False
ActiveSheet.Buttons.Delete
Dim t As Range
Dim size As Integer

size = ActiveSheet.PivotTables("Pivottable1").TableRange2.Rows.Count

For i = 2 To size Step 1
    If Not IsEmpty(ActiveSheet.Range(Cells(i, 4), Cells(i, 4))) Then
      Set t = ActiveSheet.Range(Cells(i, 5), Cells(i, 5))
      Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
      With btn
        .OnAction = "btnS"
        .Caption = "Add to summary" '& i
        .Name = "Btn" & i
        End With
    End If
Next i
Application.ScreenUpdating = False
End Sub

Sub buttonAppCaller()
    MsgBox Application.Caller
End Sub

所以这是我的代码..它引发运行时错误1004“无法获取工作表类的Buttons属性”。不知道我做错了什么,但是当单击特定按钮时,我需要从按钮旁边的单元格中获取数据,以复制到工作表2列表的底部。请帮忙!

Sub btnS()
    Dim dest As Range
    Dim origin As Range

    origin = ActiveSheet.Buttons(Application.Caller).TopLeftCell.Offset(0, 1) 'input data from cell next to button click
    dest = Worksheets("Form Output").Range("A1") 'output data to list in sheet 2 - "Form output"
    Set dest = origin
End Sub

1 个答案:

答案 0 :(得分:0)

  1. 不要像使用Integer那样使用size进行行计数。 Excel的行数超过Integer无法处理。建议在VBA中使用always to use Long instead of IntegerInteger完全没有好处。

  2. 每个按钮调用的过程称为btnS,如您在.OnAction = "btnS"中定义的那样。因此,您需要在模块中使用名称为Sub

  3. 您可以使用Buttons(Application.Caller).TopLeftCell将某个单元格移到按钮下方,然后从该单元格中确定行或列。

    Public Sub btnS() 'sub name must match `.OnAction` name
        MsgBox ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row
    End Sub
    
  4. 如果您打算仅在特定的工作表上使用它,建议不要使用ActiveSheet之类的特定工作表。 Worksheets("your-sheet-name")可以轻松更改,应尽可能避免。