Excel 用VBA自动创建Word模板
我正在创建一个word文档模板,现在正处于一个十字路口。我想用从MATLAB创建的数字和从MATLAB输出填充的Excel表格填充文档。图形被组织到文件夹中,Excel表格被组织到Excel模板中的表格中,如下所示: 关于自动更新这些表格和数字,我在这里问了几个问题,现在有了代码: 这些报告很长,但篇幅各不相同。这些报告记录了机器测试。一些客户机测试1台机器,其他客户机测试5台机器。对于5台机器,报告有100个表和400个图 例如,两台机器的报告结构如下: 文本1 图1.1 图1.2 文本2 表1.1 表1.2 图2.1 图2.2 我想以编程方式创建报告。用户会将Word模板、Excel模板和文件结构复制并粘贴到其工作目录中。Excel模板中将有一个工作表,其中包含有关测试的信息。i、 e.待测试的机器数量。模板将为1台机器构建 VBA将从Excel模板中提取要测试的机器数量。然后,它将索引Word文件中的图形和表格,在Word文件的正确位置为指定数量的机器复制它们,并将它们链接到正确的源文件位置。如果运行了测试的迭代,我将在这里使用上面发布的代码来更新图和表 最简单的设置方法是什么?什么方法可以使生成和刷新表数据最快?从我所做的阅读来看,设置表以作为图片导入可能比链接数据(如应用程序)更快。我希望代码能够快速、万无一失、健壮,并且不依赖任何外接程序,如。我可能需要像这样的东西,但这似乎有点过分了Excel 用VBA自动创建Word模板,excel,matlab,vba,ms-word,Excel,Matlab,Vba,Ms Word,我正在创建一个word文档模板,现在正处于一个十字路口。我想用从MATLAB创建的数字和从MATLAB输出填充的Excel表格填充文档。图形被组织到文件夹中,Excel表格被组织到Excel模板中的表格中,如下所示: 关于自动更新这些表格和数字,我在这里问了几个问题,现在有了代码: 这些报告很长,但篇幅各不相同。这些报告记录了机器测试。一些客户机测试1台机器,其他客户机测试5台机器。对于5台机器,报告有100个表和400个图 例如,两台机器的报告结构如下: 文本1 图1.1 图1.2 文本
任何帮助都将不胜感激-我正在努力掌握单词VBA、字段代码和书签之间的关系,并充分利用它们 我个人会使用Matlab代码创建一个LaTeX文件,其中包含包含图像和数据的所有文件名 在开发过程中,不要忘记定期检查生产的乳胶是否被htlatex或oolatex接受 Latex有很长的学习曲线,但如果你有一个月的时间,你就会成功
关于oolatex(包括带有图像的文件名)的链接:此问题非常适合自动化。在我看来,你应该能够有一个基本的模板,并填写信息几乎完全基于Excel电子表格与机器信息 Word中的书签是您在这里的朋友。您可以使用它们最初放置表格和图形,并且在新信息可用时更新它们(尽管这需要额外的工作)。 我已经做了大量的工作,将数据从Excel导入Word作为表格,我绝对不建议将表格作为图片导入。您的文件大小将迅速膨胀,想要从表中以电子方式提取数据的人会想用生锈的茶匙刺伤您 根据您提供的信息,我可能会在Excel中以Excel模板作为活动工作簿开始您的代码。这是我设置它的方式:
- 从显示功能区选项卡的外接程序开始。这可用于任何“机器”excel模板
- 使用OLE automation打开Word并从Word模板创建新文档(网络上有大量信息可用于此操作)
- 从Excel模板中读入文档结构并设置word文档。因为您知道布局,所以可以为所有图形和表格以及标题填充占位符(书签)
- 循环遍历所有表并首先插入它们。将表格数据从Excel插入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
子CreateTableFromString(ByRef rOrdRange作为Word.Range,rFromRange作为Range)
Dim tblWordTarget As Word.表格
'从Excel电子表格生成数据并将其设置为word范围
rWordRange.Text=BuildDataString(rFromRange)
设置tblWordTarget=rWordRange.CONVERTOTABLE(vbTab,AutoFitBehavior:=wdAutoFitFixed,DefaultTableBehavior:=wdWord8TableBehavior)
'在这里处理表格(如应用格式等)
硒