【问题标题】:Creating Word documents from templates in Access VBA在 Access VBA 中从模板创建 Word 文档
【发布时间】:2020-03-28 06:29:05
【问题描述】:

我从大约 20 年前构建它的人那里继承了一个 Access 数据库。最近,对于 90 位使用该功能的用户来说,从通过访问权限填充的模板创建 Word 文档的功能已停止对某些用户工作。我已经安装和重新安装了很多次办公室,我已经制作了彼此相同的机器,但仍然有一台可以工作,一台不能。我希望下面的函数足以让那些比我更了解 VBA 的人看到一些错误。

我做了一些研究,起初我认为它会丢失参考文献,但可以 100% 确定它不是。所有用户都在运行访问运行时 2000 以及 Office 2010 和 Office 365 的混合版本,工作的用户同时使用 Office 365 和 Office 2010。

请查看下面的函数,如果代码有任何明显的地方,请告诉我,如果需要更多信息,请告诉我很乐意提供。

编辑* 我目前面临的问题是用户单击“创建文档”按钮,然后它似乎什么也没做。它不会出错,不会创建文档,也不会像应有的那样全屏打开 word。但是,它确实会进入下一部分,询问他们是否愿意将其记录在日志中。我注意到它似乎试图打开 Word,我已经看到使用“Procmon”但没有在前台打开。

    Public Sub PRINT_DOC(TEMPLAT As String)

    Dim oword As Word.Application

'   Array bound increased from 20 to 100 [v1.1]
    Dim FIELDNAME(100) As String
    Dim strSQL As String
    Dim FILE_STR As String
    Dim dbs As Database
    Dim COUNTER As Integer
    Dim COUNTA As Integer
    On Error GoTo notloaded

    Dim theError As Integer

    Err.NUMBER = 0
    Set oword = New Word.Application

notloaded:
    If Err.NUMBER = 429 Then
        Set oword = New Word.Application
        theError = Err.NUMBER
    End If

On Error GoTo Err_PRINT_DOC
    DoCmd.Hourglass True


    oword.Documents.Add TEMPLAT

    oword.Visible = True
    oword.Activate


    COUNTER = oword.ActiveDocument.FormFields.COUNT
    For COUNTA = 1 To COUNTER
        FIELDNAME(COUNTA) = oword.ActiveDocument.FormFields(COUNTA).Name
    Next

    For COUNTA = 1 To COUNTER
        Select Case FIELDNAME(COUNTA)
            Case "CONTACT": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![CONTACT]
            Case "ADDRESS": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![FULL_ADDRESS]
            Case "REFERENCE": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![REFERENCE]
            Case "FAX": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![FAX_NO]
            Case "SUBJECT": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![JOBTITLE] & " - " & Forms![frm_correspondence]![SUBJECT]
            Case "JOB": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![JOBTITLE]
            Case "REPORT": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![SUBJECT]
            Case "DATE": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![DATE]
            Case "SIGNED": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![SIGNED]
            Case "FROM": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![FROM]
            Case "TO": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![TO]
            Case "CC": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![CC]
            Case "DEAR": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![DEAR]

            Case "INVOICE_SUM": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![INVOICE SUM]
            Case "INVOICE_VAT": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![INVOICE VAT]
            Case "INVOICE_NOTES": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![INVOICE NOTES]
             Case "INVOICE_NUMBER": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![INVOICE NO]
            Case "INVOICE_TOTAL": oword.ActiveDocument.FormFields(COUNTA).SELECT
                            oword.Selection.InsertBefore Forms![frm_correspondence]![INVOICE TOTAL]
        End Select
    Next

    oword.Visible = True
    oword.Activate

    If Forms![frm_correspondence]![COR PATH] <> "" And Not IsNull(Forms![frm_correspondence]![COR PATH]) Then
        FILE_STR = Forms![frm_correspondence]![COR PATH] & "\" & Forms![frm_correspondence]![FILE REF]
        oword.ActiveDocument.SaveAs FILENAME:=FILE_STR
    End If
    DoCmd.Hourglass False
    Set oword = Nothing

Exit_PRINT_DOC:
    Exit Sub

Err_PRINT_DOC:
    MsgBox Error$, vbExclamation, APP_NAME
    Resume Exit_PRINT_DOC
End Sub 

【问题讨论】:

  • 已经停止工作是什么意思确切? -- 还有Access 2000 运行时,真的吗?这有点过时了。
  • 已在原始帖子中添加了一个编辑,解释了什么不起作用。是的,我知道 access 2000 已经过时了。
  • 好的。您必须设置断点并单步执行代码,以查看失败的确切位置。那么我们也许可以提供帮助。见How to debug VBA code

标签: vba ms-access


【解决方案1】:

尝试像这样使用后期绑定

Dim oword As  Object: set oword = CreateObject("Word.Application")

插入

Dim oword As Word.Application

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多