Вопрос по vba, ms-word, ms-office, word-vba – Word VBA и несколько слов экземпляров

2

Доброе утро.

У меня проблема с получением кода для поиска других экземпляров слова, и я столкнулся с кирпичной стеной после долгих поисков в Google.

Мой код ниже найдет все открытые документы 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

Ваш Ответ

2   ответа
0

Это старый поток, но у меня тоже есть необходимость перебирать экземпляры Word и сталкиваться здесь.

После @ Pow-Ian 'советую, я пытался сделать

если вы сначала погрузитесь в эту голову и сможете перечислить экземпляры слов по hwnd, то вы можете сфокусировать каждое из них по очереди, а затем перечислить имена файлов.

Несмотря на то, что мне удалось получить все ручки, я нашел более простую стратегию в отношении офисных приложений черезAccessibleObjectFromWindow и наш вопрос сейчас решен.

Кроме того, я считаю, что код показывал @ Pow-lan 's имеет опечатку на

Do While Not objWordDocument is nothing

и должно быть:

Do While Not objWordApplication is nothing
2

что я видел и понял, единственный надежный способ сделать это - перебирать запущенные экземпляры слова, а затем убивать каждый из них по очереди, чтобы убедиться, что вы получаете следующий экземпляр.

Поскольку слово регистрируется в таблице запущенных объектов одинаково точно для каждого отдельного экземпляра, невозможно пройти через них, не закрыв сначала тот, на который вы смотрели.

Одним из вариантов этого подхода, который, вероятно, нежелателен, является получение всех имен файлов во время уничтожения экземпляров приложения, а затем загрузка их всех обратно в один созданный вами экземпляр.

С другой стороны, если вы знаете имена открытых файлов, вы можетеGetObject» по открытому имени файла, так как Word поместит имена своих документов в таблицу запущенных объектов, к сожалению, это не похоже на ваш случай.

Без написания активного сервиса x MFC вы не сможете делать то, что вы хотите сделать.

Я надеюсь, что это полезно.

РЕДАКТИРОВАТЬ:

было обширное обсуждение подклассов и окон APIs, чтобы получить ручки, чтобы изменить фокус.http://www.xtremevbtalk.com/showthread.php?t=314637

если вы сначала погрузитесь в эту голову и сможете перечислить экземпляры слов по hwnd, то вы можете сфокусировать каждое из них по очереди, а затем перечислить имена файлов. Я предупреждаю вас, хотя; это какое-то противное подклассирование, которое является темной магией, с которой играют только некоторые люди, которые действительно хотят случайно порвать вещи.

В любом случае, если вы хотите взглянуть на один экземпляр, убейте, повторите, снова откройте, попробуйте это:

Адаптировано из этой темы: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.
Спасибо за ваш ответ @ Пау-Йен. Вы правы, и я не буду знать имена открытых документов во второй инстанции. Я посмотрю, как убить мой код / приложение, и снова открою его в экземпляре seocnd, и посмотрю, работает ли он. Любые советы по этому поводу? Mikey
Я немного поиграю с этим днем и посмотрю, как у меня получится. Спасибо за вашу помощь и совет :) Mikey
нет проблем. Если вы решите вызвать Windows API и начать создавать подклассы, я обещаю, что выигралне скажу, что я говорил тебе, когда что-то идет не так, как надо. Pow-Ian
Большое спасибо за вашу помощь! Я отмечу ваш пост как полезный, как только у меня будет 15 представителей :) Mikey
Ну, вы могли бы убить его и получить имя файла достаточно легко, однако вернув тот же экземпляр к жизни, чтобы созданное им приложение / процесс распознало, что оно находится далеко за пределами возможного в vba, если только нет способ подкласса это. Я подробно остановлюсь на захвате и убийстве. Pow-Ian

Похожие вопросы