我设法创建了一个表单,用户可以在其中扩展数据透视表的字段,一旦他们完全扩展了字段/分支,则将在E列中显示一个按钮,并在列J(有一些隐藏的列)。
我想要的是用户单击E列中的自动生成按钮,该按钮将J列中的相应数据导出到工作簿上某个位置的列表中。
下面的代码会自动为完全扩展的字段生成按钮,但是我不知道如何编写代码将每个按钮链接到J列中的相应单元格-这可能不是很困难,但是可以得到任何帮助。
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
答案 0 :(得分:0)
不要像使用Integer
那样使用size
进行行计数。 Excel的行数超过Integer
无法处理。建议在VBA中使用always to use Long instead of Integer,Integer
完全没有好处。
每个按钮调用的过程称为btnS
,如您在.OnAction = "btnS"
中定义的那样。因此,您需要在模块中使用名称为的Sub
。
您可以使用Buttons(Application.Caller).TopLeftCell
将某个单元格移到按钮下方,然后从该单元格中确定行或列。
Public Sub btnS() 'sub name must match `.OnAction` name
MsgBox ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row
End Sub
如果您打算仅在特定的工作表上使用它,建议不要使用ActiveSheet
之类的特定工作表。 Worksheets("your-sheet-name")
可以轻松更改,应尽可能避免。