2017-01-17 62 views
4

我有一系列(複雜)程序,它們通過一系列用戶表單運行,以創建一個新的工作簿,根據用戶輸入插入所需VB的幾個模塊,格式新工作簿通過從包含過程的工作簿中的一系列隱藏模板中複製元素,並提示用戶在過程結束時將文檔另存爲.xlsm文件。我已經實現了這一點。Excel VBA基於組合變量編寫程序的標準做法

爲了達到這個目的,我編寫的程序的一些變體是以模塊化的方式編寫的,因爲用戶表單作爲一種小型的可視化工具供用戶定製他們希望以兩種方式生成的工作簿:它們能夠指定他們希望在工作簿中有多少工作表,並指定他們希望爲工作簿中的每個工作表顯示多少個數據表,並基於他們希望創建的每個工作表的工作表和數據表的組合,調用一個過程以適應它。

該過程根據用戶的需求生成工作簿並插入VB代碼,然後調用一系列單獨的模塊化過程,爲每個需要的工作表構建每個單獨的數據表。如果需要,我可以提供這些代碼示例。

我的問題屬於我從用戶窗口調用這些過程的方式。目前我使用一系列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 

根據這些陳述中的哪些陳述爲真,調用創建新工作簿的過程,根據用戶需要的工作表和數據表的數量插入代碼。從這個例子可以看出,如果可能的工作表和數據表的數量增加,這可能不會很好地擴展,上面的例子僅適用於數字1,2和3的每個可能的數字組合,最多兩個工作表。

是否有更清晰,更可擴展的方法來調用獨立的程序?如何在本例中使用它?還是有必要使用If來處理用戶可能需要的每個可能的變量組合?

回答

4

假設你知道參數的組合,然後標準化你的子名稱。然後,您可以使用application.run並使用字符串組合 (例如,

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

asssuming如下:

NumberOfTabsNeeded : 2 
Tab1Amount: 2 
Tab2Amount: 3 

則子tabs2tabOne2tabTwo3會被調用。

不需要大的硬編碼的case語句或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 

這種或那種方式,你將不得不處理每個組合 - 無論是通過你的子程序或條件語句。根據你的其他子程序的樣子,你可以傳遞變量給它們來處理一些邏輯。