使用select case添加到数组

时间:2013-08-06 16:11:42

标签: excel vba excel-vba

希望有人可以帮助解决一个令人费解的问题。

我有一个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

所以我想知道的是如何将片材名称添加到数组中,但前提是选择案例中的值为真。

非常感谢任何帮助。

由于

3 个答案:

答案 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