2017-02-22 9 views
4

Word文書/テンプレートを開き、特定のファイル名を持つWord文書をPDFとして保存するExcelユーザーフォーム/ワークシートがありますフォルダ。VBAレイトバインディング - Word参照を持たないユーザーのコンピュータに基づくユーザーフォームの場合

私のExcelでの参照では、Word Object Libraryが有効になっています。私のuserformは、これらの参照が有効になっていない他のユーザーのコンピュータで使用されます(すべてのユーザーが有効にするには面倒です)。

私が知っているコードは「初期バインディング」であり、他のユーザーがWordへの参照を有効にする必要性を回避するためには「遅延バインディング」である必要があります。

私の問題は、私は知っているか私のコードでこれを行う方法を理解していないです。

Dim objWord As Word.Application 
Dim docWord As Word.Document 

Set objWord = CreateObject("Word.Application") 
Set docWord = objWord.Documents.Open(ThisWorkbook.Path & "\MyNewWordDocument.doc") 

docWord.ExportAsFixedFormat OutputFileName:=ThisWorkbook.Path & "\" + Cells(1, 6) + " - Offer Letter.pdf", _ 
ExportFormat:=wdExportFormatPDF 

objWord.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges 
objWord.Quit 

このコードは、自分のために完全に機能しています。しかし、言及されているように、それは有効にされていないWordへの参照のために他人のために働かない。

+1

参照文書ではなく、Wordのインストールを以下。 Word *がインストールされていない他のユーザーは*ですか? – Comintern

+5

あなたは*あなたのオブジェクトを 'Word .__ something__'と宣言することで*アーリーバインディング*を使用しました。代わりに、それらをジェネリックな 'As Object'型として宣言してください。また、コードで明示的に宣言する必要がある列挙定数については注意してください。 –

+0

あなたのユーザーにWordがインストールされていない場合、 'CreateObject(" Word.Application ")'は何をすべきでしょうか? –

答えて

9

他のユーザーがすべて同じバージョンのOfficeを使用している場合は、問題はありません。彼らは、異なるバージョンを持っている場合は、あなただけのオブジェクトとして変数を宣言すると、Wordのライブラリからあなたが使用するすべての定数を宣言する必要後半バインド、する必要があります:

Dim objWord As Object 
Dim docWord As Object 
const wdExportFormatPDF as long = 17 
const wdDoNotSaveChanges as long = 0 

Set objWord = CreateObject("Word.Application") 
Set docWord = objWord.Documents.Open(ThisWorkbook.Path & "\MyNewWordDocument.doc") 

docWord.ExportAsFixedFormat OutputFileName:=ThisWorkbook.Path & "\" + _ Cells(1, 6) + " - Offer Letter.pdf", _ 
ExportFormat:=wdExportFormatPDF 

objWord.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges 
objWord.Quit 

また、Wordの参照を削除する必要があります。

は同様にプラグを追加することがありますhttp://excelmatters.com/2013/09/23/vba-references-and-early-binding-vs-late-binding/

+0

レイトバインディングを使用しているとき、 'ExportFormat:= wdExportFormatPDF'の結果にエラーがあってはなりませんか?それは 'ExportFormat:= 17'ではないでしょうか?また、 'objWord.ActiveDocument.Close SaveChanges:= wdDoNotSaveChanges'? –

+7

@ShaiRado Nope - コードで定数を宣言しました。私はコードラインにリテラル値を置くことを好みます。 – Rory

+0

あなたは絶対に正しいです、私の悪い:) –

関連する問題