2017-01-20 11 views
2

私は次のマクロ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 

このマクロは、ドロップダウンメニューから値をとり、値がセルに進み持っています。最初の質問は次のとおりです。

セルから値を取得して、コードで具体的に書き込むことはできますか?

2番目の質問は次のとおりです。

はどうやって手続きを簡素化し、すべての値IFのために書き込むことはできませんか?

+1

'セルからどのように値を取得できますか? 'あなたは "ベルリン"、 "パリ"など、または "C20"、 "C100"などに言及していますか?とにかく、私はあなたのデータ構造に依存すると思います。たとえば、C20とC100の間のセルがすべて空の場合などです。私はあなたがより多くのデータを提供すべきだと思います。たぶんあなたのテーブルのスナップショット。 – CMArg

+1

ここには2つの別々の質問があります。 @ Wolfieの答えは、コード内に特にセル値を書かないという問題を解決しています。私の答えはチェックしたいすべての条件に対して 'If'を書いていません。 Wolfieの3番目のコードブロックは、あなたの状況に対する良い解決策であり、おそらくあなたが望む*主な答えです。 – elmer007

答えて

3

まず、実際にはActivateの範囲を望んでいないでしょう!この回答を参照してください。 第二How to avoid using Select in Excel VBA macros

、あなたのコード...のElseIfを使用して

あなたのコード

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 

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を返します。

3

どのようにすれば手続きを簡略化でき、IFのすべての値を書き込むことはできますか?

あなたは(あなたの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"の場合、 "Paris"ケースにスキップし、そのセクション(Range("C100").Activate)のみを実行します。

これにより、オプションにアイテムを追加するのがはるかに簡単になり、たくさんの乱雑さが軽減されます(If-ElseIf-Else行)。

編集:Wujaszkunが述べたように、Case Elseセクションを追加すると、指定されたケースの1つではないComboBox1値が処理されます。

+2

他のすべてのケースをキャッチするために 'End Select'の前に' Case Else'を追加します。それは必要ではないかもしれないが、持っているのは良いことだ。 – Wujaszkun

+0

@Wujaszkun良い点、私は今それを含めるために質問を編集しました。ありがとう – elmer007