VB6 + Exlel помогите разобраться

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

VB6 + Exlel помогите разобраться

Сообщение Dimon111 » 28.01.2008 (Пн) 22:32

Передача массива в столбец Exel

Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object

'Открыть новую книгу Excel
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add

'Создать массив с 3 столбцами и 100 строками
Dim DataArray(1 To 100) As Single
Dim r As Integer
For r = 1 To 100
DataArray(r) = Rnd() * 1000
Next

'Добавить заголовки в строку 1
Set oSheet = oBook.Worksheets(1)
oSheet.Range("A1:C1").Value = Array("Order ID", "Amount", "Tax")

'Передать массив на лист, начиная с ячейки A2
oSheet.Range("A2").Resize(100, 1).Value = DataArray

'Сохранить книгу и закрыть Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit

В результате столбец А (все 100 ячеек) заполняется ОДНИМ (первым) значением массива.
Если переписать строку:
oSheet.Range("A2").Resize(100, 1).Value = DataArray
на
oSheet.Range("A2").Resize(1, 100).Value = DataArray

То СТРОКА заполняются РАЗНЫМИ значенииями.

Если массив сделать двухмерный, то столбцы заполняются правильно.

Где грабли?
Спасибо.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 29.01.2008 (Вт) 17:02

а почитать и поэксперементировать нельзя???

Код: Выделить всё
Sub dg()
Dim i As Long, j As Long
Dim m(10, 10) As Long
For i = 1 To 10
    Cells(1, i).Value = i
    For j = 1 To 10
        m(i, j) = j
    Next j
Next i
Dim v() As Variant
v = Range("a1:j1").Value
Range("a3:j13").Value = m
End Sub
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 29.01.2008 (Вт) 21:06

Большое спасибо. Работает. Но это медленный способ. Я пытался передавать сразу массив. Одномерный массив заполняет строку в Excel, а надо столбец.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 30.01.2008 (Ср) 9:54

что значит медленно???
это всяко быстрее чем заполнять поячеечно.
ну а подумать и сделать двухмерный массив, например так:
Код: Выделить всё
Sub dg1()
Dim i As Long, j As Long
Dim m(1 To 10, 1 To 1) As Long
For i = 1 To 10
    For j = 1 To 1
        m(i, j) = i
    Next j
Next i
Dim v() As Variant
Range("a3:a12").Value = m
End Sub
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 30.01.2008 (Ср) 10:32

Это тоже работает.

Не совсем понятно зачем нужна строка
Dim v() As Variant

Несколько не вписывается в мою задачу. У меня есть два массива.
Измерения и время этого измерения. Оба массива одномерные. Размер заранее не определен, но к моменту работы с Excel уже известен. То есть он может быть и 3 и 300 000 элементов.

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

Но тут я напоролся на грабли:
Dim DataArray(1 To UBound(BufferIZM), 1 To 2) As Variant
Размерность принимающего двухмерного массива должна быть строго определена.

Как сложить два массива в третий?

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 30.01.2008 (Ср) 10:48

Не совсем понятно зачем нужна строка
Dim v() As Variant

это недоудалял от предыдущего примера

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

вот ты пишеш:
'Создать массив с 3 столбцами и 100 строками
Dim DataArray(1 To 100) As Single
Dim r As Integer
For r = 1 To 100
DataArray(r) = Rnd() * 1000
Next

а создаеш одномерный массив
перепиши как
Код: Выделить всё
'Создать массив с 3 столбцами и 100 строками
Dim DataArray(1 To 100, 1 to 1) As Single
Dim r As Integer
For r = 1 To 100
DataArray(r, 1) = Rnd() * 1000
Next

и потом так:
Код: Выделить всё
'Передать массив на лист, начиная с ячейки A2
oSheet.Range("A2:A101").Value = DataArray

то-же сделать и для второго массива
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Заработало.

Сообщение Dimon111 » 30.01.2008 (Ср) 11:47

Получилось:
'Искусственное заполнение массива измерений и времени
For i = 0 To 101
ReDim Preserve BufferIZM(i)
ReDim Preserve BufferT(i)
BufferIZM(i) = Rnd() * 1000
BufferT(i) = Time
Next

Set iXLApp = CreateObject("Excel.Application")
With iXLApp
.DisplayAlerts = False 'Подавление сообщения о замене файла при сохранении
With .Workbooks.Add(-4167).Worksheets(1)
.Range("A1:B1").Value = Array("Измерение", "Время измерения")
.Columns("A").ColumnWidth = 20
.Columns("B").ColumnWidth = 20
.Columns("A").Font.Bold = True 'шрифт
'.Columns("A").VerticalAlignment = xlVAlignCenter
'.Columns("B").VerticalAlignment = xlVAlignCenter
.Columns("A").WrapText = True 'перенос по словам
.Columns("B").WrapText = True 'перенос по словам
.Range("A2").Resize(UBound(BufferIZM)).Value = iXLApp.Transpose(BufferIZM)
.Range("B2").Resize(UBound(BufferIZM)).Value = iXLApp.Transpose(BufferT)
.SaveAs FileName:="C:\Book1.xls"
End With
.DisplayAlerts = True
.Visible = True
'.Quit

Не прошли 2 строки:
'.Columns("A").VerticalAlignment= xlVAlignCenter
'.Columns("B").VerticalAlignment = xlVAlignCenter
Пишет, что к объекту нельзя применять такие свойства. Но это уже мелочи.

Буду весьма благодарен, если ткнете в меня ссылкой - где можно подробней почитать про свойства VerticalAlignment и им подобные. Чтобы не надоедать дурацкими вопросами
Спасибо.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 30.01.2008 (Ср) 11:54

запиши макрос и посмотри :wink:
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч


Вернуться в Visual Basic 1–6

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

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

    TopList