Страницы: 1
RSS
Word-макрос в Excel, Адаптация кода
 
Всем привет!

Помогите решить задачу.
Есть тестовый набор: файл и макрос НТД_Proc(), написанный в Word.
В Word'e он работает правильно.

Задача - адаптировать код для работы из-под Excel.
Т.е. при запуске макроса в Excel пользователь должен выбрать Word-файл для обработки.
Он может быть как открыт, так и закрыт.

Пробовал через CreateObject("Word.Application"), GetObject(Путь_к_файлу) и т.п.
Всё безуспешно.

Надеюсь на Вашу помощь!
 
Господа, ну откликнитесь кто-нибудь!
Я уже весь мозг вывихнул.
 
А так не пробовали, чтобы мозг поберечь?
 
Пробовал, конечно.
Нашёл несколько интересных тем (н-р, эту или эту), но под мою задачу они не подходят.
Изменено: Acid Burn - 22.01.2013 01:45:54
 
Билл Джелен "Применение VBA и макросов ...."
Открывает документ Автоматизация Word.doc , находящийся в этой же папке,
где и книга Excel

Sub WordLateBinding()
' Позднее связывание.
Dim wdApp As Object, wdDoc As Object

Set wdApp = CreateObject("Word.Application")  
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\Автоматизация Word.doc")  
wdApp.Visible = True
Set wdApp = Nothing
Set wdDoc = Nothing
End Sub
Изменено: Kuzmich - 21.01.2013 21:09:28
 
Kuzmich, The_Prist, спасибо!

Эту тему и кучу аналогичных прочитал ещё днём, ответа не нашёл.
Я не программист и не спец, но и не халявщик.
Word-макрос писал и тестировал сам. Запустить / сохранить / закрыть Word из Excel тоже смог...
На большее толку не хватило - ошибка 438.

Для меня всё это сложно. Может кто-нибудь всё же допилит мой код?
Исходники приложил.
Ведь лучше один раз увидеть, чем сто раз услышать )))
Изменено: Acid Burn - 21.01.2013 23:06:15
 
Как из Excel обратиться к другому приложению

Помимо прочтения статьи советую так же прочесть комментарии к ней - возможно найдете ответ.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попытался продвинуться дальше.
На .EndKey, .Application.Browser.Target и другие команды сыплет ошибки 4120/5101/5843/5941/т.п.
Ни в справке, ни в Интернете ничего подходящего не нашёл...
 
Посмотрите пример в файле,
там есть про закладки
Sub UseBookmarks()
 
Цитата
Kuzmich пишет:
там есть про закладки

Спасибо!
Я понял, что в моём случае применима команда objWrdDoc.bookmarks("Имя_закладки").Select.
Но как быть со всем остальным???

PS: а вобще интересный файлик.
Что-то я даже смогу использовать в дальнейшем.
Поэтому ещё раз спасибо, но в целом тема остаётся актуальной.
Изменено: Acid Burn - 21.01.2013 23:47:49 (PS)
 
Как-то так.
 
Роман, огромное Вам спасибо за помощь!
Отдельная благодарность за комменты в коде!
Всё отлично работает.

Я даже не мог подумать, что можно запустить мой макрос из Excel, почти не меняя синтаксис!!!
Однако соответствие констант Word в справке не нашёл. Если можно, дайте ссылку.
Также есть несколько вопросов:

- можно ли оптимизировать код, сократив время выполнения?
- как всё же подсчитать Z (qD)?
- как выбрать уже открытый Word-документ для обработки?

Спасибо!
 
1) Выбрать уже открытый документ
Убираем из кода все что идет после объявления переменных и до Intro и заменяем на следующее
Код
Set wdApp = GetObject(, "Word.Application") 'получаем приложение
Set wdDoc = wdApp.activedocument 'получаем активную книгу


2)Если я правильно понял то Z(qD) это время выполнения макроса, то мне кажется можно заменить на
в начале кода t=timer

в конце
"Выполнено за " & timer-t & " сек."

и можно будет убрать декларацию функции и саму функцию по определению времени

3) с ускорить я не помогу, т.к макросы в Worde не пишу, и что там можно сократить не знаю.

По поводу констант Word'а запускате справку, вбиваете в поиске wdGoToBookmark и переходите по WdGoToItem Enumeration. Остальные константы аналогично.
В принципе можно было бы не менять текстовые константы на числовые обозначения, если в VBA Excel в Tools-Refences поставить галочку напротив Word'a
Изменено: sva - 22.01.2013 22:48:00
 
3) Спасибо!
2) Не совсем так, имеется ввиду
(MicroTimer - t): время выполнения, при этом MicroTimer точнее встроенного Timer.
А (qR*4 + Z)/(MicroTimer - t): число операций в секунду.
1) Тоже не совсем так...
Word-файл может быть как открыт, так и закрыт.

Немного переписал код.
Пока пункт 1 не работает, пункт 2 - работает, но возможно неправильно.
Посмотрите?
 
Если правильно понял по поводу файл открыт/закрыт см. вложение.
 
Роман, Вы всё правильно поняли!

Но есть проблема: в обоих версиях macro.xls потерялась строка
AD.Bookmarks.Add Name:=BM, Range:=Selection.Range
Попытался добавить как:
wB.Add Name:=BM, Range:=wS.Range
Но
Код
With C2
  BM = "л_" & Right(Left(.Text, Len(.Text) - 3), Len(.Text) - 4)
  C22 = Left(.Text, Len(.Text) - 2)
  .Select: wS.MoveLeft 1, 1, 1: wB.Add Name:=BM, Range:=wS.Range
End With

не работает.

В чём тромб?
 
Так работает
Код
wD.Bookmarks.Add Name:=BM, Range:=wS.Range
 
sva, благодарность к Вам не вмещается в моём сердце!

Странно, что не сработал wB.Add Name:=BM, Range:=wS.Range, где wB = wD.Bookmarks.
Но главное, что работает wD.Bookmarks.Add Name:=BM, Range:=wS.Range!

Предпоследняя версия кода..
И два последних вопроса:
- как посчитать число пустых и/или содержащих пробел строк в столбце 3
- как сделать, чтобы цикл With wS.Find: .Text = C32: .Wrap = 1 не затрагивал ячейки C2 и C3?

Спасибо!
Изменено: Acid Burn - 26.01.2013 16:36:58
 
Финальная рабочая версия кода.

Огромное спасибо SVA за WdGoToItem Enumeration, код выбора файла,
а также помощь с подсчётом заполненных строк, вводом закладок и гиперссылок!

Тему можно считать закрытой.
Продолжение тут.
Изменено: Acid Burn - 27.01.2013 18:31:07
Страницы: 1
Наверх