Вам не нужно это oop. Сначала задайте типы переменных.
Dim arrValue as Variant, lr as long
Раз это вариант, вы можете просто получить массив из диапазона за один go, транспонировав его:
lr = src.Worksheets("Sheet1").range("D" & rows.count).end(xlup).row
Application.transpose(src.Worksheets("Sheet1").range("D4:D" & lr))
Если вам нужно к l oop значениям в массиве позже вы просто делаете что-то вроде этого:
Dim X as long
For X = lbound(arrValue) to ubound(arrValue)
msgbox arrValue(X)
next
Я, однако, отмечаю, что в своем вопросе вы говорите, что хотите извлечь данные из ЗАКРЫТОЙ рабочей книги, но ваш код открывается книга. Существуют способы извлечения данных непосредственно из закрытой книги, но это будет сложно, поскольку вы не знаете, сколько строк будет без открытия книги. Если вам абсолютно необходимо оставить книгу закрытой, отправьте сообщение обратно.
Я также отмечаю, что вы используете ячейки (4 и iCnt) для заполнения массива, вы точно знаете, что это просто ячейка, считающая слева направо прямо тогда грести? другими словами, ячейки (2) - это В1, а ячейки (16386) - это В2. Вы должны использовать ячейки (Row, Column). Я думаю, что из того, что вы сказали, вы хотите увеличить строку, но если нет, то отправьте обратно, мы просто дважды транспонируем, если это столбцы, а не строки.