Содержимое не в порядке при использовании Excel VBA для создания документа Word

Цель состоит в том, чтобы создать несколько разных таблиц в документе 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

Лист выглядит так: Содержимое не в порядке при использовании Excel VBA для создания документа Word

Далее на листе находится раздел количества, в котором оператор IF определяет, используется ли эта строка.

Код выдает это: Содержимое не в порядке при использовании Excel VBA для создания документа Word

Конечный результат должен быть таким: Содержимое не в порядке при использовании Excel VBA для создания документа Word

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что при использовании объекта 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.

Timothy Rylatt 22.07.2024 12:12

Ты прав. Я не полировал эту часть.

taller 22.07.2024 15:58

Другие вопросы по теме