VBA конвертировать диапазон в массив и формат даты - PullRequest
0 голосов
/ 30 ноября 2011

Я борюсь с преобразованием в массив в VBA:

Dim list As Range
Set list = Range(series, series.End(xlDown))
list.Select
Dim table() As Variant
Set table = list.value

Насколько я понимаю, value возвращает массив, верно? Я не понимаю, почему VBA говорит мне, что я "can't assign to array".

Мой диапазон list выглядит так же, как в Excel на Select, и я стремлюсь иметь его в виде массива, чтобы можно было форматировать даты, используя что-то вроде Format(table.Rows(i).Columns(1).value, "yyyy-mm-dd"), зацикливаясь на моей таблице.

02-Sep-09   1.00
18-Sep-09   1.00
16-Oct-09   1.00
20-Nov-09   1.00
18-Dec-09   1.00
19-Mar-10   1.00
18-Jun-10   1.00

Кстати, можно ли изменить таблицу на месте?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 30 ноября 2011

Здесь есть ряд проблем.

Задача 1

Set table = list.value

Таблица не является объектом, поэтому вы не можете установить его. Попробуйте:

table = list.value

Задача 2

series - это ключевое слово VBA, связанное с диаграммами. Пожалуйста, выберите имя, например MyWSTable, которое ничего не значит для VBA.

Задача 3

Имя рабочего листа само по себе не является диапазоном. Попробуйте:

Dim Table() As Variant
Table = Names("MyWSTable").RefersToRange.Value

Примечание: вам не нужен список переменных, и вам не нужно выбирать диапазон.

Ответ на вопрос о форматировании

Следующий код переформатирует ваши даты:

For inxrow = 1 To UBound(Table, 1)
  For inxcol = 1 To UBound(Table, 2)
    Table(inxrow, 1) = "ddd d mmm yyyyy"
    Table(inxrow, 2) = ""
  Next
Next

Names("MyWSTable").RefersToRange.NumberFormat = Table
2 голосов
/ 30 ноября 2011

Вы можете удалить свой выбор: list.Select

Чтобы убедиться, что вы не получите ошибок при назначении диапазона массиву, вам лучше объявить ваш массив как вариант:

Dim table As Variant
table = Range(series, series.End(xlDown)).Value
1 голос
/ 30 ноября 2011

Это сообщение об ошибке появляется, потому что вы используете SET для заполнения массива.Удалите SET и он должен загрузиться.

Вы можете напрямую заполнить массив следующим образом:

Dim table() As Variant
table=Range(series, series.End(xlDown))

Пропуск шага Выбор делает ваш код более безопасным и быстрым.

К сожалению, вы не можете загружать значения напрямую как даты.Вам придется зацикливать каждый элемент массива и превращать их в дату.

0 голосов
/ 30 ноября 2011

Вы делаете это неправильно. Вы должны использовать свойство NumberFormat диапазона, чтобы указать формат отображения. Как то так:

Range("A:A").NumberFormat = "yyyy-mm-dd"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...