Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > vb Excel


Автор: Sergmugb 29.4.2005, 03:24
Люди подскажите, как результат запроса передать в excel, да так чтобы передача велась быстро, не могу придумать.
Смысл такой: выполнил запрос, получил выборку в (rszapr) и теперь все от туда надо в ексель запихать.
Я это реализовал через 2 цикла, полюс ко всему сначала отображаю выборку в датагрид и оттуда по 1 ячейке выгребаю, это долго.
Знаю что есть метод побыстрее, но вот какой?

Автор: Paradox 29.4.2005, 10:44
а поконретнее можно ?
данные чтоли выгребаешь откуда то и надо засандалить в Excel ?

тогда можно зацепится к Excel через ADO например и наколбасить туда
если в этом дело могу и поподробнее

Автор: Papirus 29.4.2005, 11:18
Если сформирован адо.рекордсет, то для вставки данных в ексель можно использовать метод CopyFromRecordset объекта Range.

Код

Workbooks(1).Sheets(1).Range("A1").CopyFromRecordset  rszapr

Автор: Flotskiy 29.4.2005, 15:20
Добрый день всем!
Вот код на данную тему:
Код


Private Sub cmdForma4_Click()
On Error Resume Next
Dim iIndx As Integer
Dim iRowIndex As Integer
Dim iColIndex As Integer
Dim iRecordCount As Integer
Dim iFieldCount As Integer
Dim sMessage As String
Dim avRows As Variant
Dim excelVersion As Integer

Dim sSqlString As String

Set adoConnection = New ADODB.Connection
Set adoRecordset = New ADODB.Recordset

connectString = "Provider=Microsoft.Jet.OLEDB.3.51;" _
                 & "Data Source=" & gDataBaseName '(это путь к БД или пример:  "C:\BIBLIOTEKA\BDanny\Bibliot.mdb") 
                 
sSqlString = "SELECT (Autor & ' ' & PodRed & ' ' & Title & ' ' & PlassPubl & ': ' & " & _
             " Publishes & ', ' & DatPubl) AS Nazvanie, AmountCopy " & _
        "FROM Titles WHERE InventNumber =" & Text2.Text

adoConnection.Open connectString
adoRecordset.CursorLocation = adUseClient
adoRecordset.Open sSqlString, adoConnection

'-- Read all of the records into our array
avRows = adoRecordset.GetRows()

'-- Determine how many fields and records
iRecordCount = UBound(avRows, 2) + 1
iFieldCount = UBound(avRows, 1) + 1

'-- Create reference variable for the spreadsheet
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Open "C:\Мои документы\Ф4\Форма4" 'открывается существующий файл
' еслинужен файл новый открыть то-
' objExcel.Workbooks.Add 
'-- We need this line to insure Excel remains visible if we switch
Set objTemp = objExcel

excelVersion = Val(objExcel.Application.Version)
If (excelVersion >= 8) Then
 Set objExcel = objExcel.ActiveSheet
End If

'-- Place the names of the fields as column headers --
iRowIndex = 1
iColIndex = 1
For iColIndex = 1 To iFieldCount
  With objExcel.Cells(iRowIndex, iColIndex)
     .Value = adoRecordset.Fields(iColIndex - 1).Name
     With .Font
       .Name = "Arial"
       .Bold = True
       .Size = 9
     End With
  End With
Next
'-- memory management --
adoRecordset.Close
adoConnection.Close
Set adoRecordset = Nothing
Set adoConnection = Nothing

'-- Just add data --
With objExcel
  For iRowIndex = 2 To iRecordCount + 1
   For iColIndex = 1 To iFieldCount
    .Cells(iRowIndex, iColIndex).Value = avRows(iColIndex - 1, iRowIndex - 2)
   Next
  Next
End With
objExcel.Cells(1, 1).CurrentRegion.EntireColumn.AutoFit

End Sub


Код рабочий, подстраивай.

PS. Посмотри раздел "Ссылки на интересные сайты", ссылка на сайт "dmk", там есть готовые примеры (зтот код оттуда).
С уважением

Автор: Sergmugb 3.5.2005, 04:52
Спасибо, попробую.

Автор: Papirus 3.5.2005, 12:05
Цитата(Flotskiy @ 29.4.2005, 15:20)
Вот код на данную тему:


И не влом в циклах массивы перелопачивать? Если надо выборочно - то понимаю, если не надо, то что ж не нравиться во вставке одним оператором? работает на порядок быстрее (проверено). smile

Автор: Gannibal 3.5.2005, 16:29
http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/Excel/383.mspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)