2013-08-06 42 views
2

希望有人可以幫助解決一個令人困惑的問題。添加到選擇案例的陣列

我有一個excel工作表,有很多行需要移動到不同的工作表。

我有一個select case語句,根據第一列中的數字是否匹配case語句,將3個變量設置爲true或false。這工作正常,但我現在想要爲數組添加名稱,如果該值爲true。

的選擇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到數組,但只有在選擇時的值爲true。

任何幫助將不勝感激。

謝謝

回答

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 
+0

謝謝丹尼爾這工作一個款待 – Gazza

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 

該循環僅遍歷鍵。沒有必要檢查重複的條目,因爲所有唯一的鍵將被定義並且只列出一次!

+0

如果'tabs'集合將以這種方式使用,那麼它恐怕無法正常工作。集合可以多次包含相同的字符串。例如。在單元格'a1'中爲'35',在'a2''36'中,然後'Main'將被添加兩次...並且下一個for循環將無法添加具有相同名稱的工作表。 – dee

+0

因此,將項目添加到選項卡集合只有一次:如果(MainSheet = False)然後tabs.Add「Main」 MainSheet = True – dee

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