VBA代码简化

时间:2017-01-20 12:38:41

标签: excel vba excel-vba

我有以下宏

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?

2 个答案:

答案 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

它有一些有用的方法,如AddressValue,适用于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值不是指定的情况之一。