使用 VBA 复制 Word 表格行而不使用复制/粘贴

问题描述 投票:0回答:1

我正在使用 VBA 和 Delphi 来填充 Word 表。我的逻辑依赖于选择复制和粘贴,这是有问题的,因为可能与其他正在运行的程序交互。 我想重写,这样它就不依赖于复制/粘贴。

下面是Word文档的屏幕截图。我需要填充的表是“订单详细信息”表。

下面是我正在使用的代码。基本步骤:

  • 找到“@DTL_QTY”标签。
  • 选择该行,复制/粘贴该行(所以现在我们有两行带有标签)。
  • 更新所选行中的每个标签。
  • 对其他行重复此操作。
  • 处理完所有行后,删除最后一个“模板”行。
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;

以下是结果截图:

vba delphi ms-word
1个回答
0
投票
  • Word VBA 代码来了。你可以为delphi修改它。
  • 使用
    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

© www.soinside.com 2019 - 2024. All rights reserved.