Создание таблиц в закладках в документе 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)"