2017-01-17 13 views
4

私は新しいワークブックを作成し、ユーザ入力、フォーマットに基づいて必要なVBのいくつかのモジュールを挿入するために一連のユーザフォームを介して実行する一連の(複雑な)プロシージャを含むブック内の一連の隠しテンプレートから要素をコピーし、プロシージャの最後に文書を.xlsmファイルとして保存するようにユーザーに求めます。私はこれを達成しました。組み合わせ変数に基づいたプロシージャを書くためのExcel VBA標準プラクティス

私がこれを達成するために書いた手順のいくつかは、モジュラー形式で書かれています。ユーザーフォームは、ユーザーが作成したいブックを2つの方法でカスタマイズする小さなビジュアルツールとして機能するためです。ワークブックに含めるワークシートの数を指定し、ワークブックごとに表示するデータ・テーブルの数を指定し、作成するワークシートごとのワークシートとデータ・テーブルの組み合わせに基づいて、プロシージャをコールしますそれに対応する。

この手順では、ワークブックを生成し、ユーザーのニーズに基づいてVBコードを挿入し、必要なワークシートごとに個別のデータテーブルを作成する一連のモジュール式プロシージャを呼び出します。要求された場合、これらのコード例を提供することができます。

私の質問は、私がこれらのプロシージャをuserformから呼び出す方法に関するものです。現在、私は、if文の一連の使用(魅力がないが、それは、この場合に必要である場合、各ステートメントは、一意の番号の組み合わせに基づいて、それぞれが別々のプロシージャを呼び出しているように私は、わからないよ):

'Declare the number of worksheets the user needs 
Dim NumberOfTabsNeeded As String 
NumberOfTabsNeeded = UserForm1.ComboBox2.Value  

'Number of data tables needed per worksheet 
Dim Tab1Amount As String 
Tab1Amount = UserForm1.Label71.Caption 
Dim Tab2Amount As String 
Tab2Amount = UserForm1.Label72.Caption 

'One worksheet needed 
If NumberOfTabsNeeded = "1" And Tab1Amount = "1" Then Call OneTabOneDTableAddCode 
If NumberOfTabsNeeded = "1" And Tab1Amount = "2" Then Call OneTabTwoDTablesAddCode 
If NumberOfTabsNeeded = "1" And Tab1Amount = "3" Then Call OneTabThreeDTablesAddCode 

'Two worksheets needed 
If NumberOfTabsNeeded = "2" And Tab1Amount = "1" And Tab2Amount = "1" Then Call TwoTabsOneDTableEachAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "1" And Tab2Amount = "2" Then Call TwoTabsOneDTableTwoDTablesAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "1" And Tab2Amount = "3" Then Call TwoTabsOneDTableThreeDTablesAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "2" And Tab2Amount = "1" Then Call TwoTabsTwoDTablesOneDTableAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "2" And Tab2Amount = "2" Then Call TwoTabsTwoDTablesTwoDTablesAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "2" And Tab2Amount = "3" Then Call TwoTabsTwoDTablesThreeDTablesAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "3" And Tab2Amount = "1" Then Call TwoTabsThreeDTablesOneDTableAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "3" And Tab2Amount = "2" Then Call TwoTabsThreeDTablesTwoDTablesAddCode 
If NumberOfTabsNeeded = "2" And Tab1Amount = "3" And Tab2Amount = "3" Then Call TwoTabsThreeDTablesThreeDTablesAddCode 

これらのステートメントのいずれがTrueかに基づいて、新しいワークブックを作成し、ユーザーが必要とするワークシートおよびデータテーブルの数に基づいてコードを挿入するプロシージャが呼び出されます。可能なワークシートとデータテーブルの数を増やす場合、これはおそらく非常にうまくスケールされないことがこの例から分かります。上記の例は、最大1,2ワークシート。

この例で私が使っている方法よりも、Ifを使って別の手順を呼び出す方法がより洗練されていますか?または、Ifを使用して、ユーザーが必要とする可能性のある変数の組み合わせを処理する必要がありますか?

答えて

4

パラメータの組み合わせが分かっていると仮定して、サブ名を標準化します。次に、application.runを使用して、文字列の組み合わせ でフィードできます。

application.Run "tabs" & NumberOfTabsNeeded & "tabOne" & Tab1Amount & "tabTwo" & Tab2Amount 

は、次のasssuming:

NumberOfTabsNeeded : 2 
Tab1Amount: 2 
Tab2Amount: 3 

は、サブtabs2tabOne2tabTwo3が呼び出されていたであろう。

大きなハードコードケースステートメントやif文ブロックは必要ありません。

+1

美しい。私は別のやり方は、独自の命令でプロシージャ名を連結し、必要に応じて出力/デバッグを容易にすることです。連結ハンドラが存在しない場合。 –

3

ケース/セレクトを使用してください。複数のIf/Thenステートメントをどのように使用しているかを避け、ネストすることができます。以下はその例です。

Select Case NumberOfTabsNeeded 
    Case 1 ' One Worksheet Needed 
     Select Case Tab1Amount 
      Case 1: Call OneTabOneDTableAddCode 
      Case 2: Call OneTabTwoDTablesAddCode 
      Case 3: Call OneTabThreeDTablesAddCode 
     End Select 
    Case 2 
     ...  
End Select 

構文は次のとおりです。ここで、expressionは比較する変数または値です。 Case Elseは、値が比較された値を満たさない場合に「すべてをキャッチ」として使用できます。

Select Case Expresssion 
    Case [Value or Value1 To Value2] 
End Select 

いずれの方法でも、サブルーチンや条件文を使用する場合でも、各組み合わせを処理する必要があります。あなたの他のサブルーチンがどのように見えるかに応じて、いくつかのロジックを処理する変数を渡すことができます。

関連する問題