Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在excel vba中对多个按钮使用一个子按钮_Vba_Excel - Fatal编程技术网

在excel vba中对多个按钮使用一个子按钮

在excel vba中对多个按钮使用一个子按钮,vba,excel,Vba,Excel,我有一个包含客户机数据的电子表格,每行一个客户机,每行有一个按钮,用于启动显示该客户机数据的用户表单,然后您可以更新该客户机的数据并将其写回该客户机的行。在我们开始使用电子表格之前,每个案例工作者都会进行筛选,以便只显示他们的客户 我想知道是否有一种方法可以让每行的按钮都有一个命令按钮过程,即当你按下第6行的按钮时,它运行一个命令按钮6的过程来调用该行的数据,当你按下第8行的按钮时,它运行一个命令按钮8的过程来调用第8行的数据。然而,这两个步骤是相同的,所以我可以有一个CommandButton

我有一个包含客户机数据的电子表格,每行一个客户机,每行有一个按钮,用于启动显示该客户机数据的用户表单,然后您可以更新该客户机的数据并将其写回该客户机的行。在我们开始使用电子表格之前,每个案例工作者都会进行筛选,以便只显示他们的客户

我想知道是否有一种方法可以让每行的按钮都有一个命令按钮过程,即当你按下第6行的按钮时,它运行一个命令按钮6的过程来调用该行的数据,当你按下第8行的按钮时,它运行一个命令按钮8的过程来调用第8行的数据。然而,这两个步骤是相同的,所以我可以有一个CommandButtoni sub,其中I是行号

这是一个非常简单的过程,但我不想复制它350次

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添加功能区或右键单击控件。