我正在研究一个宏来格式化并从许多单词文档中提取信息,这些单词文档中都有一个表格。问题是这个表有很多行,每行每行有1,2或3列,我需要确保表的右边缘总是相同的宽度。
我想在VBA代码中复制的实际行为是当你在word(表示表的右边缘)的标尺栏上拖动小方块时调整所有行的表的右边缘。但是,当我尝试记录一个宏时,它会生成以下代码行,这对于包含合并列的表不起作用:
Selection.Tables(1).Columns(1).SetWidth ColumnWidth:=501.3, RulerStyle:= _
wdAdjustNone
接下来,我尝试使用以下代码显式地定位第一行。这很有用,但它只调整了第一行的宽度 - 所有其他行都保持不变:
wdApp.Documents(myDoc).Tables(1).Cell(1, 1).SetWidth ColumnWidth:=501.3, RulerStyle:=_
wdAdjustNone
然后我使用.width属性而不是.setwdith属性,但它们似乎表现相同。我甚至尝试了所有四个.setwidth RulerStyle参数,但它们的行为都相同。
最后,在沮丧的情况下,我决定遍历表中的所有行,并根据需要调整最右边的列,以便整行是我想要的501.3像素。这花了一些时间,因为我找不到一种方法来判断给定行上有多少列。我最终依靠陷阱错误来解决问题 - 见下文。当该行上没有足够的列时,第4行会出错,所以我只是减少i变量并再试一次,直到没有错误:
On Error GoTo BadExit
For row = 1 To wdApp.Documents(myDoc).Tables(1).Rows.count
i = 3
If wdApp.Documents(myDoc).Tables(1).Cell(row, i).PreferredWidth <> 1501.3 Then
If i = 3 Then
wid = 501.3 - wdApp.Documents(myDoc).Tables(1).Cell(row, 2).Width - wdApp.Documents(myDoc).Tables(1).Cell(row, 1).Width
wdApp.Documents(myDoc).Tables(1).Cell(row, i).Width = wid
ElseIf i = 2 Then
wid = 501.3 - wdApp.Documents(myDoc).Tables(1).Cell(row, 1).Width
wdApp.Documents(myDoc).Tables(1).Cell(row, i).Width = wid
Else
wid = 501.3
wdApp.Documents(myDoc).Tables(1).Cell(row, i).Width = wid
End If
End If
GoTo SafeExit
BadExit:
If i = 3 Then
i = 2
Resume
ElseIf i = 2 Then
i = 1
Resume
End If
SafeExit:
Next row
此代码运行时没有错误,但最终宽度似乎永远不会是501.3 - 它似乎变化不一致(我通过使用带有.width属性的msgbox确认),而且,有时右边缘没有排列!具有1列的行可能比具有2列等的行更突出。并且此代码非常慢。
任何人都可以帮我找到一个简单的解决方案来复制手动使用鼠标移动标尺上的正方形以将字表中每一行的宽度调整为特定值的行为吗?非常感谢您的帮助。
提前致谢,
-Josh