Страница: 1 | 2 |
|
Вопрос: Работа с word.
|
Добавлено: 29.07.06 22:56
|
|
Автор вопроса: KVU
|
В общем, создаю таблицу на основе ListView
Код:
--------------------------------------------
Dim WordApp As Word.Application
Dim DocWord As Word.Document
Dim TableWord As Word.Table
Dim iColumn As Integer
Dim iRow As Integer
iColumn = lvwReport.ColumnHeaders.Count ' Кол-во колонок
iRow = lvwReport.ListItems.Count + 1 ' Кол-во строк ListView + заголовок
Set WordApp = New Word.Application
WordApp.Visible = True
Set DocWord = WordApp.Documents.Add
DocWord.Activate
If Check1.Value = 1 Then
DocWord.PageSetup.Orientation = wdOrientPortrait
Else
DocWord.PageSetup.Orientation = wdOrientLandscape
End If
DocWord.Application.Selection.InsertAfter Chr(171) & "RNet" & Chr(187) & " - компьютерная сеть"
DocWord.Application.Selection.EndOf
DocWord.Application.Selection.InsertParagraphAfter
DocWord.Application.Selection.InsertAfter "Краткий отчёт за выполненные работы c: " & DTPicker1.Value & " по: " & DTPicker2.Value
DocWord.Application.Selection.EndOf
DocWord.Application.Selection.InsertParagraphAfter
DocWord.Application.Selection.InsertParagraphAfter
' Создаём таблицу
Set TableWord = DocWord.Tables.Add(DocWord.Application.Selection.Range, iRow, iColumn)
TableWord.Application.Selection.SplitTable
' Заполняем папку таблицы
For i = 1 To iColumn
TableWord.Cell(1, i).Range.Text = lvwReport.ColumnHeaders(i).Text
Next i
For i = 2 To iRow
' Заполняем вторую строку и первый столбец, Вторую потому что 1 это заголовок таблицы
TableWord.Cell(i, 1).Range.Text = lvwReport.ListItems(i - 1).Text
For i2 = 2 To iColumn
' Заполняем вторую строчку и последующие столбцы
TableWord.Cell(i, i2).Range.Text = lvwReport.ListItems(i - 1).SubItems(i2 - 1)
Next i2
Next i
' заголовок таблицы закрашиваем ячейки шрифт делаем жырный
' выравниваем текст по высоте
For i = 1 To iColumn
TableWord.Cell(1, i).VerticalAlignment = wdCellAlignVerticalCenter
TableWord.Cell(1, i).Shading.Texture = wdTextureNone
TableWord.Cell(1, i).Shading.BackgroundPatternColor = wdColorPaleBlue
TableWord.Cell(1, i).Range.Bold = True
Next i
' Выделяем таблицу
TableWord.Application.ActiveDocument.Select
'TableWord.Select
'TableWord.AllowAutoFit = True
' Таблицу выравниваем по центу листа
With TableWord.Application.Selection.Tables(1)
.Rows.Alignment = wdAlignRowCenter
End With
' Автоподбор ячеек по содержимому
Selection.Tables(1).AutoFitBehavior (wdAutoFitContent)
' Автоподбор ячеек по ширине окна
Selection.Tables(1).AutoFitBehavior (wdAutoFitWindow)
' Снимаем выдиление
TableWord.Application.Selection.EndOf
--------------------------------------------
Проблема заключается в том что:
1. При формирования отчёта если не закрывать Word тогда на принимаются свойства ' Автоподбор ячеек по содержимому
Selection.Tables(1).AutoFitBehavior (wdAutoFitContent)
2. Если закрыть Word и повторно формировать отчёт то появляется ошибка:
Run-Time error 462
The remote server machine does not exist or is unavailable
Т.е. отчёт формируется один раз, если полностью закрыть программу и запустишь то он опять сформируется один раз и всё, последующие попытки сформировать отчёт заканчиваются либо ошибкой, либо не форматирует как надо. Да если если запущен совсем другой Word то при попытки сформировать выдаётся ошибка
Run-Time error 5941
Запрашиваемый номер свойства не определен (это Tables(1)) .
Подскажите, пожалуйста, что этот Word так глючит?
С уважением, Владислав.
Ответить
|
Номер ответа: 13 Автор ответа: KVU
Вопросов: 10 Ответов: 32
|
Профиль | | #13
|
Добавлено: 01.08.06 20:16
|
Всель код на ПрограссБар не оброщайте внимания и очень силь не ругайте я же не проффи
Private Sub cmdPrint_Click()
'On Error GoTo ExitSub:
 im Rst1 As ADODB.Recordset
 im Rst2 As ADODB.Recordset
Set Rst1 = New ADODB.Recordset
Set Rst2 = New ADODB.Recordset
 im iProgressBar1 As Integer
 im iProgressBar2 As Integer
 im NameReports As String ' Названия отчёта
 im iColumn As Integer
 im iRow As Integer
If lvwReport.ListItems.Count <= 0 Then
Exit Sub
End If
'FRM_STATUSBAR.Show
'iProgressBar1 = 1
'iProgressBar2 = 1
iColumn = lvwReport.ColumnHeaders.Count ' Кол-во колонок
Set WordApp = New Word.Application
'WordApp.Visible = True
Set DocWord = WordApp.Documents.Add
 ocWord.Activate
 im SumCost As Currency ' Переменная для суммирования стоимости работы без КТУ
 im SumWork As Integer ' Преременная для суммировния выполненных работ
 im SumKTY As Currency ' Переменная для суммирования КТУ
 im AllSum As Currency ' Переменная для итоговой суммы денег
 im AllWork As Currency ' Переменная для итоговой суммы работ
With Rst1
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
End With
With Rst2
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
End With
If Check1.Value = 1 Then
 ocWord.PageSetup.Orientation = wdOrientPortrait
NameReports = "Краткий отчёт за выполненные работы c: "
Else
 ocWord.PageSetup.Orientation = wdOrientLandscape
NameReports = "Полный отчёт за выполненные работы c: "
End If
 ocWord.PageSetup.TopMargin = CentimetersToPoints(1.5)
With DocWord.Application.Selection
.InsertAfter Chr(171) & "RNet" & Chr(187) & " - компьютерная сеть"
.Font.Size = 20
.Font.Bold = True
.Font.Name = "Courier New"
.Paragraphs.Alignment = wdAlignParagraphCenter
.InsertParagraphAfter
.InsertParagraphAfter
.EndOf
End With
With DocWord.Application.Selection
.InsertAfter NameReports & DTPicker1.Value & " по: " & DTPicker2.Value
.Font.Size = 14
.Font.Bold = True
.Font.Name = "Times New Roman"
.Paragraphs.Alignment = wdAlignParagraphCenter
.InsertParagraphAfter
.EndOf
End With
With DocWord.Application.Selection
.InsertAfter "Дата и время создание отчёта: " & Now
.Font.Size = 10
.Font.Bold = False
.Font.Name = "Times New Roman"
.Paragraphs.Alignment = wdAlignParagraphCenter
.InsertParagraphAfter
.InsertParagraphAfter
.EndOf
End With
If optPers.Value = True Then
'If Check1.Value = 1 And cbo.Text <> "" Then
Rst1.Open ("SELECT * FROM TBL_PERS order by Pers_NAME1", DataBase
Rst2.Open ("SELECT * FROM TBL_PERCENTAGE", DataBase
iRow = Rst1.RecordCount + 1 ' Кол-во строк ListView + заголовок
' Создаём таблицу
Set TableWord = DocWord.Tables.Add(DocWord.Application.Selection.Range, iRow, iColumn)
' Заголовок таблицы
For i = 1 To iColumn
TableWord.Cell(1, i).Range.Text = lvwReport.ColumnHeaders(i).Text
Next i
Open_Tables (10)
FRM_STATUSBAR.Show
FRM_STATUSBAR.ProgressBar2.Max = iRow
FRM_STATUSBAR.ProgressBar1.Max = RstBase_Open.RecordCount + 1
MsgBox FRM_STATUSBAR.ProgressBar1.Max
 im iCol As Integer
iCol = 1
For i = 2 To iRow
'iCol = 1
iProgressBar1 = 1
FRM_STATUSBAR.ProgressBar1.Value = iProgressBar1
 o Until RstBase_Open.EOF
iProgressBar1 = iProgressBar1 + 1
FRM_STATUSBAR.ProgressBar1.Value = iProgressBar1
If Rst1("Pers_ID".Value = RstBase_Open("Pers_ID".Value Then
TableWord.Cell(i, 1).Range.Text = Trim(Rst1("Pers_NAME1".Value)
TableWord.Cell(i, 2).Range.Text = Rst1("Pers_NAME2".Value
TableWord.Cell(i, 3).Range.Text = Rst1("Pers_NAME3".Value
SumCost = SumCost + RstBase_Open("AddPers_COST".Value
SumWork = SumWork + 1
 o Until Rst2.EOF ' Подсчёт КТУ
'FRM_STATUSBAR.ProgressBar1.Value = iProgressBar1
If Rst2("Percentage_ID".Value = RstBase_Open("AddPers_PERCENTAGE_EX".Value Then
SumKTY = SumKTY + Rst2("Percentage_VOLUME".Value * RstBase_Open("AddPers_COST".Value
'iProgressBar1 = iProgressBar1 + 1
'FRM_STATUSBAR.ProgressBar1.Value = iProgressBar1
End If
Rst2.MoveNext
'iProgressBar1 = iProgressBar1 + 1
'FRM_STATUSBAR.ProgressBar1.Value = iProgressBar1
Loop
Rst2.MoveFirst
TableWord.Cell(i, 4).Range.Text = Trim(SumWork)
TableWord.Cell(i, 5).Range.Text = FormatCurrency(SumCost, 2)
TableWord.Cell(i, 6).Range.Text = FormatCurrency(SumKTY, 2)
TableWord.Cell(i, 7).Range.Text = FormatCurrency(SumCost + SumKTY, 2)
End If
RstBase_Open.MoveNext
Loop
RstBase_Open.MoveFirst
Rst1.MoveNext
AllSum = AllSum + (SumCost + SumKTY)
AllWork = AllWork + SumWork
SumCost = 0
SumKTY = 0
SumWork = 0
iProgressBar2 = iProgressBar2 + 1
FRM_STATUSBAR.ProgressBar2.Value = iProgressBar2
Next i
AllSum = AllSum + (SumCost + SumKTY)
AllWork = AllWork + SumWork
End If
For i = 1 To TableWord.Rows.Count
 im StrLen As Integer
StrLen = Len(TableWord.Cell(i, 1).Range.Text)
If StrLen <= 2 Then
TableWord.Rows(i).Delete
i = i - 1
End If
Next i
TableWord.Rows(TableWord.Rows.Count).Select
Selection.InsertRowsBelow 1
TableWord.Cell(TableWord.Rows.Count, 1).Select
Selection.MoveRight Unit:=wdCharacter, Count:=TableWord.Columns.Count - 2, Extend:=wdExtend
Selection.Cells.Merge
TableWord.Cell(TableWord.Rows.Count, 1).Range.Text = "Всего:"
TableWord.Cell(TableWord.Rows.Count, 2).Range.Text = FormatCurrency(AllSum, 2)
'**************************
'* Форматирование таблицы *
'**************************
' Заголовок таблицы
' =================
For i = 1 To TableWord.Columns.Count
With TableWord.Cell(1, i).Range
.Font.Bold = True
.Font.Size = 12
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.Shading.BackgroundPatternColor = wdColorPaleBlue
.Cells.VerticalAlignment = wdCellAlignVerticalCenter
End With
Next i
' Тело таблицы
' ============
For x = 2 To TableWord.Rows.Count - 1
For y = 1 To TableWord.Columns.Count
With TableWord.Cell(x, y).Range
.Font.Size = 12
.ParagraphFormat.Alignment = wdAlignParagraphLeft
End With
Next y
Next x
' Заключение таблицы
' ==================
With TableWord.Cell(TableWord.Rows.Count, 1).Range
.Font.Size = 14
.Font.Bold = True
'.Font.Color = vbRed
'.Shading.BackgroundPatternColor = wdColorLightGreen
.ParagraphFormat.Alignment = wdAlignParagraphLeft
End With
With TableWord.Cell(TableWord.Rows.Count, 2).Range
.Font.Size = 14
.Font.Bold = True
'.Font.Color = vbRed
'.Shading.BackgroundPatternColor = wdColorLightGreen
.ParagraphFormat.Alignment = wdAlignParagraphLeft
End With
' Выравнивание таблицы
' ====================
TableWord.Range.Select
Selection.Tables(1).AutoFitBehavior (wdAutoFitContent)
Selection.Tables(1).AutoFitBehavior (wdAutoFitWindow)
Selection.EndOf
WordApp.Visible = True
Set TableWord = Nothing
Set DocWord = Nothing
FRM_STATUSBAR.Hide
Exit Sub
'ExitSub:
' FRM_STATUSBAR.Hide
' WordApp.Quit False
' Set WordApp = Nothing
End Sub
Ответить
|
Номер ответа: 15 Автор ответа: KVU
Вопросов: 10 Ответов: 32
|
Профиль | | #15
|
Добавлено: 01.08.06 22:17
|
Да не обязательно уничтожать объект в той же процедуре. Объяви указатель глобальной переменной - и уничтожай в любом месте, независимо от того где ты его создал. Только сначала Quit не надо забывать давать.
Это понятно, что нужно уничтожать объект, а если пользователь сам закрыл Word или допустим по помимо сформированного отчета в worde, может у него ещё какие ни будь документы открыты, если уничтожать WordApp.Quit не закроются ли все документы.
Так же если уже открыт другой документ word то программу ругается на Selection.InsertRowsBelow 1 и т.д.
Большое спасибо что помогаете, надеюсь, придём к решению проблемы.
Можете дать пример как правильно загружать и уничтожать объект word
Суть вопроса, нужно, что бы пользователь после формирования отчёта в worde мог ещё раз его сформировать, это же или другой отчёт. Кто изучал код обратили внимания, что там два отчёта краткий и полный.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму