Excel宏以创建命令按钮并将宏指定给按钮

时间:2014-07-12 13:58:43

标签: excel vba excel-vba

我正在尝试为我的成本计算模型构建一个主页面。在这个页面上,我使用组合框创建了一个下拉列表,然后我想分配一个宏,一旦从列表中选择一个选项,就会创建一个不同按钮/命令按钮的列表。然后我想构建另一个分配给这些按钮的宏,然后将用户带到同一工作簿中的另一个选项卡/工作表,具体取决于他们从下拉列表中选择的选项。

有人可以给我一个关于我应该使用什么代码的想法,首先创建一个命令按钮,从下拉菜单中引用所选选项,然后为该按钮分配一个简单的宏,然后将我带到指定的标签/表?

到目前为止,我有以下内容:

Option Explicit

Sub Select_Change()
    With ThisWorkbook.Sheets("Main Page").Shapes("Select").ControlFormat
        Select Case .List(.Value)
            Case "Vehicle1": All_States1
            Case "Vehicle2": All_States2
            Case "Vehicle3": All_States3
            Case "Vehicle4": All_States4
            Case "Vehicle5": All_States5
            Case "Vehicle6": All_States6
            Case "Vehicle7": All_States7
        End Select
    End With
End Sub

然后我尝试使用名称All_States1创建各种按钮,但它无法正常工作,因为所有选定的选项都显示相同的按钮,按钮也不会消失。此外,我似乎无法为创建的按钮分配宏。

2 个答案:

答案 0 :(得分:2)

这只是一个例子:

  1. 创建按钮
  2. 为其指定一个宏
  3. Sub button_maker()
        Dim r As Range
        Set r = Selection
            ActiveSheet.Buttons.Add(94.5, 75.75, 51, 27.75).Select
            With Selection
                .OnAction = "mooney"
                .Characters.Text = "Bump"
            End With
        r.Select
    End Sub
    
    
    Sub mooney()
        Range("A1").Value = Range("A1").Value + 3
    End Sub
    

答案 1 :(得分:0)

如果我正确理解了问题,您希望在工作表上有一个下拉列表(组合框),当单击一个按钮时,您希望根据选择运行宏。以下是这样做 - 看看它是否对你有帮助。

首先 - 创建一个组合框,输入范围(组合框中的名称)和输出(选择的值)。例如,您可以调用输入selectionIn和结果selectionOut

enter image description here

确切的步骤:

在E1:E4中写出组合框选择的值。选择四个单元格,然后在名称框中键入selectionIn(在公式栏的左侧)。这会创建一个命名范围(还有其他方法可以创建命名范围,但这是我首选的方法)。

已调用的单元格F1 selectionOut

创建了一个组合框,并为其输入和输出引用了这两个范围:

enter image description here

创建一个按钮,为其指定标签“Go”并将其链接到操作runIt

最后,我在工作簿模块中创建了以下代码:

Sub runIt()
  Dim whatToDo, makeName As Boolean
  ' look up the name of the combo based on the value:
  whatToDo = Range("selectionIn").Cells([selectionOut].Value, 1)
  MsgBox "have to do '" & whatToDo & "'"
  makeName = False

  Select Case whatToDo
    Case "one"
      ' example of putting the code you need right in the select:
      MsgBox "doing the first thing"
    Case "two"
      ' example of calling a specific routine:
      Call caseTwo
    Case "three"
      Application.Run "case" & whatToDo ' making the name of the function on the fly
    Case "four"
      makeName = True
  End Select

  If makeName Then
    Dim nameToRun
    nameToRun = "case" & whatToDo
    Application.Run nameToRun
  End If

End Sub

Sub caseTwo()
MsgBox "called the code for case two"
End Sub

Sub caseThree()
MsgBox "doing case three here"
End Sub

Sub caseFour()
MsgBox "even four can be done"
End Sub

这显示了根据所选内容处理不同情况的几种不同方法。当然,每次组合框选择改变时你都可以有一个宏运行 - 但它听起来就像你的描述那样不是你想要的。

让我知道你如何使用这个代码示例 - 我试图保持简单,但同时显示一些选项。

一个替代方案(可能更简单)就是拥有一个数组,其中包含您要调用的函数的名称:

Sub otherMethod()
    Dim functionList()
    functionList = Array("caseOne", "caseTwo", "caseThree", "caseFour")
    Application.Run functionList([selectionOut].Value - 1)
End Sub

这当然是我能想到的最紧凑的方式......你需要-1的偏移量,因为数组索引是基数0(默认情况下是默认值),组合框返回1第一次选择。您可以通过编写

使代码更加健壮
functionIndex = [selectionOut].Value + LBound(functionList) - 1
Application.Run functionList(functionIndex)

这可以确保如果将functionList数组的基本索引更改为其他值,它仍然可以正常工作。