Access报表经VBA填充后导出Word未显示填充内容求助
解决Access报表导出Word不显示动态填充内容的问题
我完全懂你的困扰:在Access界面里打开报表能看到Form_Load填充后的完整内容,但导出到Word时却回到了未填充的初始状态。这是因为Access报表的显示逻辑和导出触发事件的机制不一样,下面给你几个可行的解决方案:
方案1:先隐藏打开报表,确保填充完成后再导出
DoCmd.OutputTo默认是直接基于报表的设计定义生成输出,不会触发Form_Load事件。我们可以先隐藏打开报表,让Load事件执行完毕填充内容,再导出,最后关闭报表:
If GBL_openInWord Then ' 隐藏打开报表,触发Form_Load填充数据 DoCmd.OpenReport "testReport", acViewPreview, , , acHidden ' 导出已经填充好内容的报表 DoCmd.OutputTo acOutputReport, "testReport", acFormatRTF, strFolderName & "/testReport.rtf", True ' 关闭隐藏的报表 DoCmd.Close acReport, "testReport" End If
方案2:把填充代码移到Report_Open事件
报表的Open事件在无论是界面显示还是导出时都会触发,比Form_Load更适合做初始化工作。你可以把原来Form_Load里的所有代码复制到报表的Report_Open事件中:
Private Sub Report_Open(Cancel As Integer) ' 原Form_Load中的所有填充代码都移到这里 FactuurInfo.setDebiteur GBL_debiteurId 'GBL_factuurId = FactuurInfo.getInfo("factuurId") 'Set date & location Datum_txt.Caption = "Ede, " & Format(Date, "dd MMMM yyyy") 'Set left part of header Header_left_info.Caption = FactuurInfo.getInfo("zaak") & vbNewLine & _ FactuurInfo.getInfo("referentie") & vbNewLine & _ "" 'Set right part of header Header_right_info.Caption = "Mr C.A. Hage" & vbNewLine & _ "0318 - 657635" & vbNewLine & _ "0318 - 657640" & vbNewLine & _ "harmsen@hageadvocaten.nl" 'Get text from templates table Dim maintext As String query = "SELECT * FROM Templates WHERE Id = " & GBL_templateId Set DB = CurrentDb Set rst = DB.OpenRecordset(query) rst.MoveLast 'Fill fields maintext = rst.Fields("Tekst").value 'replace keywords Dim str As String, openKeyWord As String, closeKeyWord As String Dim openPos As Integer Dim closePos As Integer Dim midBit As String openKeyWord = "\[" closeKeyWord = "\]" Do While (InStr(maintext, openKeyWord)) openPos = InStr(maintext, openKeyWord) closePos = InStr(maintext, closeKeyWord) midBit = Mid(maintext, openPos + Len(openKeyWord), closePos - openPos - Len(closeKeyWord)) maintext = Replace(maintext, openKeyWord & midBit & closeKeyWord, FactuurInfo.getInfo(midBit)) Loop 'replace newlines maintext = Replace(maintext, "\n", vbNewLine) Maintext_txt.Caption = maintext End Sub
修改后,原来的导出代码不需要改动,Report_Open会在导出时自动执行填充逻辑。
方案3:确认全局变量的有效性
有时候导出时全局变量(比如GBL_debiteurId、GBL_templateId)可能已经被重置,你可以在导出前添加调试代码确认:
If GBL_openInWord Then ' 打印变量值到即时窗口(按Ctrl+G查看) Debug.Print "当前GBL_debiteurId: " & GBL_debiteurId Debug.Print "当前GBL_templateId: " & GBL_templateId ' 后续导出代码... End If
如果变量值不对,需要调整代码确保导出时这些变量能正确获取到值。
为什么会出现这个问题?
Access的报表界面显示和导出的触发机制不同:当你在界面打开报表时,Form_Load事件会触发,动态填充控件内容;但DoCmd.OutputTo默认是直接基于报表的设计模板生成输出,不会触发那些仅在界面显示时才执行的事件,所以导出的内容是未填充的初始状态。
内容的提问来源于stack exchange,提问作者Gijs van der Meijde
相关产品推荐
相关产品推荐

