访问记录集(从 2 列)到 Word 模板(或空文档)
Posted
技术标签:
【中文标题】访问记录集(从 2 列)到 Word 模板(或空文档)【英文标题】:Access recordset (from 2 columns) to Word template (or empty document) 【发布时间】:2019-08-07 10:03:07 【问题描述】:我正在尝试将 Access 记录集中的数据(来自 2 列的数据 - “问题”和“答案”)导出(按钮单击)到具有表单字段“问题”和“答案”的 Word 模板。
我设法做到了,但直到 Word 文档用完 FormFields(我添加了 - 100),如果记录集有超过 100 行,它将导致错误“错误 5941 请求的集合成员不存在” - 因为它用完了可用的 FormFields(此时最大问题数为 1100,并且会增长)。顺便说一句,我可以添加数千个 FormField,但用户在使用此选项时必须删除空的。
我觉得有一种简单的方法可以实现其他类型的循环,该循环将采用只有这两个 FormField 的文档并复制或复制第一个 FormField - “问题”并在第二个中插入数据,但我仍然没有找不到任何方法。
从 Access 记录集中的 2 列中导出数据,一个是“问题”,另一个是“答案”。 ButtonClick 上的代码:
Private Sub cmdToWordMultiple_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb()
Set rst = Me.RecordsetClone
Set Wd = New Word.Application
Set myDoc = Wd.Documents.Add("C:\Users\User\Desktop\ReportQuestions.docx")
Wd.Visible = True
rst.MoveFirst
Do Until rst.EOF
myDoc.FormFields("Question").Range.Text = Nz(rst!Question, "")
myDoc.FormFields("Answer").Range.Text = Nz(rst!Answer, "")
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
objWord.Application.Quit
End Sub
我想让这个按钮将数据从 Access 记录集导出到 Word 文档,而不留下多余的 FormFields。
【问题讨论】:
为什么使用 Word 而不是 Access 报告?可能在 Word 中构建表格而不是 FormFields。 我使用Word模板是因为在FormField之前,我有单词“问题:”和“答案:”,我在需要一个问答时使用Access报告,我只是没有任何线索如何在同一个文档中导出 100 或 1000 个 Q 和 A,如果您有任何想法,请告诉我。 对不起,你表达的限制对我来说毫无意义。我看不出 Access 报告无法完成的原因。必须更多地了解您的数据库结构和所需的输出。但是,如果您对 Word 合并性能感到满意,那么问题就解决了。 【参考方案1】:最有效的是将表单字段保存为构建块,可以根据需要随时插入。 Building Blocks 只能保存在模板中,因此打开 ReportQuestions.docx 然后使用 File/Save As 将其保存为dotx
。
选择这对表单域,然后使用插入->快速部件->将选择保存到快速部件库。填写对话框中的字段,确保为“保存”选择模板 ReportQuestions.dotx。
要插入表单域,代码如下所示。另请注意,在插入下一对表单域之前,如何在每次迭代中到达文档的末尾。 (另见代码下方的注释!)
Dim tmpl as Word.Template
Dim sTmplPath as String
sTmplPath = "C:\Users\User\Desktop\ReportQuestions.dotx"
Set myDoc = Wd.Documents.Add(sTmplPath)
Set tmpl = myDoc.AttachedTemplate
Dim rngEndOfDoc as Word.Range
Set rngEndOfDoc = myDoc.Content
rngEndOfDoc.Collapse wdWollapseEnd
tmpl.BuildingBlockEntries("Name of Entry").Insert Where:=rngEndOfDoc, RichText:=True
这建立在问题中显示的代码之上。根据我对表单域的经验,我怀疑此代码(如图所示)不适用于一对以上的表单域因为表单域名称也是 Word 书签。并且书签名称必须在文档中是唯一的(只能出现一次)。所以Question
和Answer
只能使用一次。我不知道您实际上是在为表单域命名什么,但您可能需要添加代码以在插入表单域后重命名它们。
从 OP 的评论中添加:该建议已成功实施,如下所示
Do Until rst.EOF
tmpl.BuildingBlockEntries("Answer").Insert Where:=rngEndOfDoc, RichText:=True myDoc.FormFields("Answer").Range.Text = "ANSWER: " & Nz(rst!Answer, "")
rst.MoveNext
Loop
【讨论】:
亲爱的 Cindy Meister,你刚刚让我大开眼界,找到了一套新玩具 :) 我没有足够的话语来感谢你的解决方案,现在它首先插入 1 个字段,然后用 Access 中的数据填充它,然后对 2 执行相同操作,无论有多少问答。我刚刚成功导出了 951 页的 Qs 和 As。代码为:Do Until rst.EOF tmpl.BuildingBlockEntries("Answer").Insert Where:=rngEndOfDoc, RichText:=True myDoc.FormFields("Answer").Range.Text = "ANSWER: " & Nz(rst!Answer, "") rst.MoveNext Loop
很高兴它对你有用@SašaKristić :-) 我也喜欢新玩具!我已将您的代码 sn-p 集成到答案中,以防万一评论在某个时候被删除。 (关于 Stack Overflow 的评论是“不稳定的”)这可以帮助遇到类似问题的其他人。以上是关于访问记录集(从 2 列)到 Word 模板(或空文档)的主要内容,如果未能解决你的问题,请参考以下文章