通过动态控件 Excel VBA 在 Word 文档中的书签处创建表格
Creating tables at bookmarks in a Word document through Excel VBA from dynamic controls
我希望有人能帮助我解决这个问题,因为我已经为此苦苦思索了大约一个星期左右。
我有一个用户窗体,它创建一组控件(3 个文本框和一个组合框)并在每次按下按钮时将计数器加 1。
我写了一个 Excel VBA 宏,它应该打开一个特定的文档(在最终版本中将是一个 dotx,但在这个测试中是一个 docx)并且;
转到 Word 文档中设置的书签 ("table1")
移动到带有书签的行的开头
向上移动到上一行
创建一个 1 行 3 列的 table。
将第一个和第二个文本框和组合框的值分别插入第 1、2 和 3 列
Return 到指定的 "table2" 书签,并对动态创建的控件的每个迭代行重复此操作
宏也应该
转到 Word 文档中设置的书签 ("table2")
移动到带有书签的行的开头
向上移动到上一行
创建一个 1 行 2 列的 table。
将第一个和第三个文本框的值分别插入第 1 列和第 2 列
Return 到指定的 "table2" 书签,并对动态创建的控件的每个迭代行重复此操作
所以基本上在每个书签处,如果在宏 运行s 之后有 3 行动态控件,则应该有
A table,3 行 3 列,位于书签 "table1" 上方,包含来自第一个和第二个文本框的值以及组合框值。
位于书签 "table2" 上方的具有 3 行和 2 列的 table,其中包含来自第一个和第三个文本框值的值。
所以我的问题是,当宏为 运行 时,它要么在文档顶部创建一行 table,另一行在 "table1" 书签,另一行在"table2" 书签或第 3 列 table 创建,然后在第一个 table 的第一个单元格内创建另一个 3 列 table 等等。
我确信我遗漏了一些关于光标控制的东西(因为通常的问题是第一个 table 单元格是在文档的第一行创建的,然后光标似乎移动到 "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
即使是对我在这方面的正确轨道上的一些保证,我也会很感激,因为在过去的一周里我一直在努力反对这一点。
您将 table 一个和 table 两个设置为相同。
"Set objTable1 = wdDoc.Tables(1)"
"Set objTable2 = wdDoc.Tables(1)"
我希望有人能帮助我解决这个问题,因为我已经为此苦苦思索了大约一个星期左右。
我有一个用户窗体,它创建一组控件(3 个文本框和一个组合框)并在每次按下按钮时将计数器加 1。
我写了一个 Excel VBA 宏,它应该打开一个特定的文档(在最终版本中将是一个 dotx,但在这个测试中是一个 docx)并且;
转到 Word 文档中设置的书签 ("table1") 移动到带有书签的行的开头 向上移动到上一行 创建一个 1 行 3 列的 table。 将第一个和第二个文本框和组合框的值分别插入第 1、2 和 3 列 Return 到指定的 "table2" 书签,并对动态创建的控件的每个迭代行重复此操作
宏也应该
转到 Word 文档中设置的书签 ("table2") 移动到带有书签的行的开头 向上移动到上一行 创建一个 1 行 2 列的 table。 将第一个和第三个文本框的值分别插入第 1 列和第 2 列 Return 到指定的 "table2" 书签,并对动态创建的控件的每个迭代行重复此操作
所以基本上在每个书签处,如果在宏 运行s 之后有 3 行动态控件,则应该有
A table,3 行 3 列,位于书签 "table1" 上方,包含来自第一个和第二个文本框的值以及组合框值。 位于书签 "table2" 上方的具有 3 行和 2 列的 table,其中包含来自第一个和第三个文本框值的值。
所以我的问题是,当宏为 运行 时,它要么在文档顶部创建一行 table,另一行在 "table1" 书签,另一行在"table2" 书签或第 3 列 table 创建,然后在第一个 table 的第一个单元格内创建另一个 3 列 table 等等。
我确信我遗漏了一些关于光标控制的东西(因为通常的问题是第一个 table 单元格是在文档的第一行创建的,然后光标似乎移动到 "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
即使是对我在这方面的正确轨道上的一些保证,我也会很感激,因为在过去的一周里我一直在努力反对这一点。
您将 table 一个和 table 两个设置为相同。
"Set objTable1 = wdDoc.Tables(1)"
"Set objTable2 = wdDoc.Tables(1)"