@ GSerg упомянуто правильно
«Вы не создаете массив c stati внутри PopulateStaticArray. Если вы хотите передать уже существующий массив в InsertMonthsArray (), независимо от того, откуда он , тогда да, это должен быть Sub InsertMonthsArray (months () as string) "
Вам нужно передать ваш массив - объявленный на уровне процедуры - как (неявный) ByRef
аргумент, что означает, что вы можете присвоить названия месяцев каждому элементу массива в пределах вызываемой подпроцедуры createMonths
, чтобы вызывающая процедура могла фактически использовать их, например, для записи их в вертикальный диапазон (например, начиная с ячейки A7
).
Option Explicit ' declaration head of code module
Sub PopulateMonthArray()
'[0] declare array at procedure level
Dim months(11) As String ' equals Dim months(0 to 11)
'Dim months(1 To 12) As String ' alternative: declare a 1-based array
'[1] fill array items with month names passing array as (implicit) ByRef argument
createMonths months ' << call sub createMonths
'[2] write 1-dim array vertically to sheet (transposing output from a "flat" to a 2-dim array)
Sheet1.Range("A7").Resize(Rowsize:=12).Value = Application.Transpose(months)
End Sub
Подпроцедура createMonths
Поскольку вы определяете массив на основе 0 months(0 To 11)
и количество месяцев обычно от 1 до 12, я добавил функциональность чтобы также можно было создать массив на основе 1.
Sub createMonths(months) ' equals Sub createMonths(ByRef months)
Dim countOffset As Long
countOffset = IIf(LBound(months), 0, 1) ' allow calculation of 0-based AND 1-based arrays
Dim i As Long
For i = LBound(months) To UBound(months) ' loop through each array element
months(i) = Application.Text(DateSerial(0, i + countOffset, 1), "mmmm")
Next i
End Sub
Простая альтернатива / Редактировать 2020-05-27
Если ваш намерение, однако, сделать ваши месяцы y доступен в других процедурах без необходимости объявлять его в каждой процедуре (ни в глобальной области, ни в определении класса), вы можете просто воспользоваться простым обходным путем : вставить Property Get
также можно использовать в стандартных модулях - не только в модулях классов, кстати. - Но учтите, что вы на самом деле не сохраняете («сохраняете») массив, вы бы перестроили его и, возможно, в более удобочитаемом виде.
Public Property Get Months()
Dim tmp(1 To 12) ' I'd prefer a 1-based months array :-)
createMonths tmp ' use the same procedure as above (or rebuild it code)
Months = tmp ' return the Get value
End Property
Sub AnyOtherProcedure()
'no further declaration needed
Debug.Print Months(1) ' ~> January
Debug.Print Join(Months, ", ") ' ~> January, February, ..., December
End Sub