Создание таблиц в закладках в документе Word через Excel VBA из динамических элементов управления

Я надеюсь, что кто-то может помочь мне в этом, так как я бился головой об этом около недели или около того.

У меня есть пользовательская форма, которая создает набор элементов управления (3 текстовых поля и поле со списком) и объединяет счетчик на 1 при каждом нажатии кнопки.

Я написал макрос VBA для Excel, который должен открыть конкретный документ (который будет точкой в ​​окончательной версии, но в этом тесте docx) и;

Перейти к установленной закладке в документе Word ("table1"). Перейти к началу строки с закладкой. Перейти к предыдущей строке. Создать таблицу с 1 строкой и 3 столбцами. Вставляет значения из первого и второго текстовых полей и поля со списком в столбцы 1,2 и 3 соответственно. Вернитесь к указанной закладке "table2" и повторите это для каждой повторяющейся строки динамически созданных элементов управления.

Также Макрос должен

Перейти к установленной закладке в документе Word ("таблица2") Перейти к началу строки с закладкой Перейти к предыдущей строке Создать таблицу с 1 строкой и 2 столбцами. Вставляет значения из первого и третьего текстового поля в столбцы 1 и 2 соответственно. Вернитесь к указанной закладке "table2" и повторите это для каждой повторяющейся строки динамически создаваемых элементов управления.

Таким образом, в основном на каждой закладке, если есть 3 строки динамических элементов управления после выполнения макроса, должно быть

Таблица с 3 строками и 3 столбцами, расположенными над закладкой "table1", содержит значения из первого и второго текстовых полей и значение поля со списком. Таблица с 3 строками и 2 столбцами, расположенными над закладкой "table2", содержит значения из первого и третьего значений текстового поля.

Поэтому моя проблема заключается в том, что при запуске макроса он либо создает одну строку таблицы в верхней части документа, другую - в закладке "table1" и одну в закладке "table2", или создается таблица с 3 столбцами, затем еще 3 таблица столбцов создается внутри первой ячейки первой таблицы и так далее.

Я убежден, что упускаю что-то в отношении управления курсором (поскольку обычная проблема заключается в том, что первая ячейка таблицы создается в первой строке документа, затем курсор, кажется, перемещается в закладку "table1", и макрос продолжается оттуда),

Если бы кто-то мог дать мне несколько советов по этому вопросу, я был бы очень признателен, поскольку я чувствую, что я почти там, но что я просто что-то упускаю.

Вот код, который я имею до сих пор, заранее извиняюсь за любые неиспользованные переменные, это задняя часть кодирования салфетки.

Private Sub CommandButton14_Click() 'Create WO Letter
'Open WO letter and copy paste data

    Dim objWord As Word.Application
    Dim objDoc As Word.Document

    Dim riskCombo As Control
    Dim theTextBox802 As Control
    Dim theTextBox803 As Control
    Dim theTextBox804 As Control
    Dim b As Integer
    Dim c As Integer

Dim intNoOfColumns

Dim wdDoc

Dim objRange1

Dim objRange2

Dim objTable1

Dim objTable2

    b = iRiskCount
    c = 1


    If Me.WOLetter1.Value = False And Me.WOLetter2.Value = False And Me.WOLetter3.Value = False And Me.WOLetter4.Value = False Then
        MsgBox "You Must Choose a Letter Type"
    Exit Sub

    End If

    If UserForm1.MultiPage1.Pages(2).Frame15.Controls("Risk" & c).Value = "Risk" Then
         MsgBox "Select Risk Level for line " & c
    Exit Sub

    End If

        If Me.WOLetter1.Value = True Then
                Set objWord = New Word.Application
                objWord.DisplayAlerts = False
                objWord.Visible = True
                objWord.Activate
                Set wdDoc = objWord.Documents.Add(ActiveWorkbook.Path & "\WOTest.docx")


        ElseIf Me.WOLetter2.Value = True Then
                Set objWord = New Word.Application
                objWord.DisplayAlerts = False
                objWord.Visible = True
                'objWord.Documents.Open ActiveWorkbook.Path & "\WOTest.docx", ReadOnly:=True '"\test.dotx", ReadOnly:=True'"\Doc.dotm", ReadOnly:=True '"\test.dotx", ReadOnly:=True
                objWord.Activate

        ElseIf Me.WOLetter3.Value = True Then
                Set objWord = New Word.Application
                objWord.DisplayAlerts = False
                objWord.Visible = True
                'objWord.Documents.Open ActiveWorkbook.Path & "\WOTest.docx", ReadOnly:=True '"\test.dotx", ReadOnly:=True'"\Doc.dotm", ReadOnly:=True '"\test.dotx", ReadOnly:=True
                objWord.Activate

        ElseIf Me.WOLetter4.Value = True Then
                Set objWord = New Word.Application
                objWord.DisplayAlerts = False
                objWord.Visible = True
                'objWord.Documents.Open ActiveWorkbook.Path & "\WOTest.docx", ReadOnly:=True '"\test.dotx", ReadOnly:=True'"\Doc.dotm", ReadOnly:=True '"\test.dotx", ReadOnly:=True
                objWord.Activate

        End If



        For Each riskCombo In UserForm1.MultiPage1.Pages(2).Frame15.Controls

            If b > 0 Then

            Set objRange1 = objWord.Selection.Range
            Set objRange2 = objWord.Selection.Range

    'Table1
            objWord.Selection.GoTo What:=wdGoToBookmark, Name:="table1"
            objWord.Selection.HomeKey Unit:=wdLine, Extend:=wdMove
            objWord.Selection.MoveUp     

            wdDoc.Tables.Add objRange1, 1, 3
                objWord.Selection.GoTo What:=wdGoToBookmark, Name:="table1"
                objWord.Selection.HomeKey Unit:=wdLine, Extend:=wdMove
            objWord.Selection.MoveUp
            Set objTable1 = wdDoc.Tables(1)

    'Table 2

            objWord.Selection.GoTo What:=wdGoToBookmark, Name:="table2"
            objWord.Selection.HomeKey Unit:=wdLine, Extend:=wdMove
            objWord.Selection.MoveUp

            wdDoc.Tables.Add objRange2, 1, 2
                objWord.Selection.GoTo What:=wdGoToBookmark, Name:="table2"
                objWord.Selection.HomeKey Unit:=wdLine, Extend:=wdMove
            objWord.Selection.MoveUp
            Set objTable2 = wdDoc.Tables(1)

            With objTable1
                .Cell(0, 1).Range.Text = UserForm1.MultiPage1.Pages(2).Frame15.Controls("Text5" & c).Value
                .Cell(0, 2).Range.Text = UserForm1.MultiPage1.Pages(2).Frame15.Controls("Text6" & c).Value
                .Cell(0, 3).Range.Text = UserForm1.MultiPage1.Pages(2).Frame15.Controls("Risk" & c).Value
            End With

            With objTable2
                .Cell(0, 1).Range.Text = UserForm1.MultiPage1.Pages(2).Frame15.Controls("Text5" & c).Value
                .Cell(0, 2).Range.Text = UserForm1.MultiPage1.Pages(2).Frame15.Controls("Text7" & c).Value
            End With


                    c = c + 1
                    b = b - 1

        End If

    Next riskCombo

            objTable1.Columns(1).SetWidth ColumnWidth:=30, RulerStyle:= _
            wdAdjustNone

            objTable1.Columns(2).SetWidth ColumnWidth:=350, RulerStyle:= _
            wdAdjustNone

            objTable1.Columns(3).SetWidth ColumnWidth:=75, RulerStyle:= _
            wdAdjustNone

            objTable2.Columns(1).SetWidth ColumnWidth:=30, RulerStyle:= _
            wdAdjustNone

            objTable2.Columns(2).SetWidth ColumnWidth:=425, RulerStyle:= _
            wdAdjustNone


End Sub 'end of test

Даже некоторое подтверждение того, что я нахожусь на правильном пути с этим, было бы оценено, поскольку я бьюсь головой против этого в течение прошлой недели.

1 ответ

Решение

Вы устанавливаете и таблицу один, и таблицу два, чтобы они были одинаковыми.

"Set objTable1 = wdDoc.Tables(1)" 
"Set objTable2 = wdDoc.Tables(1)"
Другие вопросы по тегам