Excel VBA: есть ли динамический массив, который можно использовать для дат?

Я работаю над макросом Excel и хочу создать массив дат, а затем прокрутить его, не зная, сколько дат будет добавлено. Я думал, что это будет просто, но я не могу заставить его работать.

Я попытался использовать коллекцию:

Dim DateArr As Collection
Dim d As Date

Set DateArr = New Collection

DateArr.Add (CDate("1/1/2019"))
DateArr.Add (CDate("2/2/2020"))

For Each d In DateArr
    sh.Cells(y, 27).Value = d
Next d

Но я получаю сообщение об ошибке «Для каждой управляющей переменной должно быть значение Variant или Object» и выделяет d в моем цикле. Разве даты не объекты?

Я также пробовал вариант:

Dim DateArr As Variant
DateArr.Add CDate("2/2/2020")
DateArr(1) = CDate("1/1/2019")

Но я не могу найти правильный синтаксис для добавления даты. Строка .Add выдает ошибку «Требуется объект», а строка DateArr(1)= выдает ошибку «Несоответствие типов».

Единственное, что работает, это стандартный массив:

Dim DateArr() As Date
Dim y As Integer
ReDim DateArr(1 To 2) As Date

DateArr(1) = CDate("1/1/2019")
DateArr(2) = CDate("2/2/2020")

For y = LBound(DateArr) To UBound(DateArr)
    sh.Cells(y, 27).Value = DateArr(y)
Next y

Но я понятия не имею, сколько дат будет в массиве, поэтому не могу использовать что-либо статичное. Есть ли способ использовать тот же синтаксис без установки размеров?

Спасибо!


person James Dolan    schedule 01.10.2019    source источник
comment
Я бы использовал коллекции, а затем изменил d на вариант.   -  person Brian M Stafford    schedule 01.10.2019
comment
Возможно, вы просто захотите использовать что-то вроде sh.Cells(y, 27).Value = Format(DateArr(y),"yyyy-mm-dd"). Как вы будете вытягивать информацию? Вручную добавлять даты в код, вытягивать из диапазона на листе и т. д.?   -  person Cyril    schedule 01.10.2019
comment
@BrianMStafford, это работает! По крайней мере, для моего небольшого тестового примера. Скрестим пальцы, это работает для моей главной цели.   -  person James Dolan    schedule 01.10.2019
comment
@ Кирилл, я мог бы быть более ясным, что это был просто тестовый пример. Мой фактический вариант использования: у меня есть электронная таблица людей и выходных, когда они будут на связи. Я пытаюсь перебрать каждую строку, создать объект (пользовательский класс) для каждого человека, а затем сохранить их даты вызова в коллекции, связанной с моим классом, и выполнить некоторую логику по датам. Я застрял, когда не смог создать коллекцию дат.   -  person James Dolan    schedule 01.10.2019
comment
@JamesDolan, если вы относитесь к этому как к стандартному массиву, вы можете просто захватить весь диапазон, например dim arr as variant // arr = range(cells(1,1),cells(lr,3)).value. Вы должны сохранить исходную дату как дату, независимо от добавления этих данных в другом месте или использования их в формулах. Вам не нужно зацикливаться для создания массива, если только вы не хотите создать словарь для уникальных дат.   -  person Cyril    schedule 02.10.2019


Ответы (1)


Даты - это варианты, а не объекты

Добавить для коллекций — это метод. В своем коде вы предположили, что это функция, и добавили ненужные круглые скобки, например.

DateArr.add cdate("1/1/2019")

Чтобы использовать For Each, индексирующая (управляющая) переменная должна быть объектом или вариантом.

Таким образом, ваш первый пример должен работать нормально (не считая других ошибок), если вы затемняете d как вариант.

person freeflow    schedule 01.10.2019