2017-08-25 15 views
8

PDF(画像ではありません)から一連の.doc文書を取得するためにVBAコーディングを使用しようとしています。さまざまなPDFファイルをループしてMS Word形式で保存しようとしています。私の経験では、私が持っているPDF文書は、その単語がかなりうまく読めるということです。単語は、ほとんどの場合、PDFファイルの正しいレイアウトを維持しています。私はこれが正しい選択であるかどうかわからないので、可能ならばRを使って代替案を尋ねる。とにかくPDFファイルをループして単語で文書に変換する

は、ここでそれは私がhereを見つけたコードです:開発者のウィンドウに貼り付けた後

Sub convertToWord() 

    Dim MyObj As Object, MySource As Object, file As Variant 

    file = Dir("C:\Users\username\work_dir_example" & "*.pdf") 'pdf path 

    Do While (file <> "") 

    ChangeFileOpenDirectory "C:\Users\username\work_dir_example" 

      Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ 
     False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ 
     "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ 
     Format:=wdOpenFormatAuto, XMLTransform:="" 

    ChangeFileOpenDirectory "C:\Users\username\work_dir_example" 

    ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ 
     , LockComments:=False, Password:="", AddToRecentFiles:=True, _ 
     WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ 
     SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ 
     False, CompatibilityMode:=15 

    ActiveDocument.Close 

    file = Dir 

    Loop 

End Sub 

、私はモジュール内のコードを保存する - >私は、開発者のウィンドウを閉じる - >私は上をクリック"マクロ"ボタン→ "convertToWord"マクロを実行します。ポップアップボックスに「SubまたはFunction not defined」というエラーが表示されます。これをどうやって解決するのですか?また、以前は何らかの理由で今私には分かりませんが、関数ChangeFileOpenDirectoryに関連するエラーがありましたが、これも定義されていないようです。

更新27/08/2017

私を次のようにコードを変更:

Sub convertToWord() 

    Dim MyObj As Object, MySource As Object, file As Variant 

    file = Dir("C:\Users\username\work_dir_example" & "*.pdf") 

    ChDir "C:\Users\username\work_dir_example" 

    Do While (file <> "") 

     Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ 
     False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ 
     "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ 
     Format:=wdOpenFormatAuto, XMLTransform:="" 

     ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ 
     , LockComments:=False, Password:="", AddToRecentFiles:=True, _ 
     WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ 
     SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ 
     False, CompatibilityMode:=15 

    ActiveDocument.Close 

    file = Dir 

    Loop 

End Sub 

今、私はポップアップボックス内のすべてのエラーメッセージを得ることはありませんが、何も出力はありません私の作業ディレクトリにあります。今は何が間違っているのでしょうか?

+2

(a)は、 'ディレクトリ( "C:\ Users \ユーザー... T" & "* .PDF") 'あなたのディレクトリが' t'で終わることを暗示していますか?もしそうなら、 'Dir(" C:\ Users \ ... t \ "&" * .pdf ")'(または、 ... t \ *。pdf ")')。 (b) 'ChangeFileOpenDirectory'がなぜ失敗するのか分かりません。あなたが指定したディレクトリが存在しなかったか、またはあなたがそれにアクセスできなかったのでしょうか? – YowE3K

+1

2つの 'ChangeFileOpenDirectory ...'行だけを削除してください。フルパスでファイルを開いて保存する – jsotola

+0

私はいくつかの提案を試みました。私は質問を更新します。 –

答えて

2

(XMLます)Word文書をPDFファイルを読み書きすることができ、任意の言語、しかし(PDFが開かれたときにWordがいた)あなたが好きな変換はアプリケーションのためのAPIを使用して必要になります自体。 VBAはあなたの簡単なオプションです。

投稿したスニペット(および下のサンプル)は、アーリーバインディングと列挙定数を使用しています。つまり、Wordオブジェクトライブラリへの参照が必要です。これはWord文書に記述したコードに対して既に設定されているため、新しいWord文書を作成して標準モジュールにコードを追加します。 (詳細が必要な場合はExcel tutorialを参照してください。プロセスの手順は同じです)。

(実行ボタンを使用して)VBエディタまたは通常のドキュメントウィンドウ(Word 2010-2016の[表示]タブの[マクロ]ボタンをクリック)からマクロを実行できます。コードを再設定せずにマクロを再利用する場合は、ドキュメントをDOCMファイルとして保存します。

コードのために今すぐ!

コメントに記載されているとおり、フォルダパスが円記号「\」で終わっていることを確認するだけで、2番目のスニペットが有効になります。それはあなたがそれを修正した後にはまだ素晴らしいコードではありませんが、それはあなたを動かすでしょう。

私はあなたが余分なマイルに行きたいと思って、後で再利用したり拡張したりできる、よく書かれたバージョンを持っていると思います。簡単にするために、主変換とPDF変換警告ダイアログ(レジストリによって制御)を抑制する手順の2つの手順を使用します。

Mainプロシージャ:

Sub ConvertPDFsToWord2() 
    Dim path As String 
    'Manually edit path in the next line before running 
    path = "C:\users\username\work_dir_example\" 

    Dim file As String 
    Dim doc As Word.Document 
    Dim regValPDF As Integer 
    Dim originalAlertLevel As WdAlertLevel 

'Generate string for getting all PDFs with Dir command 
    'Check for terminal \ 
    If Right(path, 1) <> "\" Then path = path & "\" 
    'Append file type with wildcard 
    file = path & "*.pdf" 

    'Get path for first PDF (blank string if no PDFs exist) 
    file = Dir(file) 

    originalAlertLevel = Application.DisplayAlerts 
    Application.DisplayAlerts = wdAlertsNone 

    If file <> "" Then regValPDF = TogglePDFWarning(1) 

    Do While file <> "" 
     'Open method will automatically convert PDF for editing 
     Set doc = Documents.Open(path & file, False) 

     'Save and close document 
     doc.SaveAs2 path & Replace(file, ".pdf", ".docx"), _ 
        fileformat:=wdFormatDocumentDefault 
     doc.Close False 

     'Get path for next PDF (blank string if no PDFs remain) 
     file = Dir 
    Loop 

CleanUp: 
    On Error Resume Next 'Ignore errors during cleanup 
    doc.Close False 
    'Restore registry value, if necessary 
    If regValPDF <> 1 Then TogglePDFWarning regValPDF 
    Application.DisplayAlerts = originalAlertLevel 

End Sub 

レジストリ設定機能:

Private Function TogglePDFWarning(newVal As Integer) As Integer 
'This function reads and writes the registry value that controls 
'the dialog displayed when Word opens (and converts) a PDF file 
    Dim wShell As Object 
    Dim regKey As String 
    Dim regVal As Variant 

    'setup shell object and string for key 
    Set wShell = CreateObject("WScript.Shell") 
    regKey = "HKCU\SOFTWARE\Microsoft\Office\" & _ 
      Application.Version & "\Word\Options\" 

    'Get existing registry value, if any 
    On Error Resume Next 'Ignore error if reg value does not exist 
    regVal = wShell.RegRead(regKey & "DisableConvertPdfWarning") 
    On Error GoTo 0  'Break on errors after this point 

    wShell.regwrite regKey & "DisableConvertPdfWarning", newVal, "REG_DWORD" 

    'Return original setting/registry value (0 if omitted) 
    If Err.Number <> 0 Or regVal = 0 Then 
     TogglePDFWarning = 0 
    Else 
     TogglePDFWarning = 1 
    End If 

End Function 
+0

私は 'TogglePDFWarning'関数に問題があります。これを別のモジュールに挿入しますか?適切に呼び出すにはライブラリが必要ですか? –

+0

私は問題を解決しました。私はプロシージャとしてプライベート関数を入力する必要がありました。あなたは答えを得ることができました - そして、あなたが正当な時であるかどうかを確認することができませんでした - あなたに追加の25ポイントを寄付する方法がありますか? –

+0

賞品を受け取った。チェックインしていただきありがとうございます! – AjimOthy

1

他の人が述べたように、この問題はほとんどの場合、ファイル名&のように見えます。ここにいくつかの変更を加えて投稿したコードの2番目のバージョンがあります。

残念ながら、警告メッセージが表示され、DisplayAlertsをfalseに設定しても、警告メッセージは表示されません。しかし、最初にポップアップしたときに「このメッセージをもう一度表示しない」チェックボックスをクリックすると、すべてのファイルについてポップアップが継続されません。

Sub convertToWord() 

    Dim MyObj  As Object 
    Dim MySource As Object 
    Dim file  As String 
    Dim path  As String 

    path = "C:\Users\username\work_dir_example\" 
    file = Dir(path & "*.pdf") 

    Do While (file <> "") 
     Documents.Open FileName:=path & file 
     With ActiveDocument 
      .SaveAs2 FileName:=Replace(path & file, ".pdf", ".docx"), _ 
           FileFormat:=wdFormatXMLDocument 
      .Close 
     End With 
     file = Dir 
    Loop 

End Sub 
これを行うことができ
関連する問題