1

Word ドキュメントで変更された変更日をチェックする Excel プロジェクトがあり、変更されている場合はそのドキュメントを開き、Word フォーム フィールドからテキストを Excel にインポートします。

Word 文書を開いてインポートする Excel のルーチンは次のとおりです。

Sub CopyFromWord(pFile as String,aFile as string)

Dim wdApp As Object

On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then
    Set wdApp = CreateObject("Word.Application")
Else 'word is already running
End If
On Error Goto 0

Set wdDoc = wdApp.Documents.Open(Filename:="" & pFile & "", ReadOnly:=True)
wdApp.Visible = False
   For Each c In wdDoc.bookmarks
    'removed code that copies values from word doc fields to excel sheet
   Next c
wdApp.Activedocument.Close SaveChanges:=False

End Sub

Word 文書はすべて、同じファイルのコピーとして開始されました。ファイルのコピーは数千ありますが、それぞれが一意の名前を持つ独自のフォルダーに配置されています。

ユーザーは、必要なフォルダーを見つけて、そのフォルダー内の Word ドキュメントを開きます。ユーザーフォームを表示し、ドキュメントのフォームフィールドにユーザーフォームへの入力を入力します。コマンド ボタンは、フォームを保存して終了します。

ドキュメントを開くとウェルカム メッセージ/ユーザー フォームが自動的に読み込まれるため、次のコードをドキュメントの open イベントに追加しました。

Sub Document_Open()

If ThisDocument.ReadOnly = True then Exit Sub

msgbox "Welcome " & Environ$("Username") & ". Click OK to begin."
Userform1.show

End sub

これにより、Excel プロジェクトがすべてのファイルをループするときに、ファイルが変更されていることがわかった場合は、ファイルを開く (読み取り専用) 必要があるため、ユーザーフォーム/ウェルカム メッセージで中断されることなくデータをインポートし、閉じて、実行できます。変更された変更日をチェックするすべてのファイルをループして検索します。

常に実行する必要がありますが、約 20% の確率で、ドキュメントは Excel コードによってのみ読み取られますが、Word ドキュメントのウェルカム メッセージ ボックスが表示され、thisdocument.readonly が誤って false を返したことを示します。このシナリオでワード文書をデバッグし、

? thisdocument.readonly

「偽」の結果が得られます。ただし、Word 文書のタイトル バーも " (読み取り専用)" で終わっているため、明らかに読み取り専用で開かれているため、readonly は True を返す必要があります。

ドキュメントに固有のものではありません。それらを開こうとすると、次回は機能するようです(読み取り専用を正しく登録し、メッセージボックスコードの前にサブを終了するという点で)。どんな種類のパターンも見つけることができず、オンラインで情報を見つけることができません。これを何週間も探していました!

4

1 に答える 1

1

答えとは見なされないかもしれませんが、Tim William の提案に従って、私の問題を完全に解決することができました。プロパティを設定するのが早すぎたので、最初は苦労しました。完全なコードは次のとおりです。

 Sub CopyFromWord(pFile as String)

 Dim wdApp As Object

 On Error Resume Next
 Set wdApp = GetObject(, "Word.Application")
 If Err.Number <> 0 Then
 Set wdApp = CreateObject("Word.Application")
 Else 'word is already running
 End If
 On Error Goto 0

'save current setting
secAutomation = wrdApp.Application.AutomationSecurity

'set Word to disable macros when a document is opened via vb:
wrdApp.Application.AutomationSecurity = msoAutomationSecurityForceDisable
'(without using wrdApp prefix it would only apply to the code's App i.e. Excel)

Set wdDoc = wdApp.Documents.Open(Filename:="" & pFile & "", ReadOnly:=True)
wdApp.Visible = False
For Each c In wdDoc.bookmarks
'removed code that copies values from word doc fields to excel sheet
Next c

'restore original setting before closing
wrdApp.Application.AutomationSecurity = secAutomation

wdApp.Activedocument.Close SaveChanges:=False

End Sub

リンクを提供してくれた Tim Williams と、そのリンクのコンテンツ内でコードを提供してくれた人に感謝します。これは非常に役に立ち、非常に感謝しています。

于 2012-10-02T23:30:42.630 に答える