在excel vba中对多个按钮使用一个子按钮
我有一个包含客户机数据的电子表格,每行一个客户机,每行有一个按钮,用于启动显示该客户机数据的用户表单,然后您可以更新该客户机的数据并将其写回该客户机的行。在我们开始使用电子表格之前,每个案例工作者都会进行筛选,以便只显示他们的客户 我想知道是否有一种方法可以让每行的按钮都有一个命令按钮过程,即当你按下第6行的按钮时,它运行一个命令按钮6的过程来调用该行的数据,当你按下第8行的按钮时,它运行一个命令按钮8的过程来调用第8行的数据。然而,这两个步骤是相同的,所以我可以有一个CommandButtoni sub,其中I是行号 这是一个非常简单的过程,但我不想复制它350次在excel vba中对多个按钮使用一个子按钮,vba,excel,Vba,Excel,我有一个包含客户机数据的电子表格,每行一个客户机,每行有一个按钮,用于启动显示该客户机数据的用户表单,然后您可以更新该客户机的数据并将其写回该客户机的行。在我们开始使用电子表格之前,每个案例工作者都会进行筛选,以便只显示他们的客户 我想知道是否有一种方法可以让每行的按钮都有一个命令按钮过程,即当你按下第6行的按钮时,它运行一个命令按钮6的过程来调用该行的数据,当你按下第8行的按钮时,它运行一个命令按钮8的过程来调用第8行的数据。然而,这两个步骤是相同的,所以我可以有一个CommandButton
Private Sub CommandButton1_Click()
UserForm1.TextBox1.Value = Worksheets("Sheet1").Range("C2").Value
GetData
UserForm1.Show
End Sub
您需要一个参数化的
Click
处理程序,这在VBA中是没有的。您可以将350个表单按钮分配给同一处理程序,但它们都会分配UserForm1.TextBox1.Value
工作表(“Sheet1”).Range(“C2”).Value中的任何内容,实际上阅读您的问题时,您似乎想要一些“行参数”
工作表上有350个表单/ActiveX按钮通常不是一个好主意:我会尝试另一种方法
单击按钮时,选择是否在需要的行中?您可以以某种方式突出显示当前/活动行(处理SelectionChanged
工作表事件),并在某个位置(在功能区?)有一个按钮来关闭选择
:
UserForm1.TextBox1.Value = Sheet1.Range("C" & Selection.Row).Value
除此之外,它还能工作。。。但是表单按钮不是这样使用的。您需要一个参数化的点击处理程序,这是VBA中所没有的。您可以将350个表单按钮分配给同一处理程序,但它们都会分配UserForm1.TextBox1.Value
工作表(“Sheet1”).Range(“C2”).Value
中的任何内容,实际上阅读您的问题时,您似乎想要一些“行参数”
工作表上有350个表单/ActiveX按钮通常不是一个好主意:我会尝试另一种方法
单击按钮时,选择是否在需要的行中?您可以以某种方式突出显示当前/活动行(处理SelectionChanged
工作表事件),并在某个位置(在功能区?)有一个按钮来关闭选择
:
UserForm1.TextBox1.Value = Sheet1.Range("C" & Selection.Row).Value
除此之外,它还能工作。。。但是表单按钮不是用来这样使用的。在实现了Rory的建议之后,我认为它是最简单、最优雅的代码解决方案。允许复制和粘贴按钮,而无需任何进一步的配置(如果使用代码统一完成)
Sub AddVote()
' This is a simple vote tally counter. Each time a button is clicked,
' the vote count in the third column is incremented by one.
' Imagine: first column = candidate name; second column holds form button;
' Thid column = vote count
' Create a Form button and assign this macro. Copy and paste button!
Dim rngTally As Range
' Use rngTally to point to the cell in the third column (3, in the formula)
' in the same row as the top left corner of the button.
Set rngTally = Cells(ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row, 3)
' Increment the value of the cell pointed to by rngTally by 1
rngTally = rngTally + 1
End Sub
如果您不想/不需要设计自定义用户表单,您可以使用表单。。。命令:
单击Excel中的“自定义快速访问工具栏”下拉菜单
标题栏
选择更多命令
如果文档将分发给其他用户,请将“所有文档(默认)”选项更改为文档名称
选择以从中选择命令:不在功能区中的命令
选择表单。。。指挥部
单击“添加”将按钮添加到右侧菜单
单击“确定”
选中表格中的任何单元格后,单击“窗体”按钮。编辑并按Enter键。还可以使用条件筛选值。不幸的是,没有办法编辑表单,但是对于狭窄的单元格内容很有用。不需要编码
在实现Rory的建议后,我认为这是最简单、最优雅的代码解决方案。允许复制和粘贴按钮,而无需任何进一步的配置(如果使用代码统一完成)
Sub AddVote()
' This is a simple vote tally counter. Each time a button is clicked,
' the vote count in the third column is incremented by one.
' Imagine: first column = candidate name; second column holds form button;
' Thid column = vote count
' Create a Form button and assign this macro. Copy and paste button!
Dim rngTally As Range
' Use rngTally to point to the cell in the third column (3, in the formula)
' in the same row as the top left corner of the button.
Set rngTally = Cells(ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row, 3)
' Increment the value of the cell pointed to by rngTally by 1
rngTally = rngTally + 1
End Sub
如果您不想/不需要设计自定义用户表单,您可以使用表单。。。命令:
单击Excel中的“自定义快速访问工具栏”下拉菜单
标题栏
选择更多命令
如果文档将分发给其他用户,请将“所有文档(默认)”选项更改为文档名称
选择以从中选择命令:不在功能区中的命令
选择表单。。。指挥部
单击“添加”将按钮添加到右侧菜单
单击“确定”
选中表格中的任何单元格后,单击“窗体”按钮。编辑并按Enter键。还可以使用条件筛选值。不幸的是,没有办法编辑表单,但是对于狭窄的单元格内容很有用。不需要编码
为每个按钮的子按钮提供一种更整洁的方式
Private Sub Delete0_Click(): DeleteRow (0): End Sub
Private Sub Delete1_Click(): DeleteRow (1): End Sub
Private Sub Delete2_Click(): DeleteRow (2): End Sub
Private Sub Delete3_Click(): DeleteRow (3): End Sub
Private Sub Delete4_Click(): DeleteRow (4): End Sub
Sub DeleteRow(row As Integer)
Debug.Print "DeleteRow(" & row & ")"
End Sub
为每个按钮安装一个sub的更整洁的方式
Private Sub Delete0_Click(): DeleteRow (0): End Sub
Private Sub Delete1_Click(): DeleteRow (1): End Sub
Private Sub Delete2_Click(): DeleteRow (2): End Sub
Private Sub Delete3_Click(): DeleteRow (3): End Sub
Private Sub Delete4_Click(): DeleteRow (4): End Sub
Sub DeleteRow(row As Integer)
Debug.Print "DeleteRow(" & row & ")"
End Sub
是-使用表单按钮,而不是ActiveX,将相同的宏分配给所有,并参考Activesheet.buttons(Application.Caller).TopleftCell.Row
获取行号。是-使用表单按钮,而不是ActiveX,将相同的宏分配给所有,并参考Activesheet.buttons(Application.Caller).TopleftCell.Row
获取行号。我同意350个按钮是个坏主意。但是,您可以创建一个WithEvents窗体Button类,该类钩住所有按钮单击并调用一个子例程。以下是约翰·沃肯巴赫的帖子:。这是我写的一篇疯狂的文章:。它们都适用于实际表单上的表单控件,但在工作表中也可以使用相同的思想。不过,我同意你的看法,我不会。我会使用RibbonX添加功能区或右键单击控件。我同意350个按钮是个坏主意。但是,您可以创建一个WithEvents窗体Button类,该类钩住所有按钮单击并调用一个子例程。以下是约翰·沃肯巴赫的帖子:。这是我写的一篇疯狂的文章:。它们都适用于实际表单上的表单控件,但在工作表中也可以使用相同的思想。不过,我同意你的看法,我不会。我会使用RibbonX添加功能区或右键单击控件。