транспонирование при импорте или при присвоении массива

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

транспонирование при импорте или при присвоении массива

Сообщение Avtopic » 14.01.2007 (Вс) 17:52

Здравствуйте!

У меня такой вопрос если можно:

Arre_x это массив Variant.

1. CopyFromRecordset при 43 000 записях очень быстро...
но, по определенным причинам меня не устраивает.

2. Arre_x =...GetRows тоже быстро...
3. Range...= Arre_x тоже быстро...

For... Next очень медленно.
А проблема в том что, нужно транспонировать Arre_x, так как Arre_x =...GetRows не совпадает (row, column) c Range...= Arre_x.

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

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 15.01.2007 (Пн) 11:05

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

И вообще, речь об Excel идет?
Быть... или не быть. Вот. В чём вопрос?

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Сообщение Genyaa » 15.01.2007 (Пн) 11:45

uhm писал(а):Не очень понял, честно говоря, постановку задачи, но не получится ли сначала быстро импортировать, а потом транспонировать уже?

И вообще, речь об Excel идет?


Судя по словами - "записи" и "Range" - вроде да, про Ексел... но транспонировать (сделать строки столбцами) таблицу из 43000 строк... в Екселе не получится... не позволит Ексел столько колонок сделать... даже в 2007-м это вроде не получится (там, как я слышал, до 32000 колонок)... Извините, если я не прав.
Всякое решение плодит новые проблемы.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 15.01.2007 (Пн) 16:19

uhm писал(а):там, как я слышал, до 32000 колонок

Ну где-то в этом районе, но если точно, то 16.384 :D

Если все-таки нужно транспонировать recordset <=16.384 строк и речь таки об Excel, то можно попытаться сделать это с пом. функции TRANSPOSE. Что-то в этом роде:
Код: Выделить всё
MyRange=Application.Transpose(rs.GetRows)


Если перед транспонированием нужно выбрать отдельный столбец (и, по какой-то причине, этого нельзя задать с пом. инструкции SQL при запросе), то можно использовать функцию INDEX. Что-то в этом роде:
Код: Выделить всё
With Application
     MyRange=.Transpose(.Index(rs.GetRows,0,3))
End With

Если речь не об Excel, то можно использовать одно из привязываний для вызова функций (Late / Early Binding)
Привет,
KL

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.01.2007 (Пн) 18:22

Это все об Екселе 2000.

KL, вы случайно не знаете? Эта функция,
KL писал(а):
Код: Выделить всё
MyRange=Application.Transpose(rs.GetRows)
как не странно работает до 5462 :!: :?: записей, если в sql происходит выборка одного поля,
для двух полей до 5462 / 2, для трех - 5462 / 3 и т.д.

ну, и соответственно
Код: Выделить всё
MyRange=Application.Transpose(Arre_x)
для двухмерного массива вторим измерением 1 - 5462 / 2, вторим измерением 2 - 5462 / 3.
откуда это число 5462.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.01.2007 (Вт) 10:46

Avtopic писал(а):Это все об Екселе 2000.

KL, вы случайно не знаете? Эта функция,
KL писал(а):
Код: Выделить всё
MyRange=Application.Transpose(rs.GetRows)
как не странно работает до 5462 :!: :?: записей, если в sql происходит выборка одного поля,
для двух полей до 5462 / 2, для трех - 5462 / 3 и т.д.

ну, и соответственно
Код: Выделить всё
MyRange=Application.Transpose(Arre_x)
для двухмерного массива вторим измерением 1 - 5462 / 2, вторим измерением 2 - 5462 / 3.
откуда это число 5462.


По-моему проблема в данных или в том, как получен recordset или в том, как заданы размеры массива, но могу ошибаться. Подобных проблем с Excel 2000 не припомню, но правда уже года три как с ним дела не имею - все больше Excel 2003, а сейчас 2007. Следующий код в Excel 2003 отрабатывает корректно:

Код: Выделить всё
Sub test()
    Dim mtx(1 To 50000) As Long, i As Long
    For i = 1 To 50000
        mtx(i) = i
    Next i
    [A1:A50000] = Application.Transpose(mtx)
End Sub
Привет,
KL

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.01.2007 (Вт) 13:18

Да, только что проверил, в 2002-ом работает, в 2000 (во всяком случае, маем), не работает.
Выше 5462 не работает (Вернее, выше 5461).

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.01.2007 (Вт) 13:30

Avtopic писал(а):Да, только что проверил, в 2002-ом работает, в 2000 (во всяком случае, маем), не работает.
Выше 5462 не работает (Вернее, выше 5461).


Да вот нашел: http://support.microsoft.com/kb/246335/el

If you decide to use Excel's Transpose method instead of the TransposeDim() function to transpose the array, you should be aware of the following limitations with the Transpose method: • The array cannot contain an element that is greater than 255 characters.
• The array cannot contain Null values.
• The number of elements in the array cannot exceed 5461.
Привет,
KL

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.01.2007 (Вт) 15:58

Спасибо за помощь!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 114

    TopList