Цель состоит в том, чтобы создать несколько разных таблиц в документе Word из таблицы Excel.
Код должен взять заголовок из первого столбца, а затем использовать остальные столбцы для создания таблицы. Заголовок и таблицы созданы успешно, но они расположены в документе в неправильном порядке. В документе отображается заголовок 1, затем разрыв страницы, заголовок 2, разрыв страницы, затем таблица 2, затем таблица 1.
Почему таблицы расположены в неправильном порядке и почему разрыв страницы находится над таблицами?
Sub AddToWord()
Dim objWord
Dim objDoc
Dim ObjSelection
Dim i As Integer
Dim j As Integer
Dim ws As Worksheet
Dim row_count As Integer
Dim col_count As Integer
Dim e As Integer
Dim row As Integer
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Activate
row_count = 7
col_count = 2
e = ws.Range("A2", ws.Range("A2").End(xlDown)).Rows.Count
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add
Set ObjSelection = objWord.Selection
objWord.Visible = True
objWord.Activate
For i = 1 To e
If ws.Cells(i + 1, 12).Value \> 0 Then
With ObjSelection
.BoldRun
.Font.Size = 14
.TypeText ws.Cells(i + 1, 1).Value
.BoldRun
End With
Set Table = objDoc.Tables.Add(ObjSelection.Range, row_count, col_count)
With Table
.Borders.Enable = True
For j = 1 To row_count
.Cell(j, 1).Range.InsertAfter ws.Cells(1, j + 1).Text
Next j
For j = 1 To row_count
.Cell(j, 2).Range.InsertAfter ws.Cells(i + 1, j + 1).Text
Next j
End With
ObjSelection.InsertBreak Type:=wdPageBreak
End If
Next i
End Sub
Лист выглядит так:
Далее на листе находится раздел количества, в котором оператор IF определяет, используется ли эта строка.
Код выдает это:
Конечный результат должен быть таким:
Проблема в том, что при использовании объекта Table
для размещения контента объект ObjSelection
не изменяется. Выделенный фрагмент остается на месте после вставки жирного шрифта.
Итак, после использования объекта Table
для размещения контента вам нужно выбрать таблицу, заново установить ObjSelection
, свернуть ObjSelection
до конца, а затем вставить разрыв страницы.
...
Set Table = objDoc.Tables.Add(ObjSelection.Range, row_count, col_count)
With Table
...
End With
Table.Select
Set ObjSelection = objWord.Selection
wdCollapseEnd = 0
ObjSelection.Collapse Direction:=wdCollapseEnd
wdPageBreak = 7
ObjSelection.InsertBreak Type:=wdPageBreak
...
Подсказка: я использовал объекты с поздней привязкой, поэтому wdCollapseEnd
и wdPageBreak
не определяются как не ранние привязки Word.Application
и им должны быть присвоены значения. При использовании ранней привязки Word.Application
через Инструменты-Ссылки это можно пропустить.
Очень важно знать диапазон, который обновляется вашим кодом. В вашем фрагменте диапазон Selection
остается неизменным, поэтому результат не соответствует вашим ожиданиям.
Sub AddToWord()
Dim objWord
Dim objDoc
Dim ObjSelection
Dim i As Long
Dim j As Long
Dim ws As Worksheet
Dim row_count As Long
Dim col_count As Long
Dim e As Long
Dim row As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Activate
row_count = 7
col_count = 2
e = ws.Range("A2", ws.Range("A2").End(xlDown)).Rows.Count
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add
objDoc.Content.Font.Size = 14
Dim lastRng As Range, oTable
With ActiveDocument.Characters
For i = 1 To e
If ws.Cells(i + 1, 12).Value > 0 Then
Set lastRng = .Last
lastRng.Text = ws.Cells(i + 1, 1).Value
lastRng.Expand Word.wdParagraph
lastRng.Font.Bold = True
Set lastRng = .Last
lastRng.InsertAfter vbCr
lastRng.Font.Bold = wdToggle
Set oTable = objDoc.Tables.Add(lastRng, row_count, col_count)
With oTable
.Borders.Enable = True
For j = 1 To row_count
.Cell(j, 1).Range.Text = ws.Cells(1, j + 1).Text
Next j
For j = 1 To row_count
.Cell(j, 2).Range.Text = ws.Cells(i + 1, j + 1).Text
Next j
End With
.Last.InsertBreak Type:=wdPageBreak
End If
Next i
End With
End Sub
Ты прав. Я не полировал эту часть.
Хотя вы демонстрируете правильный подход к использованию диапазона, а не выбора, ваш ответ испорчен непоследовательностью. Ваш код определяет объекты Word как варианты, но по-прежнему требует установки ссылки на библиотеку слов для использования Enums.