我正在尝试为我的成本计算模型构建一个主页面。在这个页面上,我使用组合框创建了一个下拉列表,然后我想分配一个宏,一旦从列表中选择一个选项,就会创建一个不同按钮/命令按钮的列表。然后我想构建另一个分配给这些按钮的宏,然后将用户带到同一工作簿中的另一个选项卡/工作表,具体取决于他们从下拉列表中选择的选项。
有人可以给我一个关于我应该使用什么代码的想法,首先创建一个命令按钮,从下拉菜单中引用所选选项,然后为该按钮分配一个简单的宏,然后将我带到指定的标签/表?
到目前为止,我有以下内容:
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
创建各种按钮,但它无法正常工作,因为所有选定的选项都显示相同的按钮,按钮也不会消失。此外,我似乎无法为创建的按钮分配宏。
答案 0 :(得分:2)
这只是一个例子:
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
。
确切的步骤:
在E1:E4中写出组合框选择的值。选择四个单元格,然后在名称框中键入selectionIn
(在公式栏的左侧)。这会创建一个命名范围(还有其他方法可以创建命名范围,但这是我首选的方法)。
已调用的单元格F1
selectionOut
创建了一个组合框,并为其输入和输出引用了这两个范围:
创建一个按钮,为其指定标签“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
数组的基本索引更改为其他值,它仍然可以正常工作。