В своей проге мне необходимо выводить текст в Word в виде таблицы. Подключаю Microsoft Word 9.0 Object Library и делаю примерно так:
Option Explicit
Public Sub main()
Dim appWord As New Word.Application
Dim doc1 As Word.Document, range1 As Word.Range
Dim table1 As Word.Table, row1 As Row
Dim t0 As Long
Set doc1 = appWord.Documents.Add
t0 = Timer
Set range1 = doc1.Range(0, 0)
Set table1 = doc1.Tables.Add(range1, 100, 5)
table1.Borders.Enable = False
For Each row1 In table1.Rows
row1.Cells(1).Range.Text = row1.Index
row1.Cells(2).Range.Text = row1.Index
row1.Cells(3).Range.Text = row1.Index
row1.Cells(4).Range.Text = row1.Index
row1.Cells(5).Range.Text = row1.Index
Debug.Print row1.Index
DoEvents
Next row1
appWord.Visible = True
Debug.Print Timer - t0
End Sub
На PIII 650 МГц этот код выполняется около 12 сек, если сделать таблицу 255x5, то около 50 сек. Причём основное время уходит на присвоение значений ячейкам.
Можно ли как-то ускорить этот процесс?
Если нельзя, то есть ли какие-нибудь библиотеки/классы для экспорта в Word (*.doc)?
Или, как вариант, сделай из всех данных одну большую строку, между столбцами табуляторы, между строками enter'ы. Вставь её в word, потом вызови range.converttotable(vbtab)
Благодаря вот такому коду удалось достичь 9 сек на 100 строках и 35 сек на 255, но всё равно скорость остаётся неприемлимой.
Option Explicit
Public Sub main()
Dim appWord As New Word.Application
Dim doc1 As Word.Document, range1 As Word.Range
Dim table1 As Word.Table, row1 As Row
Dim t0 As Long, i As Long
Set doc1 = appWord.Documents.Add
t0 = Timer
Set range1 = doc1.Range(0, 0)
Set table1 = doc1.Tables.Add(range1, 100, 5)
table1.Borders.Enable = False
For i = table1.Rows.Count To 1 Step -1
Set row1 = table1.Rows(i)
Set range1 = row1.Cells(5).Range
range1.Text = row1.Index
range1.SetRange range1.Start - 1, range1.Start - 1
range1.Text = row1.Index
range1.SetRange range1.Start - 1, range1.Start - 1
range1.Text = row1.Index
range1.SetRange range1.Start - 1, range1.Start - 1
range1.Text = row1.Index
range1.SetRange range1.Start - 1, range1.Start - 1
range1.Text = row1.Index
 ebug.Print row1.Index
 oEvents
Next i
appWord.Visible = True
Debug.Print Timer - t0
End Sub