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
这个macros从下拉菜单中取值,并进入单元格,其值是。 第一个问题是:
我怎样才能从单元格中获取值,而不是在代码中专门编写它们?
第二个问题是:
我怎样才能简化程序,而不是为每个值写一个IF?
首先,你可能实际上并不想Activate
范围! 看到这个答案: 如何避免使用在Excel VBAmacros中select
其次,你的代码…
你的代码
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
它有一些有用的方法,例如VBA中常用的Address
或Value
。 如果在给定的范围内找不到给定的值, Find
函数返回一个Range
对象或Nothing
。
我怎样才能简化程序,而不是为每个值写一个IF?
如果你需要重复testing你的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的值,并select适当的部分运行。 例如,如果ComboBox1 =“Paris”,它将跳到“Paris”的情况,只运行该部分( Range("C100").Activate
)。
这使得向选项添加更多项目变得更加容易,并且减less了大量If-ElseIf-Else
行的混乱。
编辑:正如Wujaszkun所述,添加Case Else
部分可处理不属于指定情况的ComboBox1值。