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中常用的AddressValue 。 如果在给定的范围内找不到给定的值, 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值。