2

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

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

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

选择案例语句如下:

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

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

任何帮助将非常感激。

谢谢

4

3 回答 3

2

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

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

CountIfs (testedRange, ">=30" ,testedRange, "<=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
于 2013-08-06T19:23:32.343 回答
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

循环仅遍历键。无需检查重复条目,因为所有唯一键将仅定义和列出一次!

于 2013-08-06T16:23:25.063 回答
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
于 2013-08-06T17:56:18.630 回答