Поиск строки в файле PDF работает из Word, но не работает из Excel - PullRequest
1 голос
/ 09 мая 2019

Я новичок в VBA, поэтому извините, если я совершаю какую-то базовую ошибку.

Я ищу строку в таблице внутри файла PDF с использованием сценария VBA.Скрипт работает нормально при вызове из слова, но не работает правильно при вызове из Excel.

В моем PDF-файле много таблиц, и конечная цель - получить номер таблицы, содержащей определенную строку.

Я включил приведенный ниже код.

Sub FindTableno()

Dim oTbl As Table
Dim oRow As Row
Dim oCell As Cell
Dim tblno As Integer

On Error Resume Next
    ' Create a "FileDialog" object as a File Picker dialog box.
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim sfileName As String

    With fd
        .AllowMultiSelect = False
        .Filters.Clear
        .Title = "Select a PDF File"
        .Filters.Add "All PDF Documents", "*.pdf?", 1

        If .Show = True Then
            sfileName = Dir(.SelectedItems(1))      ' Get the file.
        End If
    End With

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    If Trim(sfileName) <> "" Then
        Dim objWord As Object       ' Create a Word object.
        Set objWord = CreateObject("Word.Application")
        objWord.Visible = False      ' Do not show the file.

    ' Create a Document object and open the Word file.
    Dim objDoc As Word.Document
    Set objDoc = objWord.Documents.Open(FileName:=fd.InitialFileName & sfileName, Format:="PDF Files", ConfirmConversions:=False)

    ' Search within tables in selected PDF file
    objDoc.Activate

    If ActiveDocument.Tables.Count > 0 Then
        tblno = 1
        For Each oTbl In ActiveDocument.Tables
            For Each oRow In oTbl.Rows
                For Each oCell In oRow.Cells
                oCell.Select
                Selection.Find.Execute FindText:="Nutrition Information"
                If Selection.Find.Found = True Then
                MsgBox (tblno)
                Exit Sub
            Else
            End If
            Next
            Next
            tblno = tblno + 1
            Next
        End If
        MsgBox ("Not Found, Total Tables Searched:" & ActiveDocument.Tables.Count)

    End If
        Dim X As Variant
        X = Shell("powershell.exe kill -processname winword", 1)
End Sub

Я пишу больший код VBA, который работает в Excel, поэтому этот код должен работать в Excel.Любые предложения будут полезны.Благодаря.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Спасибо @ Pᴇʜ, у меня это сработало

Sub FindTableno()

Dim oTbl As Table
Dim oRow As Row
Dim oCell As Cell
Dim tblno As Integer

' Create a "FileDialog" object as a File Picker dialog box.
Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
Dim sfileName As String

With fd
    .AllowMultiSelect = False
    .Filters.Clear
    .Title = "Select a PDF File"
    .Filters.Add "All PDF Documents", "*.pdf?", 1

    If .Show = True Then
        sfileName = Dir(.SelectedItems(1))      ' Get the file.
    End If
End With

Application.ScreenUpdating = True
Application.DisplayAlerts = True

If Trim(sfileName) <> "" Then
    Dim objWord As Object       ' Create a Word object.
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = True      ' Do not show the file.

' Create a Document object and open the Word file.
Dim objDoc As Word.Document
'Set objDoc = objWord.Documents.Open(Filename:=fd.InitialFileName & sfileName, Format:="PDF Files", ConfirmConversions:=False)
 Set objDoc = objWord.Documents.Open(Filename:=fd.InitialFileName & sfileName, Format:="PDF Files", ConfirmConversions:=False)

' Search within tables in selected PDF file

If objDoc.Tables.count > 0 Then
    tblno = 1
    For Each oTbl In objDoc.Tables
        For Each oRow In oTbl.Rows
            For Each oCell In oRow.Cells
            pos = InStr(oCell.Range.Text, "Nutrition Information ")
            If pos <> 0 Then
            GoTo line1
            End If
        'Else
        'End If
        Next
        Next
        tblno = tblno + 1
        Next
    End If
    MsgBox ("Not Found, Total Tables Searched:" & objDoc.Tables.count)
    'MsgBox (oCell.Range.Text)
End If
line1:
MsgBox (tblno)
End Sub
0 голосов
/ 09 мая 2019

Основная проблема в этой части, где вы используете oCell.Select, а затем Selection.Find.В этом случае Selection относится к выбранной ячейке в Excel!Это потому, что вы не указали здесь никакого отношения к Word, поэтому Excel предполагает, что вы имеете в виду выделенную ячейку в Excel.

Я рекомендую прочитать Как не использовать Select в Excel VBA .То же самое относится и к коду Word VBA.

Также не используйте .Activate, иначе вы получите похожую проблему.Всегда обращайтесь непосредственно к рабочему листу или документу:

If objDoc.Tables.Count > 0 Then
    tblno = 1
    For Each oTbl In objDoc.Tables
        For Each oRow In oTbl.Rows
            For Each oCell In oRow.Cells
                oCell.Range.Find.Execute FindText:="Nutrition Information"
                If oCell.Range.Find.Found = True Then
                    MsgBox (tblno)
                    Exit Sub
                End If
            Next
        Next
        tblno = tblno + 1
    Next
End If

MsgBox ("Not Found, Total Tables Searched:" & objDoc.Tables.Count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...