2017-02-21 23 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, если я сделал цикл для lbound для 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 «Total is:» & arr (j). – Dalton

ответ

0

Подход, который я бы использовал, заключается в том, чтобы хранить данные в словаре вместо массива.

Использование словаря будет быстрым, чтобы выполнять поиск на основе ключа, и вы можете сделать ключ почти тем, что хотите однозначно идентифицировать итоговые значения. Это, скорее всего, (я думаю) будет более символичным и понятным, чем номер индекса в массиве.

Листовой я установки в качестве теста (на Лист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 

Результаты в окне Immediate:

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

Диапазоны также могут быть переменными. –

 Смежные вопросы

  • Нет связанных вопросов^_^