通过动态控件 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)"