Excel VBA基于组合variables编写程序的标准实践

我有一系列(复杂的)程序,它们通过一系列用户表单运行,以创build一个新的工作簿,根据用户input插入所需VB的几个模块,通过从一系列隐藏的模板中复制元素来格式化新的工作簿包含过程的工作簿,并提示用户在过程结束时将文档另存为.xlsm文件。 我已经实现了这一点。

为了达到这个目的,我编写的程序的一些变化是以模块化方式编写的,因为用户表单作为一个小型的可视化工具,用于用两种方式定制他们希望生成的工作簿:他们能够指定有多less工作表他们希望在工作簿中指定他们希望在工作簿中为每个工作表显示多less个数据表,并且根据他们希望创build的每个工作表的工作表和数据表的组合,调用一个过程来适应它。

该过程生成工作簿,并根据用户的需求在其中插入VB代码,然后调用一系列单独的模块化过程,为每个需要的工作表构build每个单独的数据表。 如果需要,我可以提供这些代码示例。

我的问题与我从用户窗口调用这些过程的方式有关。 目前我使用了一系列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 

根据这些语句中的哪一个为真,调用一个创build新工作簿的过程,根据用户需要的工作表和数据表的数量插入代码。 从这个例子可以看出,如果可能的工作表和数据表的数量增加,这可能不会很好地扩展,上面的例子只针对数字1,2和3的每个可能的数字组合,最多两个工作表。

是否有一个更清洁,更可扩展的方法来调用独立的程序如果我在这个例子中使用它,而不是如何使用它? 还是有必要使用If来处理用户可能需要的每个可能的variables组合?

假设你知道参数的组合,然后标准化你的子名称。 然后你可以使用application.run并用string组合来提供它

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

假设如下:

 NumberOfTabsNeeded : 2 Tab1Amount: 2 Tab2Amount: 3 

那么sub tabs2tabOne2tabTwo3将被调用。

不需要大的硬编码的case语句或者语句块。

尝试使用大小写/select。 这是避免多个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式是要比较的variables或值。 在没有值满足比较值的情况下,可以将Else用作“全部捕获”。

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

无论如何,你将不得不处理每个组合 – 无论是通过你的子程序还是条件语句。 根据你的其他子程序的样子,你可以传递variables给他们来处理一些逻辑。