Forms 将Excel值转换为PDF表单字段

Forms 将Excel值转换为PDF表单字段,forms,excel,pdf,vba,Forms,Excel,Pdf,Vba,objJSO.GetFieldstrField.Value=strFieldVal-这是我在上收到“类型不匹配”错误的行。 我从我的工程领域找到了代码库。这是一个古老的职位 我正在选择一个静态PDF表单,并尝试将excel文档中的值写入包含相同字段名的PDF表单。excel文档在c20-149列中有字段名,在d20-149中有这些字段的值。我正在尝试将这些字段的值写入选定的PDF表单 Option Explicit 子btnToPDF\u单击 Dim objAcroApp As Object

objJSO.GetFieldstrField.Value=strFieldVal-这是我在上收到“类型不匹配”错误的行。 我从我的工程领域找到了代码库。这是一个古老的职位

我正在选择一个静态PDF表单,并尝试将excel文档中的值写入包含相同字段名的PDF表单。excel文档在c20-149列中有字段名,在d20-149中有这些字段的值。我正在尝试将这些字段的值写入选定的PDF表单

Option Explicit
子btnToPDF\u单击

Dim objAcroApp As Object
Dim objAcroAVDoc As Object
Dim objAcroPDDoc As Object
Dim objJSO As Object
Dim fd As Office.FileDialog
Dim strFile As String
Dim strField As String
Dim strFieldVal As String 'Used to hold the field value
Dim r As Long 'Used to increase row number for strfield name

'Disable screen flickering.
    Application.ScreenUpdating = False

'Choose the Onsite Survey form you want to fill
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd

        .AllowMultiSelect = False

        .Title = "Please select the On-site survey PDF."
        .Filters.Clear
        .Filters.Add "PDF", "*.PDF"
        '.Filters.Add "All Files", "*.*"

    'If the .Show method returns False, the user clicked Cancel.
        If .Show = True Then
            strFile = .SelectedItems(1)
            MsgBox (strFile)
        End If
    End With

'Initialize Acrobat by creating the App object.
    Set objAcroApp = CreateObject("AcroExch.App")

'Check if the object was created.
    If Err.Number <> 0 Then
        MsgBox "Could not create the App object!", vbCritical, "Object error"
        'Release the object and exit.
        Set objAcroApp = Nothing
        Exit Sub
    End If

'Create the AVDoc object.
Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")

    'Check if the object was created.
        If Err.Number <> 0 Then
            MsgBox "Could not create the AVDoc object!", vbCritical, "Object error"
        'Release the objects and exit.
            Set objAcroAVDoc = Nothing
            Set objAcroApp = Nothing
            Exit Sub
        End If

    On Error GoTo 0

'Open the PDF file.
    If objAcroAVDoc.Open(strFile, "") = True Then

        'Set the PDDoc object.
            Set objAcroPDDoc = objAcroAVDoc.GetPDDoc

        'Set the JS Object - Java Script Object.
            Set objJSO = objAcroPDDoc.GetJSObject

            On Error GoTo 0

        'Fill the form fields.
            For r = 20 To 149
                strField = Cells(r, 3)
                strFieldVal = Cells(r, 4)

                objJSO.GetField(strField).Value = CStr(strFieldVal)


                If Err.Number <> 0 Then

                    'Close the form without saving the changes.
                    objAcroAVDoc.Close True

                    'Close the Acrobat application.
                    objAcroApp.Exit

                    'Inform the user about the error.
                    MsgBox "The field """ & strField & """ could not be found!", vbCritical, "Field error"

                    'Release the objects and exit.
                    Set objJSO = Nothing
                    Set objAcroPDDoc = Nothing
                    Set objAcroAVDoc = Nothing
                    Set objAcroApp = Nothing
                    Exit Sub

                End If
        Next r


    'Save the form
        objAcroPDDoc.Save 1, strFile

    'Close the form without saving the changes.
        'objAcroAVDoc.Close True


    'Close the Acrobat application.
        objAcroApp.Exit

    'Release the objects.
        Set objJSO = Nothing
        Set objAcroPDDoc = Nothing
        Set objAcroAVDoc = Nothing
        Set objAcroApp = Nothing



    'Enable the screen.
        Application.ScreenUpdating = True

    'Inform the user that forms were filled.
        MsgBox "All forms were created successfully!", vbInformation, "Finished"
End If
    MsgBox "Something bad happend :(...."
Dim objAcroApp As Object
Dim objAcroAVDoc As Object
Dim objAcroPDDoc As Object
Dim objJSO As Object
Dim fd As Office.FileDialog
Dim myWB As Workbook
Set myWB = ThisWorkbook
Dim ToPDFsh As Worksheet
Set ToPDFsh = myWB.Sheets("OSSDataDump")
Dim strFile As String
Dim strField As String
Dim strFieldVal As String 'Used to hold the field value
Dim msgFail As String
Dim colVal As Variant
Dim r As Integer 'Used to increase row number for strfield name
Dim e As Integer 'Used to track the number of errors
Dim colFail As Collection
Set colFail = New Collection
e = 0


'Disable screen flickering.
    Application.ScreenUpdating = False

'Choose the Onsite Survey form you want to fill
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd

        .AllowMultiSelect = False

        .Title = "Please select the On-site survey PDF."
        .Filters.Clear
        .Filters.Add "PDF", "*.PDF"


    'If the .Show method returns False, the user clicked Cancel.
        If .Show = True Then
            strFile = .SelectedItems(1)

        End If
    End With

'Initialize Acrobat by creating the App object.
    Set objAcroApp = CreateObject("AcroExch.App")

'Check if the object was created.
    If Err.Number <> 0 Then
        MsgBox "Could not create the App object!", vbCritical, "Object error"
        'Release the object and exit.
        Set objAcroApp = Nothing
        Exit Sub
    End If


'Create the AVDoc object.
Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")

    'Check if the object was created.
        If Err.Number <> 0 Then
            MsgBox "Could not create the AVDoc object!", vbCritical, "Object error"
        'Release the objects and exit.
            Set objAcroAVDoc = Nothing
            Set objAcroApp = Nothing
            Exit Sub
        End If


'Open the PDF file.
    If objAcroAVDoc.Open(strFile, "") = True Then

        'Set the PDDoc object.
            Set objAcroPDDoc = objAcroAVDoc.GetPDDoc

        'Set the JS Object - Java Script Object.
            Set objJSO = objAcroPDDoc.GetJSObject


        'Fill the form fields.
            For r = 20 To 149
                strField = ToPDFsh.Cells(r, 3).Value
                strFieldVal = ToPDFsh.Cells(r, 4).Value
                    If strFieldVal = "" Then GoTo BlankVal

                objJSO.GetField(strField).Value = strFieldVal

                On Error GoTo ErrHandler

结束Sub

我很确定你想要

strField = Cells(r, 3).Value
strFieldVal = Cells(r, 4).Value
objJSO.GetField(strField).Value = strFieldVal

…而不是您拥有的三条对应行。

好的。。。发现了我的问题,但我不确定如何解决问题。我可能不需要,因为我希望我不会遇到这个问题。但希望不是最好的策略…: 我的PDF表单具有数字类型的字段。我的值单元格中的所有测试数据都是字母数字。一旦我在excel文档中将数量和成本单元格更改为数值,表单就正确编写了。 也许我可以测试PDF表单字段类型。如果是数字,我将记录字段名,并在操作结束时显示一个msgbox,其中显示无法填充的字段。
我确实需要将objJSO行更正为“=strFieldVal”

下面是我的最终代码。它包括基本的错误处理,更像日志记录。我在这方面确实有一个问题;如果我正在向PDF字段中写入字母数字字符串,而PDF字段是数字字段,并且PDF字段中没有默认值,则PDF会抛出错误,代码无法捕获。只要PDF数字字段中有默认值,错误处理程序就会按计划工作。请随意发表意见。我猜这看起来像幼儿园的工作也许是一年级?? `选项显式

子btnToPDF\u单击

Dim objAcroApp As Object
Dim objAcroAVDoc As Object
Dim objAcroPDDoc As Object
Dim objJSO As Object
Dim fd As Office.FileDialog
Dim strFile As String
Dim strField As String
Dim strFieldVal As String 'Used to hold the field value
Dim r As Long 'Used to increase row number for strfield name

'Disable screen flickering.
    Application.ScreenUpdating = False

'Choose the Onsite Survey form you want to fill
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd

        .AllowMultiSelect = False

        .Title = "Please select the On-site survey PDF."
        .Filters.Clear
        .Filters.Add "PDF", "*.PDF"
        '.Filters.Add "All Files", "*.*"

    'If the .Show method returns False, the user clicked Cancel.
        If .Show = True Then
            strFile = .SelectedItems(1)
            MsgBox (strFile)
        End If
    End With

'Initialize Acrobat by creating the App object.
    Set objAcroApp = CreateObject("AcroExch.App")

'Check if the object was created.
    If Err.Number <> 0 Then
        MsgBox "Could not create the App object!", vbCritical, "Object error"
        'Release the object and exit.
        Set objAcroApp = Nothing
        Exit Sub
    End If

'Create the AVDoc object.
Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")

    'Check if the object was created.
        If Err.Number <> 0 Then
            MsgBox "Could not create the AVDoc object!", vbCritical, "Object error"
        'Release the objects and exit.
            Set objAcroAVDoc = Nothing
            Set objAcroApp = Nothing
            Exit Sub
        End If

    On Error GoTo 0

'Open the PDF file.
    If objAcroAVDoc.Open(strFile, "") = True Then

        'Set the PDDoc object.
            Set objAcroPDDoc = objAcroAVDoc.GetPDDoc

        'Set the JS Object - Java Script Object.
            Set objJSO = objAcroPDDoc.GetJSObject

            On Error GoTo 0

        'Fill the form fields.
            For r = 20 To 149
                strField = Cells(r, 3)
                strFieldVal = Cells(r, 4)

                objJSO.GetField(strField).Value = CStr(strFieldVal)


                If Err.Number <> 0 Then

                    'Close the form without saving the changes.
                    objAcroAVDoc.Close True

                    'Close the Acrobat application.
                    objAcroApp.Exit

                    'Inform the user about the error.
                    MsgBox "The field """ & strField & """ could not be found!", vbCritical, "Field error"

                    'Release the objects and exit.
                    Set objJSO = Nothing
                    Set objAcroPDDoc = Nothing
                    Set objAcroAVDoc = Nothing
                    Set objAcroApp = Nothing
                    Exit Sub

                End If
        Next r


    'Save the form
        objAcroPDDoc.Save 1, strFile

    'Close the form without saving the changes.
        'objAcroAVDoc.Close True


    'Close the Acrobat application.
        objAcroApp.Exit

    'Release the objects.
        Set objJSO = Nothing
        Set objAcroPDDoc = Nothing
        Set objAcroAVDoc = Nothing
        Set objAcroApp = Nothing



    'Enable the screen.
        Application.ScreenUpdating = True

    'Inform the user that forms were filled.
        MsgBox "All forms were created successfully!", vbInformation, "Finished"
End If
    MsgBox "Something bad happend :(...."
Dim objAcroApp As Object
Dim objAcroAVDoc As Object
Dim objAcroPDDoc As Object
Dim objJSO As Object
Dim fd As Office.FileDialog
Dim myWB As Workbook
Set myWB = ThisWorkbook
Dim ToPDFsh As Worksheet
Set ToPDFsh = myWB.Sheets("OSSDataDump")
Dim strFile As String
Dim strField As String
Dim strFieldVal As String 'Used to hold the field value
Dim msgFail As String
Dim colVal As Variant
Dim r As Integer 'Used to increase row number for strfield name
Dim e As Integer 'Used to track the number of errors
Dim colFail As Collection
Set colFail = New Collection
e = 0


'Disable screen flickering.
    Application.ScreenUpdating = False

'Choose the Onsite Survey form you want to fill
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd

        .AllowMultiSelect = False

        .Title = "Please select the On-site survey PDF."
        .Filters.Clear
        .Filters.Add "PDF", "*.PDF"


    'If the .Show method returns False, the user clicked Cancel.
        If .Show = True Then
            strFile = .SelectedItems(1)

        End If
    End With

'Initialize Acrobat by creating the App object.
    Set objAcroApp = CreateObject("AcroExch.App")

'Check if the object was created.
    If Err.Number <> 0 Then
        MsgBox "Could not create the App object!", vbCritical, "Object error"
        'Release the object and exit.
        Set objAcroApp = Nothing
        Exit Sub
    End If


'Create the AVDoc object.
Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")

    'Check if the object was created.
        If Err.Number <> 0 Then
            MsgBox "Could not create the AVDoc object!", vbCritical, "Object error"
        'Release the objects and exit.
            Set objAcroAVDoc = Nothing
            Set objAcroApp = Nothing
            Exit Sub
        End If


'Open the PDF file.
    If objAcroAVDoc.Open(strFile, "") = True Then

        'Set the PDDoc object.
            Set objAcroPDDoc = objAcroAVDoc.GetPDDoc

        'Set the JS Object - Java Script Object.
            Set objJSO = objAcroPDDoc.GetJSObject


        'Fill the form fields.
            For r = 20 To 149
                strField = ToPDFsh.Cells(r, 3).Value
                strFieldVal = ToPDFsh.Cells(r, 4).Value
                    If strFieldVal = "" Then GoTo BlankVal

                objJSO.GetField(strField).Value = strFieldVal

                On Error GoTo ErrHandler
ErrHandlerExit: '关闭表单而不保存更改。 objacravdoc.Close为真

'Close the Acrobat application.
objAcroApp.Exit

'Release the objects and exit.
Set objJSO = Nothing
Set objAcroPDDoc = Nothing
Set objAcroAVDoc = Nothing
Set objAcroApp = Nothing

'Enable the screen.
Application.ScreenUpdating = True
Exit Sub

结束子项`

确定。。。我发现了我的问题,但我不知道如何解决它。它一直在工作,直到我将PDF表单字段类型设置为number。然后它抛出一个类型不匹配。关于如何解决这个问题有什么建议吗?您确定单元格中的字段名和值是相同的吗?PDF中的字段名区分大小写。如果使用字符串文字会发生什么情况?这是有道理的-类型不匹配不是来自设置值的脚本,而是来自字段验证。Acrobat中文本字段的所有字段值都是字符串。。。总是但是,如果将字段格式设置为数字,将运行验证脚本,检查输入的值是否可以转换为数字。不幸的是,Acrobat中的JavaScript以及JSO不能告诉您字段的格式脚本,只能告诉您类型,无论在“格式”选项卡中设置了什么,所有文本字段都将是文本。也许你可以用try/catch来包围代码。