2017-02-21 48 views
0

我有一個快速問題,我希望熟悉數組的人都能輕鬆回答。具有(1)值的動態數組 - VBA Excel

我已經有了一個由不同數目的空格分隔的列。我有程序添加數字。當它遇到一個空單元格時,它應該將該數字添加到數組中,通過(1)增加數組中的空格數量,並將總計數器設置回零,然後跳到循環的下一次迭代,開始計數直到再次遇到空格。隨着時間的推移,會有不同數量的清單。我不認爲會有超過3-4個,但如果將來還有更多的話,我想編程來處理它。

因此,例如,單元格C4:C10包含的數字合計爲200,則單元格C11爲空。單元格C12:C14包含的數字合計爲150.我希望該數組在第一個點存儲200個,第二個點存儲150個數字。然後我想要消息框彈出告訴我「列表1是200」,列表2是150「等...

現在,我得到下標越界,但我認爲這是因爲我沒有聲明數組的大小,我希望它是動態的,但我不知道如何讓一個數組只包含(1)槽,它總是類似於arr(0到1)。在我看到的例子中只看到一個值,而且因爲它在for循環中,所以如果我做了一個用於綁定到ubound的循環,我想它會像「List 1 is 200」,「List 2是「沒有價值的第二個,因爲沒有數據,如果只有一個列表。

我可能會在想這個或以錯誤的方式去做,但我從來沒有真正使用過數組。我認爲這將有助於這個計劃。感謝您的任何幫助,您可以提供。

我打算提供下面的混亂。我還沒有清理過這個問題,並對它進行了評論,但是,你可以問問你是否有問題。我確信我做錯了,我只是想告訴你我要去哪裏。

Private Sub cmdTest_Click() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim intCounter As Integer 
    Dim intValue As Integer 
    Dim strCell As String 
    Dim arr() As Long 
    Dim intArr As Integer 

    Set wb = Application.Workbooks("ListTotal.xlsm") 
    Set ws = wb.Worksheets("Main") 

    Call LastRowWithData_xlUp_1(lastColRow) 

    MsgBox "Number of lists is: " & WorksheetFunction.CountIf(Range("C3:C" & lastColRow), "") + 1 

    Call FindLastRow(LastRow) 

    'Count pages left in each series 
    intValue = 0 

    'set number of values in array 
    intArr = 1 

    For i = 3 To LastRow 

      strCell = "C" & i 

     If Range(strCell) = "" Then 
      arr(0) = intValue 
      intValue = 0 
      GoTo NextIteration 
     End If 

       openingParen = InStr(Range(strCell), "[") 
       closingParen = InStr(Range(strCell), "]") 
       enclosedvalue = Mid(Range(strCell), openingParen + 1,    closingParen - openingParen - 1) 
       intValue = intValue + enclosedvalue 
       MsgBox "The number of pages in this book is: " & enclosedvalue 

     NextIteration: 
     MsgBox "The total pages left in the series is: " & intValue 

    Next 

    For i = LBound(arr) To UBound(arr) 
     MsgBox ("The number of pages left in Series " & j & " is:") 'arr(i)) 
    Next i 

End Sub 
+0

這聽起來像你需要調整數組的大小。你可以通過使用'Redim'來實現。像'Redim Arr(99)'這樣的東西可以將1維數組放大100個空元素。你是否想要每行有足夠的空間?如果是這樣,你可以使用LastRow,儘管我沒有看到聲明的位置。 –

+0

嘿瑞恩。是的,我確實看到了如何調整它的大小。我可以使用Redim Preserve Arr。我沒有保存每一行。我總計每個列表並將總數保存在數組中。我的想法是,我可以遍歷數組並顯示每個總數。所以,如果我有3個列表,我可以做一個循環,在那裏我得到數組的ubound並且從j = 1到ubound,msgbox「總數是:」&arr(j)。 – Dalton

回答

0

我使用的方法是將數據存儲在字典而不是數組中。

使用字典可以快速執行基於鍵的查找,並且幾乎可以根據您想要的鍵來唯一標識總計。這可能(我認爲)比數組中的索引號更具象徵性且易於理解。

我設置作爲測試(Sheet 1上)的片材:

Spreadsheet

這裏的示例代碼:

Option Explicit 

Public Sub Example() 
    Dim myDict As Object: Set myDict = CreateObject("Scripting.Dictionary") 
    Dim i As Long 

    'Add data to a dictionary 
    With myDict 
     'the first parameter is a unique key that identifies the record 
     'the second parameter is the value 
     'Remember to change the range reference 
     .Add "the Range A1:A5", WorksheetFunction.Sum(Range("Sheet1!A1:A5")) 
     .Add "the Range B1:B5", WorksheetFunction.Sum(Range("Sheet1!B1:B5")) 
     .Add "the Range C1:C5", WorksheetFunction.Sum(Range("Sheet1!C1:C5")) 
    End With 

    'Iterate the dictionary and return the key and value 
    For i = 0 To myDict.Count - 1 
     Debug.Print "The sum is: " & myDict.items()(i) & " for Key: " & myDict.keys()(i) 
    Next i 
End Sub 

結果立即窗口:

The sum is: 6 for Key: the Range A1:A5 
The sum is: 5 for Key: the Range B1:B5 
The sum is: 12 for Key: the Range C1:C5 
+0

瑞恩,我的範圍是可變的。列表長度有所不同。 – Dalton

+0

範圍也可以是變量。 –