2

おはようございます。

コードで単語の他のインスタンスを見つけるのに問題があり、何度もグーグル検索を行った後、レンガの壁にぶつかりました。

以下の私のコードは、開いているすべてのWord文書を見つけて、コンボボックスに入力します。

私の問題は、Word ドキュメントを新しいインスタンスで開くアプリケーション (これらを制御できない) があるため、コードがこれらのドキュメントを検出/制御しないことです。

何か案は?

Dim objWordDocument As Word.Document
Dim objWordApplication As Word.Application


'//find all open word documents
Set objWordApplication = GetObject(, "Word.Application")

'//clear combobox
    OpenDocs.Clear

'//add all open documents to combo box

        For Each objWordDocument In objWordApplication.Documents

            OpenDocs.AddItem objWordDocument.Name

        Next objWordDocument
4

2 に答える 2

3

私が見て理解したことから、これを行うための唯一の確実な方法は、実行中の単語のインスタンスを繰り返し処理し、次に各インスタンスを順番に殺して、次のインスタンスを取得していることを確認することです。

単語は、それ自体のすべてのインスタンスに対して実行中のオブジェクト テーブルにまったく同じ方法で登録されるため、最初に見ているインスタンスを閉じずにそれらを通過する方法はありません。

このアプローチの 1 つのオプションは、おそらく望ましくありませんが、アプリケーション インスタンスを強制終了している間にすべてのファイル名を取得してから、作成した 1 つのインスタンスにそれらすべてをロードし直すことです。

または、開いているファイルの名前がわかっている場合は、開いているファイル名で「getObject」を実行できます。これは、Word がそのドキュメント名を実行中のオブジェクト テーブルにプッシュするためです。

アクティブな x MFC サービスを作成しないと、やりたいことを実行できません。

お役に立てば幸いです。

編集:

フォーカスを変更するためにハンドルを取得するためのサブクラス化と Windows API について広範な議論がありました。http://www.xtremevbtalk.com/showthread.php?t=314637

最初にその頭に飛び込み、hwnd によって単語インスタンスを列挙できた場合は、それぞれに順番に焦点を合わせてから、ファイル名をリストすることができます。ただし、警告します。これは、本当に誤って何かを壊したいと思っている一部の人々だけが使用する、暗い魔法である厄介なサブクラスです。

いずれにせよ、1 つのインスタンスを確認したい場合は、kill、repeat、reopen を試してください:

このスレッドからの適応: http://www.xtremevbtalk.com/showthread.php?t=316776

Set objWordApplication = GetObject(, "Word.Application")

'//clear combobox
    OpenDocs.Clear

'//add all open documents to combo box

   Do While Not objWordDocument is nothing 

        For Each objWordDocument In objWordApplication.Documents

            OpenDocs.AddItem objWordDocument.Name

        Next objWordDocument
        objWordApplication.Quit False
        Set objWordApplication = Nothing
        Set objWordApplication = GetObject(, "Word.Application")
   loop

   ** use create object to open a new instance of word here and then go though
   ** your list of files until you have opened them all as documents in the new
   ** instance.
于 2012-11-29T20:57:19.467 に答える
0

これは古いスレッドですが、私も Word インスタンスを反復処理する必要があり、ここでぶつかりました。

@Pow-Ianのアドバイスに従って、私はやろうとしました

最初にその頭に飛び込み、hwnd によって単語インスタンスを列挙できた場合は、それぞれに順番に焦点を合わせてから、ファイル名をリストすることができます。

すべてのハンドルを取得することができましたが、AccessibleObjectFromWindowを介してオフィス アプリケーションに関するより簡単な戦略を見つけたので、問題は解決しました。

また、コードは @Pow-lan のタイプミスを示していると思います

Do While Not objWordDocument is nothing

そして、次のようにする必要があります。

Do While Not objWordApplication is nothing
于 2019-01-28T19:13:41.843 に答える