Консультация № 177371
20.03.2010, 14:40
35.77 руб.
0 12 2
Уважаемые эксперты подскажите в следующем, если на ВБА написать, дословно так
Sub FIO()
'
Dim myWord As Word.Application, myDoc As Document
Set myWord = Application 'объявляем объект с именем ...
Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) 'открыть документ с именем ..., по адресу ..., в "тёмную"
ИТОГ = 0
ИТОГ1 = 9

End Sub
тогда после строки
Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) 'открыть документ с именем ..., по адресу ..., в "тёмную"
происходит всё тоже магическое убыстрение, что переменные ИТОГ и ИТОГ1 не раасмотреть, что им присвоено сразу после неё переходит в начало на строку
Sub FIO()

Если же написать

Dim myWord As Word.Application, myDoc As Document
Set myWord = Application 'объявляем объект с именем ...
Documents.Open fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False
Set myDoc = myWord.Documents("D:\Рабочая папка\УПК РФ.doc") 'открыть документ с именем ..., по адресу ...

находясь на строке, то есть не выполнив её - Documents.Open fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False компьютер виснет, скажите почему, что не так ???
Спасибо Эндрю

Обсуждение

Неизвестный
21.03.2010, 09:25
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Момент первый: не совсем понятно, зачем Вам такая конструкция, если можно обойтись строкой
Код:
Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) 

т.е. и сразу определить переменную myDoc и тут же открыть файл

теперь по сути проблемы - вы в первую очередь нарушили синтаксис команды, т.к. для команды Application.Documents единственным аргументом является индекс файла, а не путь к нему
у меня заработало и с путем к файлу, но это не значит, что так правильно и должно работать везде.
индекс файла представляет из себя число со значением от 1 и до числа, которое равно количеству открытых файлов данного типа.
определить индекс довольно просто: последний открытый документ всегда имеет индекс 1, дальше индекс увеличивается в зависимости от порядка открытия файлов, т.е. если открыто 7 файлов, то открытый самым первым файл будет иметь индекс 7, а последний - 1

получается, что у Вас должна заработать такая конструкция:
Код:
Dim myWord As Word.Application, myDoc As Document
Set myWord = Application 'объявляем объект с именем ...
Documents.Open fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False
Set myDoc = myWord.Documents(1) 'открыть документ с именем ..., по адресу ...
Неизвестный
21.03.2010, 12:34
общий
Ципихович Эндрю:
Если я правильно понял суть Вашей проблемы, то Вы выполняете этот код пошагово из редактора кода с помощью клавиши "F8", а открываемый Вами файл содержит макросы. Если это так, то попробуйте строку Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) пройти с помощью комбинации клавиш "Shift"+"F8". Должно помочь

Выполнение макроса все равно продолжается, для подтверждения после строки ИТОГ = 1 поставьте строку MsgBox ИТОГ и запустите весь код на выполнение.
Неизвестный
21.03.2010, 12:37
общий
Vasiliy83:
Дословно написал
Sub FIO()
'
Dim myWord As Word.Application, myDoc As Document
Set myWord = Application 'объявляем объект с именем ...
Documents.Open fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False
Set myDoc = myWord.Documents(1) 'открыть документ с именем ..., по адресу ...
ИТОГ = 0
ИТОГ1 = 9


End Sub
Ничего не изменилось магическим образом убыстрилось и так как в этом документе есть Лейбл выполнение закончилось на том что открылся код этого Лэйбла
Затем я удалил из этого документа Лейбл, также открылся код уже не существующего в документе Лейбла:
Private Sub Label1_Click()

Dialogs(wdDialogEditFind).Show 'показать диалог Найти

End Sub


Затем изменил УПК РФ на другой существующий документ
Ничего не изменилось магическим образом убыстрилось
Перешло на строку первую
Неизвестный
21.03.2010, 15:21
общий
Ципихович Эндрю:
выложите полный код, потому что непонятно, о каких надписях и прочем идет речь
Неизвестный
21.03.2010, 16:16
общий
Vasiliy83:
Сообщение Измалкова Э.Л. и есть правильный ответ нужно пошагово строку пройти с помощью комбинации клавиш "Shift"+"F8"
Мне помогло
Неизвестный
21.03.2010, 16:18
общий
Измалков Эдуард Леонидович:
Огромное спасибо за сообщение, оно и есть правильный ответ, во всяком случае если в дальнейшем будут происходить чудеса я напишу
Неизвестный
21.03.2010, 18:22
общий
Ципихович Эндрю:
Тогда оформляю как ответ
Неизвестный
21.03.2010, 18:27
общий
это ответ
Здравствуйте, Ципихович Эндрю.

Если я правильно понял суть Вашей проблемы, то Вы выполняете этот код пошагово из редактора кода с помощью клавиши "F8", а открываемый Вами файл содержит макросы. Если это так, то попробуйте строку Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) пройти с помощью комбинации клавиш "Shift"+"F8" (Step Over). В этом случае ВБА "втёмную" выполнит функцию, не заходя в неё.

Выполнение макроса все равно продолжается, для подтверждения после строки ИТОГ = 1 поставьте строку MsgBox ИТОГ и запустите весь код на выполнение.
5
Неизвестный
22.03.2010, 20:48
общий
Измалков Эдуард Леонидович:
'Подскажите, по Вашему совету строку
Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False)
'прохожу при помощи "Shift"+"F8", после чего переменные а и а1 равны, но если это делает макрос они становятся не равны
'а1 становится равно D:\Рабочая папка\УПК РФ.doc
'как этого избежать и как присвоить объект открытому файлу Set myDoc1 = ???

a = ActiveDocument.Name
Set myDoc = Documents.Open(fileName:="D:\Рабочая папка\УПК РФ.doc", Visible:=False) '"Shift"+"F8" открыть документ с именем ..., по адресу ..., "в тёмную"
a1 = ActiveDocument.Name
Неизвестный
23.03.2010, 00:00
общий
Ципихович Эндрю:
да, действительно так происходит. Попытаюсь выяснить как избежать.
Насчет присвоить объект открытому файлу я немного не допонял. Если под открытым файлом подразумевается файл, из которого вызывается макрос, то для ссылки на него можно использовать ThisDocument (т.е. a1 = ThisDocument.Name)
Неизвестный
23.03.2010, 05:50
общий
Измалков Эдуард Леонидович:
Под открытым файлом я называю активный файл, чтобы ему сначала присоить переменную, если написать так
Set myDoc1 = ThisDocument.Name ругается
Если так Set myDoc1 = ActiveDocument.Name ругается
Вроде надо так Set myDoc1 = ActiveDocument ПРАВИЛЬНО?????

Неизвестный
23.03.2010, 08:40
общий
Ципихович Эндрю:
Извиняюсь, что ввёл Вас в заблуждение. В качестве примера я привёл модифицированный код из вашего вопроса, где использовалось имя документа, а чтобы присвоить объект открытому файлу, действительно нужно писать Set myDoc1 = ActiveDocument (либо Set myDoc1 = ThisDocument для ссылки на документ, содержащий макрос).
Форма ответа