Помогите решить задачу. Есть тестовый набор: файл и макрос НТД_Proc(), написанный в Word. В Word'e он работает правильно.
Задача - адаптировать код для работы из-под Excel. Т.е. при запуске макроса в Excel пользователь должен выбрать Word-файл для обработки. Он может быть как открыт, так и закрыт.
Пробовал через CreateObject("Word.Application"), GetObject(Путь_к_файлу) и т.п. Всё безуспешно.
Билл Джелен "Применение 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
Эту тему и кучу аналогичных прочитал ещё днём, ответа не нашёл. Я не программист и не спец, но и не халявщик. Word-макрос писал и тестировал сам. Запустить / сохранить / закрыть Word из Excel тоже смог... На большее толку не хватило - ошибка 438.
Для меня всё это сложно. Может кто-нибудь всё же допилит мой код? Исходники приложил. Ведь лучше один раз увидеть, чем сто раз услышать )))
Попытался продвинуться дальше. На .EndKey, .Application.Browser.Target и другие команды сыплет ошибки 4120/5101/5843/5941/т.п. Ни в справке, ни в Интернете ничего подходящего не нашёл...
Роман, огромное Вам спасибо за помощь! Отдельная благодарность за комменты в коде! Всё отлично работает.
Я даже не мог подумать, что можно запустить мой макрос из 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
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
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?