通过动态控件

时间:2018-03-06 10:38:55

标签: excel excel-vba ms-word bookmarks vba

我希望有人可以帮我解决这个问题,因为我已经对这个问题大打了一个星期左右。

我有一个用户窗体,用于创建一组控件(3个文本框和一个组合框),并在每次按下按钮时将计数器与1进行交互。

我已经编写了一个Excel VBA宏,它应该打开一个特定的文档(在最终版本中将是一个dotx但是这个测试的docx)并且;

转到Word文档中的设置书签(" table1") 使用书签移动到行的开头 上移到上一行 创建一个包含1行和3列的表。 将第一个和第二个文本框和组合框中的值分别插入到第1,2和3列中 返回指定的" table2"为动态创建的控件

的每个迭代行添加书签并重复此操作

宏也应该

转到Word文档中的设置书签(" table2") 使用书签移动到行的开头 上移到上一行 创建一个包含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 个答案:

答案 0 :(得分:0)

您将第一表和第二表都设置为相同。

"Set objTable1 = wdDoc.Tables(1)" 
"Set objTable2 = wdDoc.Tables(1)"