我正在使用 VBA 和 Delphi 来填充 Word 表。我的逻辑依赖于选择复制和粘贴,这是有问题的,因为可能与其他正在运行的程序交互。 我想重写,这样它就不依赖于复制/粘贴。
下面是Word文档的屏幕截图。我需要填充的表是“订单详细信息”表。
下面是我正在使用的代码。基本步骤:
procedure TForm2.Button2Click(Sender: TObject);
var
i: Integer;
MSWord: Variant;
begin
MSWord := CreateOleObject('word.application');
MSWord.WordBasic.FileOpen('c:\temp\invoice1.dot');
for i := 1 to 3 do begin
MSWord.Selection.WholeStory;
MSWord.WordBasic.EditFind('@DTL_QTY');
MSWord.WordBasic.TableSelectRow;
MSWord.Selection.Range.Copy;
MSWord.Selection.Range.Paste;
MSWord.Selection.WholeStory;
MSWord.WordBasic.EditFind('@DTL_QTY');
MSWord.WordBasic.TableSelectRow;
MSWord.WordBasic.EditReplace('@DTL_QTY', inttostr(i), 0, 0, 0, 0, 0, 0, 1, 1);
MSWord.WordBasic.TableSelectRow;
MSWord.WordBasic.EditReplace('@DTL_DESC','Desc: ' + inttostr(i), 0, 0, 0, 0, 0, 0, 1, 1);
end;
{ finally, get rid of the row used as a template }
MSWord.WordBasic.EditSelectAll;
MSWord.WordBasic.EditFind('@DTL_QTY');
MSWord.WordBasic.TableSelectRow;
{ Delete the last line, which was our template }
MSWord.Selection.Range.Cut;
MSWord.WordBasic.AppShow;
ShowMessage('Review Doc');
MSWord.Quit(False, EmptyParam, EmptyParam);
end;
以下是结果截图:
InsertRowsAbove
插入两行。Option Explicit
Sub InsertRows()
Dim i As Long, oTab As Table
Selection.HomeKey Unit:=wdStory
With Selection.Find
.ClearFormatting
.Text = "@DTL_QTY"
If .Execute Then
If Selection.Information(wdWithInTable) Then
' Select the row, it is not necessary in Word VBA
Selection.Rows(1).Select
' Insert two 2 rows above
Selection.InsertRowsAbove 2
' Get the table object
Set oTab = Selection.Tables(1)
For i = 1 To 3
oTab.Cell(i + 1, 1).Range.Text = CStr(i)
oTab.Cell(i + 1, 2).Range.Text = "Desc: " & CStr(i)
Next
End If
End If
End With
End Sub