添加到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