希望有人可以帮助解决一个令人费解的问题。
我有一个excel工作表,其中有很多行需要移动到不同的工作表。
我有一个select case语句,它将3个变量设置为true或false,具体取决于第一列中的数字是否与case语句匹配。这工作正常但我现在想要为数组添加名称,如果值为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
所以我想知道的是如何将片材名称添加到数组中,但前提是选择案例中的值为真。
非常感谢任何帮助。
由于
答案 0 :(得分:2)
为什么不使用工作表功能' CountIfs '?
它依赖于多个条件,您不需要任何循环,因此您的代码可以更快地运行。
CountIfs (testsRange,“> = 30”,testsRange,“< = 39”)
...计算'testedRange'中的值的数量,其中> = 30且< = 39。如果至少有一个,那么只需添加您的工作表,就是这样。没有循环,没有数组,不需要额外的变量。 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
答案 1 :(得分:1)
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
页面创建循环看起来像这样
for each k in tabs.keys
Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = k
next k
循环仅遍历键。无需检查重复的条目,因为所有唯一键都将被定义并仅列出一次!
答案 2 :(得分:0)
要使用您想要的数组执行此操作:
在代码中可以转换为:
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