添加到select大小写的数组

希望有人能帮助一个令人困惑的问题。

我有一个Excel工作表,有很多行,需要被移动到不同的工作表。

我有一个select case语句,根据第一列中的数字是否匹配case语句,将3个variables设置为true或false。 这工作正常,但我现在想要添加一个名称的数组,如果该值为true。

select case语句如下:

While LContinue If LRow = Lastrow Then LContinue = False Else Select Case Range("A" & LRow).Value Case 30 To 39 MainSheet = True 'Tabs(0) = "Main" Case 40 To 49 SecondSheet = True 'Tabs(1) = "Second" Case 111 To 112 ThirdSheet = True 'Tabs(2) = "Third" End Select LRow = LRow + 1 End If Wend 

这是用来看我是否需要添加表或不。 添加工作表我使用下面的代码:

 For i = LBound(Tabs) To UBound(Tabs) Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Tabs(i) Next i 

所以我想知道的是我怎么去添加sheetnames到数组,但只有在select case中的值是真的。

任何帮助将非常感激。

谢谢

为什么不使用工作表函数“ CountIfs ”?

它依赖于多个标准,你不需要任何循环,所以你的代码将运行得更快。

CountIfs (testedRange, “> = 30” ,testedRange, “<= 39”

…计算'testedRange'中> = 30和<= 39的值的数量。 如果至less有一个,那么只需添加你的工作表,就是这样。 没有循环,没有数组,不需要额外的variables。 HTH。

 Public Sub test() Dim testedRange As Range Dim Lastrow As Long Lastrow = 10 Set testedRange = ActiveSheet.Range("A1:A" & Lastrow) With Application.WorksheetFunction If .CountIfs(testedRange, ">=30", testedRange, "<=39") > 0 Then ThisWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Main" End If If .CountIfs(testedRange, ">=40", testedRange, "<=49") > 0 Then ThisWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Second" End If If .CountIfs(testedRange, ">=111", testedRange, "<=112") > 0 Then ThisWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Third" End If End With End Sub 

Excel VBA在处理实际的数组时并不是很灵活。 但是你可以使用一个集合来代替:

 SET tabs = new Collection 

然后,您可以随时add一个新的值(例如,在CASE结构中):

  . .. ... Case 40 To 49 SecondSheet = True Tabs.add "Second" ... .. 

集合的值几乎可以像数组中那样访问:

 for j=1 to tabs.count Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = tabs(j) next j 

编辑:

由于代码是可重入的,也就是说,当Range("A" & LRow).Value将被评估时,可能有多个实例,所以我们必须确保一个项目只设置一次。 这可以用字典(而不是集合)来完成:

 Set tabs = CreateObject("Scripting.Dictionary") 

现在很容易确定,以前是否已经定义了一个特定的页面:

 .. ... Case 40 To 49 SecondSheet = True tabs("Second")=1 

页面创build循环看起来像这样

 for each k in tabs.keys Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = k next k 

循环只遍历键。 没有必要检查重复的条目,因为所有的唯一键将被定义和列出一次!

要做到这一点与数组,你会想:

  • 声明一个dynamic的string数组
  • 为添加的元素数量声明一个计数器
  • 将数组的大小设置为可能的最大值
  • 将元素分配给数组,每增加一个计数器
  • 使用计数器值调整数组大小(或者在访问数组时testing空元素)

在可以翻译成如下代码的代码中:

 Dim Tabs() as String Dim counter As Long ... Redim Tabs(0 to Lastrow) counter = 0 ... While ... Select Case .Range("A" & lrow).Value Case 30 To 39 Mainsheet = True Tabs(count) = "Main" ... Case Else counter = counter - 1 End Select counter = counter + 1 ... Wend If Not counter = 0 Then Redim Preserve Tab(0 to counter - 1) ... 'create worksheets using Tabs(), etc. ... End If