Word VBA在表格中放置文本

Word VBA在表格中放置文本,vba,ms-word,Vba,Ms Word,我试图在MS Word中的一个表中放置文本,该表由第一行的标题和两列组成,然后是另一行,用于显示文本的位置 填写表格的文本在用户表单中,更准确地说是TextBox3 因此,如果TextBox3包含: 汽车注册服务经理 我希望桌子看起来像这样: Header#1 | Header#2 Automotive | 85,000 Registered | 77,000 Services | 32,000 Manager | 500,00 标题#2中的数字来自excel中的数据库,

我试图在MS Word中的一个表中放置文本,该表由第一行的标题和两列组成,然后是另一行,用于显示文本的位置

填写表格的文本在用户表单中,更准确地说是TextBox3

因此,如果TextBox3包含:

汽车注册服务经理

我希望桌子看起来像这样:

 Header#1  | Header#2

Automotive | 85,000 
Registered | 77,000 
Services   | 32,000 
Manager    | 500,00
标题#2中的数字来自excel中的数据库,这部分我可以决定手动执行,也可以稍后再执行。如果我遇到问题,我会寻求帮助,但现在我要解决的是表格,因为我只有一行要粘贴信息

我尝试使用:

Dim tmpArray As Variant
tmpArray = Split(TextBox3, " ")


Dim i As Integer
For i = 1 To UBound(tmpArray)

    ActiveDocument.Tables(1).Cell(i, 1).Range = tmpArray(i - 1)
    Selection.TypeParagraph



Next i
但即使我有
类型段落
代码只写第二个字,让我给你完整的代码,看看我们能想出什么

Private Sub CommandButton1_Click()
With ActiveDocument
    .Bookmarks("bmCN").Range _
    .InsertBefore TextBox1
    .Bookmarks("bmOriJob").Range _
    .InsertBefore TextBox2
    .Bookmarks("bmOptJob").Range _
    .InsertBefore TextBox3
    .Bookmarks("bmJobD").Range _
    .InsertBefore TextBox4
    .Bookmarks("bmJobRes").Range _
    .InsertBefore TextBox5
    .Bookmarks("bmJobR").Range _
    .InsertBefore TextBox6
    .Bookmarks("bmBen").Range _
    .InsertBefore TextBox7
    .Bookmarks("bmTag").Range _
    .InsertBefore TextBox8
End With
'Temporary array
Dim tmpArray As Variant
    tmpArray = Split(TextBox3, " ")


Dim i As Integer
For i = 1 To UBound(tmpArray)

    ActiveDocument.Tables(1).Cell(i, 1).Range = tmpArray(i - 1)
    Selection.TypeParagraph



Next i
UserForm1.Hide
    Selection.WholeStory
    Selection.Fields.Update
    Selection.Collapse Direction:=wdCollapseEnd
End Sub

谢谢,

问题在于循环中的数组索引。由于
i
的最大值为
UBound(tmpArray)
,并且您正在将单元格设置为
tmpArray(i-1)
,因此您将始终忽略最后一个数组元素。您还将从标题行开始(
单元格(1,1)
第一次通过循环)。最后,直接使用文档的范围对象不会影响选择的范围,因此
Selection.typeparation
将始终位于运行代码之前选择的任何位置。因为这在你的循环中,我猜这不是你想要的行为。最后,您可能应该在第一次机会获取对
ActiveDocument
的引用,并根据需要在sub之间传递该引用。它不仅比不断取消对全局文档的引用更有效,而且避免了在代码运行时用户交互可能更改活动文档的情况

像这样的方法应该会奏效:

Dim doc As Document
Set doc = ActiveDocument

'...

Dim tmpArray As Variant
tmpArray = Split(TextBox3.Text, " ")

Dim i As Integer
For i = 0 To UBound(tmpArray)
    doc.Tables(1).Cell(i + 2, 1).Range = tmpArray(i)
Next i

问题在于循环中的数组索引。由于
i
的最大值为
UBound(tmpArray)
,并且您正在将单元格设置为
tmpArray(i-1)
,因此您将始终忽略最后一个数组元素。您还将从标题行开始(
单元格(1,1)
第一次通过循环)。最后,直接使用文档的范围对象不会影响选择的范围,因此
Selection.typeparation
将始终位于运行代码之前选择的任何位置。因为这在你的循环中,我猜这不是你想要的行为。最后,您可能应该在第一次机会获取对
ActiveDocument
的引用,并根据需要在sub之间传递该引用。它不仅比不断取消对全局文档的引用更有效,而且避免了在代码运行时用户交互可能更改活动文档的情况

像这样的方法应该会奏效:

Dim doc As Document
Set doc = ActiveDocument

'...

Dim tmpArray As Variant
tmpArray = Split(TextBox3.Text, " ")

Dim i As Integer
For i = 0 To UBound(tmpArray)
    doc.Tables(1).Cell(i + 2, 1).Range = tmpArray(i)
Next i

嗨@Comintern尝试过但不起作用我得到了相同的行为只是最后一句话保留在表中嗨@Comintern尝试过但不起作用我得到了相同的行为只是最后一句话保留在表中