2

もう存在しないテンプレートにリンクしている一連の Word 文書があります。これは、ユーザーがそれらを開こうとする際に問題を引き起こしています。ドキュメントのリストを取得し、それぞれをループして、tempalte を null に設定できます。これで問題は解決しますが、変更前のテンプレートが何であったかを判断できません。

テンプレートを開いたときに利用できない場合、Word は添付されたテンプレートを Normal.dot(x) に置き換えます。ただし、検索しようとしているテンプレートは、ドキュメントの Tempaltes ダイアログにあります。AttachedTempalte() と get_AttachedTemplate().Name の両方が Normal.dot を返すのは、問題のドキュメントに Word の [テンプレート] ダイアログに別のテンプレートがリストされていることがわかっている場合です。

これは VBA でアクセスできますが、PS でこれができないのはもどかしいです。私がどこを台無しにしているのか誰にもわかりますか?

$word = new-object -comobject "Word.Application"
$doc = $word.Documents.Open({document path})
$word.Dialogs(Microsoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template()

戻り値:

Missing ')' in method call.
At :line:1 char:15
+ $word.Dialogs(M <<<< icrosoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template()

作業中の VBA:

Dim doc as Word.Document
Dim strTemplate as String
Set doc = Documents.Open(Filename:=filename, Visible:=False)
doc.Activate
strTemplate = Word.Dialogs(wdDialogsToolsTemplates).Template 

その後、strTemplate に表示されるはずのテンプレート名とパスを確認できます。

ps スクリプトを確認しましたが、 $doc.Activate を追加しても解決しないようです。また、相互運用機能と VBA が同じ wdDialog を使用していないことにも気付きました。PS は wdDialogToolsTemplates を使用し、VBA は wdDialogsToolsTemplates を使用します。PSでアセンブリを次のようにチェックしました

[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Word") | out-null
[Enum]::GetNames("Microsoft.Office.Interop.Word.WdDialogs")

正しいオプションが wdDialogToolsTemplates であることを確認しました。

4

2 に答える 2

0

PowerShell では、[] ブラケットを使用して型を指定し、次に :: を使用して型メンバーを指定する必要があるため、PowerShell コードの 3 行目は次のようになります。

$word.Dialogs([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates).Template()

powershell 列挙型に関する次のブログ記事を参照してください: Jeffrey SnoverまたはRichard Siddaway

于 2012-09-24T19:11:46.100 に答える
0

私は似たようなことをしようとしていますが、主な目的はWord文書内にコードを保存することではありません.

パワーシェル

PowerShell ルートを少し進めましたが、ダイアログ ボックスからパスを抽出する方法が見つかりません。

$objWord = New-Object -ComObject "Word.Application"
$objWord.Visible = $True
$objDoc = $objWord.Documents.Open("C:\path\to\document.doc")
$objToolsTemplates = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates)
$objDocStats = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogDocumentStatistics)

$objToolsTemplates.Show()どちらも、元の (利用できない) テンプレートへのパスを含むダイアログを GUI に表示させます$objToolsTemplates.Show()が、その情報をプログラムで抽出する方法が見つかりません。MSDN WdWordDialog Enumeration のドキュメントによると、両方のダイアログにTemplateプロパティが必要です。

VBScript

結局、代わりに VBS を使用する必要がありました。次のコードは、元の (使用できない) テンプレートのパスを示します。少なくともスクリプトです。

Option Explicit

Const wdDialogToolsTemplates = 87
Const wdDoNotSaveChanges = 0

Dim objWordApp
Dim objDoc
Dim dlgTemplate

Set objWordApp = CreateObject("Word.Application")
objWordApp.Visible = False
Set objDoc = objWordApp.Documents.Open("C:\path\to\document.doc")
Set dlgTemplate = objWordApp.Dialogs(wdDialogToolsTemplates)

Wscript.Echo dlgTemplate.Template

objDoc.Close(wdDoNotSaveChanges)
objWordApp.Quit
于 2015-04-09T14:20:12.637 に答える