我有以下宏
Private Sub ComboBox1_Change()
If ComboBox1 = "Berlin" Then
Range("C20").Activate
Else
If ComboBox1 = "Paris" Then
Range("C100").Activate
Else
If ComboBox1 = "London" Then
Range("C150").Activate
End If
End If
End If
End Sub
此宏从下拉菜单中获取值并转到值为的单元格。第一个问题是:
如何从单元格中获取值而不是在代码中专门写入它们?
第二个问题是:
如何简化程序而不是为每个值写入IF?
答案 0 :(得分:3)
首先,您可能实际上并不想Activate
范围!看到这个答案:
How to avoid using Select in Excel VBA macros
其次,你的代码......
您的代码
Private Sub ComboBox1_Change()
If ComboBox1 = "Berlin" Then
Range("C20").Activate
Else
If ComboBox1 = "Paris" Then
Range("C100").Activate
Else
If ComboBox1 = "London" Then
Range("C150").Activate
End If
End If
End If
End Sub
使用ElseIf
Private Sub ComboBox1_Change()
If ComboBox1 = "Berlin" Then
Range("C20").Activate
ElseIf ComboBox1 = "Paris" Then
Range("C100").Activate
ElseIf ComboBox1 = "London" Then
Range("C150").Activate
End If
End Sub
请参阅文档:https://msdn.microsoft.com/en-us/library/office/gg251599.aspx
不对值进行硬编码
Private Sub ComboBox1_Change()
Dim rng as Range
Set rng = Nothing
Set rng = ActiveSheet.Range("C:C").Find(ComboBox1.Text)
If Not rng Is Nothing Then
' As I say, you probably don't actually want to use Activate!
rng.Activate
End If
End Sub
在此处详细了解Range
对象:
https://msdn.microsoft.com/en-us/library/office/ff838238.aspx
它有一些有用的方法,如Address
或Value
,适用于VBA。如果在给定范围内找不到给定值,则Find
函数会返回Range
个对象或Nothing
。
答案 1 :(得分:3)
如何简化程序而不是为每个值写入IF?
如果您需要反复测试ComboBox(例如If-ElseIf
结构),可以使用SELECT CASE
来简化代码:
Private Sub ComboBox1_Change()
Select Case ComboBox1
Case Is = "Berlin"
Range("C20").Activate
Case Is = "Paris"
Range("C100").Activate
Case Is = "London"
Range("C150").Activate
Case Else
Range("C1").Activate
End Select
End Sub
这将查看ComboBox1的值并选择要运行的相应部分。例如,如果ComboBox1 =“Paris”,它会跳到“巴黎”情况,只运行该部分(Range("C100").Activate
)。
这样可以更轻松地向您的选项中添加更多项目,并且可以减少许多If-ElseIf-Else
行的混乱。
编辑:正如Wujaszkun所提到的,添加Case Else
部分处理的ComboBox1值不是指定的情况之一。