使用VBA创建自动Word模板

时间:2013-11-11 21:42:53

标签: excel matlab vba word-vba

我正在创建一个word文档模板,并且处于一个十字路口。我想用MATLAB输出的数字和从MATLAB输出填充的Excel表格填充文档。这些数字被组织到文件夹中,Excel表格在Excel模板中以表格形式组织,如下所示:

enter image description here

我之前已经问过几个关于自动更新这些表格和数字的问题,现在有了这个代码:

Linked Table in MS Word

Linked Images and Tables in MS Word

报告很长但长度不一。报告记录了机器测试。有些客户测试1台机器,其他测试5台机器。对于5台机器,报告有100个表和400个数字。

例如,2台机器的报告结构如下:

文字1

图1.1

图1.2

文字2

表1.1

表1.2

图2.1

图2.2

我想以编程方式创建报告。用户将Word模板,Excel模板和文件结构复制并粘贴到其工作目录中。 Excel模板中将有一个工作表,其中包含有关测试的信息。即要测试的机器数量。该模板将为一台机器构建。

VBA会从Excel模板中提取要测试的计算机数量。然后,它将索引Word文件中的数字和表格,将它们复制到Word文件中正确位置的指定数量的计算机,并将它们链接到正确的源文件位置。如果运行了测试的迭代,那么我将使用上面发布的代码来更新数字和表格。

最简单的设置方法是什么?什么方法可以最快地生成和刷新表数据?根据我所做的阅读,听起来像设置表格作为图片导入而不是链接 this 等数据可能会更快应用。我希望代码快速,万无一失,强大而且不依赖于任何添加内容,例如 this 。我可能需要像 this 这样的东西,但这似乎有点矫枉过正。

我们非常感谢任何帮助 - 我正在努力掌握Word VBA,域代码和书签之间的关系,并最好地利用它们。

2 个答案:

答案 0 :(得分:6)

此问题非常适合自动化。对我而言,您似乎应该能够拥有一个基本模板,并且几乎完全基于Excel电子表格和机器信息来填写信息。

Word中的书签是你的朋友。您可以使用它们来初始放置表格和图形,并在新信息可用时更新它们(尽管这需要额外的努力)。 我已经做了很多工作,将数据从Excel导入Word作为表,并且肯定会建议反对将表导入为图片。你的文件大小会迅速膨胀,想要以电子方式从表格中提取数据的人会想要用生锈的茶匙刺伤你。

根据您提供的信息,我可能会在Excel中以Excel模板作为活动工作簿开始您的代码。这就是我设置它的方式:

  • 从显示功能区选项卡的加载项开始。这可以用于任何“机器”Excel模板。
  • 使用OLE自动化打开Word并从Word模板创建一个新文档(网上有大量信息可以执行此操作)
  • 从Excel模板中读取文档结构并设置word文档。由于您了解布局,因此可以为所有图表和表格填充占位符(书签)以及字幕。
  • 遍历所有表并首先插入它们。将表格数据从Excel插入Word的技巧是将表格作为分隔文本插入,然后将其转换为表格。
  • 循环并插入所有数字。
  • 如果您使用书签封装图形并向表格添加书签,则可以根据需要单独更新它们。

请注意,这些选项中没有一个本身就是微不足道的。如果你想应用额外的格式,比如粗体标题,合并的单元格或分割页面的表格,那么它就会有更多的工作。

您可以使用域代码依次更新表格和图形编号,再次使用书签来提供交叉参考。

提供大量代码的问题非常广泛,但以下示例子代和函数应该足以让您入门。如果您还有其他问题,请为他们提出新问题。

通过输入Word文档(从模板创建并已填充定义表位置的书签)以及所有表的名称,以下函数将这些表填充到字。

Sub PopulateTables(wdDoc As Word.Document, vTableArray As Variant)
    Dim ii As Integer, rInputData As Range

    'Loop through all the bookmarks
    For ii = LBound(vTableArray) To UBound(vTableArray)
        'Get the name of the current table from the list in the Excel template
        sTableName = vTableArray(ii)

        'Check if the bookmark exists in the document
        If wdDoc.Bookmarks.Exists("tblplc_" & sTableName) Then
            'Use the function to check if there is a table already at the bookmark
            Call CheckTableBookMark(wdDoc, "tblplc_" & sTableName)

            'Get the range of the information to be put into the table here.
            'THIS WILL BE YOUR OWN CUSTOM FUNCTION
            Set rInputData = GetMyInputData(sTableName)

            'Insert the data into Word
            Call CreateTableFromString(wdDoc.Bookmarks("tblplc_" & sTableName).Range, rInputData)
        End If
    Next ii
End Sub

此功能将删除书签中的任何现有表格,并确保有新数据的新书签:

Sub CheckTableBookMark(wdDoc As Word.Document, sTargetBM As String)
    'Function to delete any existing tables at a bookmark.

    With wdDoc
        .Activate
        .Bookmarks(sTargetBM).Select

        'If the bookmark has a table in it then we need to delete it
        If .Bookmarks(sTargetBM).Range.Tables.Count > 0 Then
            .Bookmarks(sTargetBM).Range.Tables(1).Delete

            'If the bookmark was 'inside' the table it may have been deleted.  Put it back in
            If Not .Bookmarks.Exists(sTargetBM) Then
                .Application.Selection.TypeParagraph
                .Application.Selection.MoveLeft Unit:=wdCharacter, Count:=1
                .Bookmarks.Add sTargetBM
            Else
                .Bookmarks(sTargetBM).Range.Select
                .Application.Selection.TypeParagraph
            End If

            'Do custom formatting here as required.
            .Bookmarks(sTargetBM).Range.Style = "Normal"
            .Bookmarks(sTargetBM).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
        End If
    End With
End Sub

以下两个函数将构建一个包含数据的字符串,然后将其转换为表格:

Sub CreateTableFromString(ByRef rWordRange As Word.Range, rFromRange As Range)
    Dim tblWordTarget As Word.Table

    'Build the data from the Excel Spreadsheet and set it to the word range
    rWordRange.Text = BuildDataString(rFromRange)
    Set tblWordTarget = rWordRange.ConvertToTable(vbTab, AutoFitBehavior:=wdAutoFitFixed, DefaultTableBehavior:=wdWord8TableBehavior)

    'Do stuff with the table here (eg apply formatting etc)

    Set tblWordTarget = Nothing
End Sub

Function BuildDataString(rFromRange As Range) As String
    Dim sData As String, nrRow As Long, nrCol As Integer, iTotalColumns As Integer

    'Convert the input range to a variable and determine the number of columns
    vData = rFromRange.Value
    iTotalColumns = UBound(vData, 2)

    'Loop through all the elements in the array
    For nrRow = LBound(vData, 1) To UBound(vData, 1)
        For nrCol = 1 To iTotalColumns
            'Depending on what type of data is encountered either add it to the string or substitute something
            'You'll want to modify this as needed
            If IsError(vData(nrRow, nrCol)) Then
                sData = sData & "Error"
            ElseIf vData(nrRow, nrCol) = "" Or vData(nrRow, nrCol) = 0 Or vData(nrRow, nrCol) = "-" Then
                sData = sData & VBA.Chr$(150)
            Else
                sData = sData & vData(nrRow, nrCol - iIncrement)
            End If

            'Use tab delimiters for Word to know where the columns are
            If nrCol < iTotalColumns Then sData = sData & vbTab
        Next nrCol

        'Add a carriage return for each new line
        If nrRow < UBound(vData, 1) Then sData = sData & vbCr
    Next nrRow

    'Return the completed string
    BuildDataString = sData
End Function

答案 1 :(得分:1)

我个人会使用Matlab代码创建一个包含所有包含图像和数据的文件名的LaTeX文件。

在开发过程中,不要忘记定期检查生产的乳胶是否被htlatex或oolatex接受。

Latex有一个很长的学习曲线,但是如果你有一个月就会成功。

关于oolatex的链接,包括带有图片的文件名:https://groups.google.com/forum/#!topic/comp.text.tex/p--jBb7MIuQ