postrelll Пользователь Сообщений: 7 |
#1 02.09.2016 12:23:58 Добрый день, столкнулся со следующей проблемой в 2016 офисе. Есть макрос, выполняющий роль заполнялки документов по шаблону. Выполняется макрос из excel файлика, среди шаблонов есть Word документы, соответсвенно приходится в самом макросе оперировать с этими word объектами через Word.Application. Макрос корректно работал на версии офиса 2010 и младше. Сейчас установили 2016 офис и возникла проблема — при выполнении одной из строк кода возникает ошибка
Начальная инициализация
Проблемная функция
Проблемная строка на которой светится ошибка 4605
Буду рад любой помощи |
||||||||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
А на этой строке нет ошибки? Как из Excel обратиться к другому приложению проблема в том, что Excel ничего не знает о константах Word-а, в том числе и про эту: wdReplaceAll Изменено: The_Prist — 02.09.2016 12:29:09 Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
postrelll Пользователь Сообщений: 7 |
#3 02.09.2016 12:43:05 The_Prist
То макрос выполняется без ошибок. Шаблон с Word документом сохраняется с нужным мне именем. Однако нужных мне замен в этом шаблоне не производится. ПОдключенные библиотеки <#1><#2> |
||
Hugo Пользователь Сообщений: 23251 |
#4 02.09.2016 12:48:58 Вместо констант пишите явно значение этих констант.
Изменено: Hugo — 02.09.2016 13:00:20 |
||
postrelll Пользователь Сообщений: 7 |
Проблема решена — поменял формат шаблонов на .docx и переместил их с системного диска в документы пользователя. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#6 02.09.2016 13:51:39
не хотите Вы прислушиваться и читать…Она обязательно может всплыть в другой раз. Т.к. библиотека Word 16 может не подхватиться на более ранних. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
postrelll Пользователь Сообщений: 7 |
The_Prist Проблема была в «безопасном режиме» шаблона, который открывался. В моем случае макрос открывал шаблон из указанного пути. В шаблоне в цикле делал замены в нужные места документов и затем сохранял шаблон под определенным именем. Ошибка изначально была связана с тем, что при открытии шаблона в безопасном режиме его невозможно редактировать, соответственно и делать замены в нём так же нельзя. А этот безопасный режим появился только в 2016 офисе (возможно и в 2013 он так же есть), поскольку в 2010 все открывалось нормально в обычном режиме. Стоит так же сказать, что шаблоны были в .doc формате для лучшей совместимости с более старыми офисами, поскольку макросом пользуются на самых разных ПК. Из-за этого и выползала ошибка. Плюс я изначально все шаблоны загонял в отдельную папку на диске С. Учитывая, что макрос сейчас запускается из-под WIn 10, проблему так же создавала встроенная защита системы, поскольку она любит подтверждать через UAC все процедуры перезаписи/удаления. Поэтому и перенес папку с шаблонами в документы пользователя. Изменено: postrelll — 02.09.2016 17:05:03 |
Сергей Редькин Пользователь Сообщений: 1 |
#8 19.01.2022 08:58:23 У меня была похожая проблема со вставкой неформатированных значений из ячеек в размеченные закладками места в Word. Ошибки периодически вылазили на этой строке:
Перенос файла шаблона в папку шаблонов по умолчанию не помог. Насколько понимаю проблемы возникают при вызове функций Word из VBA, запущенном в Excel, но до конца в причинах я так и не разобрался. Заменил Copy/Paste на вставку значения текстовой переменной. Самое интересное, что один Selection.Copy / Selection.PasteAndFormat (wdFormatPlainText) в самом конце макроса работает корректно, но как только вставляю в макрос несколько — вылазят ошибки.
Изменено: Сергей Редькин — 19.01.2022 10:39:43 |
||||
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||||||
1 |
||||||||
18.10.2013, 17:23. Показов 6964. Ответов 28 Метки нет (Все метки)
здравствуйте, есть код
на строке Добавлено через 44 минуты
какую надо?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
18.10.2013, 17:23 |
28 |
Заблокирован |
|
18.10.2013, 17:25 |
2 |
Ципихович Эндрю, нам предлагаете догадаться, в какой среде вы запускаете этот код?
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 17:44 [ТС] |
3 |
неа, просто у меня кругозор маленький… далее Visual Basic не юзаю, извините меня пожалуйста Добавлено через 17 минут
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
18.10.2013, 17:46 |
4 |
Set ObjectWord = ThisDocument.Application Ну такое пройдёт разве что в макросе ворда, но никак не VB6 Добавлено через 1 минуту
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||
18.10.2013, 17:50 [ТС] |
5 |
|||
ThisDocument — тыщу раз меня к этому приучают, ну не взлетает….??? и как писать Добавлено через 2 минуты
и как писать
так, да??
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||||||||||
18.10.2013, 17:52 |
6 |
|||||||||||
Изначально док надо открыть или создать? Добавлено через 35 секунд
Добавлено через 45 секунд
Добавлено через 34 секунды
1 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 17:54 [ТС] |
7 |
а активный как в разработку брать?
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||
18.10.2013, 17:59 |
8 |
|||
Там что-то типа Create вроде Добавлено через 2 минуты
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 18:00 [ТС] |
9 |
спасибо, чтобы не гадать может кто другой…
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
18.10.2013, 18:01 |
10 |
Значит GetObject
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||||||||||
18.10.2013, 19:35 [ТС] |
11 |
|||||||||||
ну не прёт
Добавлено через 16 минут
Set objDoc = GetObject(, » Word.Application») главное ошибка 429 компонет активХ не может создать объект Добавлено через 1 час 9 минут
тогда на строке
ошибка 13 — несоответствие типов
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||
18.10.2013, 19:46 |
12 |
|||
Добавлено через 39 секунд
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||||||
18.10.2013, 20:10 [ТС] |
13 |
|||||||
спасибо пока проверю Добавлено через 14 минут
всё тоже несоответствие типов
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
18.10.2013, 20:14 |
14 |
Dim objAsWordDocument As Word.Document К чему эти подробности? As Object вполне хватит.
1 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 20:21 [ТС] |
15 |
вроде пошло, а тут objAsObject.ScreenUpdating = False ошибки 438 ещё никогда не было — объект не поддерживает это свойство или метод
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||||||
18.10.2013, 21:21 |
16 |
|||||||
As Object вполне хватит При раннем связывании, вроде, как помогает с синтаксисом. ошибаюсь? Добавлено через 12 минут As Object вполне хватит. можно даже вообще не объявлять тип!
Добавлено через 2 минуты
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 21:24 [ТС] |
17 |
как насчёт
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
18.10.2013, 21:38 |
18 |
Так определись сначала: есть ли открытый документ? Если открыт, то проверь в диспетчере задач сколько открыто вордов.
1 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
18.10.2013, 21:40 [ТС] |
19 |
Сначала закрой все. это обязательно, без этого почему никак? Добавлено через 34 секунды
Так определись сначала: есть ли открытый документ? ну глазам то я верю — есть открытый
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
18.10.2013, 21:44 |
20 |
По идее можно попробовать программно проверить: если в объекте нет документов, то закрыть его и снова запустить Get. Но это уже для самостоятельной разработки Добавлено через 1 минуту Добавлено через 1 минуту
1 |
I have a VBA Word macro that opens a Word doc, then opens an Excel file, selects a cell reference and finally displays a message using Msgbox. After the Excel file has been opened I am having trouble finding the code to make Word visible so that the user can view the Msgbox message without having to using the task bar to switch from Excel to Word. I tried oWord.Visible = True
but VBA gives me an error.
Any hints are appreciated.
See the code below:
Sub Module_Test()
Dim oExcel As Object
Dim oWord_Doc as object
Dim wb_open as workbook
Set oExcel = New Excel.Application
str_Excel_Filename = "C:TestExcel_Template.xlsx"
Documents.Open ("C:TestDoc_to_process.docx")
Set oWord_Doc = activedocument
oExcel.Visible = True
oExcel.ScreenUpdating = True
oExcel.Workbooks.Open str_Excel_Filename
Set wb_open = activeworkbook
wb_open.ActiveSheet.range("a6").Select
' At this point Excel is visible. But the Msgbox statement below is not visible except when one switches to Word using the task bar. What statement do I put here to make Word visible?
Msgbox "Here is a message that should be visible when viewing the window containing the Doc_to_process.docx"
End Sub
asked Oct 30, 2018 at 21:34
4
Visible is at the Application level. Your oExcel variable gives you the clue. You don’t have a variable called oWord.
Edited to add the following code
Option Explicit
Sub Module_Test()
Const MY_WB_PATH As String = "C:TestExcel_Template.xlsx"
Const MY_DOC_PATH As String = "C:TestDoc_to_process.docx"
Dim my_xl_app As Excel.Application
Dim my_doc As Word.Document
Dim my_wb As Excel.Workbook
Set my_xl_app = New Excel.Application
With my_xl_app
.Visible = True
.ScreenUpdating = True
Set my_wb = .Workbooks.Open(MY_WB_PATH)
End With
my_wb.Activate
my_wb.activeworksheet.Range("a6").Select
' At this point Excel is visible. But the Msgbox statement
' below is not visible except when one switches to Word using
' the task bar. What statement do I put here to make Word visible?
Set my_doc = Documents.Open(MY_DOC_PATH)
my_doc.Activate
' If required
my_doc.Application.Visible = True
MsgBox "Here is a message that should be visible when viewing the window containing the Doc_to_process.docx"
End Sub
If you are new to VBA then the following should always be used.
-
In the VBA IDE ensure each module starts with ‘Option explicit’
-
In the VBA IDE ensure that all checkboxes in Tools.Option.Code Settings are ticked
answered Oct 30, 2018 at 21:49
freeflowfreeflow
4,0933 gold badges10 silver badges17 bronze badges
6
- Remove From My Forums
-
Вопрос
-
Hi
As I am trying to learn VBA in word2010, I am running into a problem.
symptoms
1. Unable to insert a module and options in «insert»tab were all grayed out.
2. All newly created Word Doc become 0-size after using Vba
3. New content inserted in word cannot be saved properly
4. Template Normal.dotm has been modified based on it’s last modified time
This problem has happened twice. the first time I met this problem, i think it is because Kaspersky mistakenly deleted the template Normal.dotm, and the problem is solved after I recovered the Normal.dotm from another computer. However, the same problem
happened again and Kaspersky hasn’t deleted the Normal.dotm template, instead, the Normal.dotm template has been modified based on it’s last modified time.I believe the temporary solution would be to cover the modified template Normal.dotm with a new one, but it’s troublesome performing this every time this the problem happens.
Can anyone help explaining what might be the possible cause of this problem. your help is very much appreciated. thanks
-
Изменено
9 декабря 2017 г. 2:03
original question not specific
-
Изменено
Ответы
-
Hi xslxsl,
Great to see that the issue has been fixed after replacing the normal.dotm and thanks for sharing! It is encouraged to mark your post above so that others who might have a similar issue can more easily search for the resolution.
>> However, the same problem happened again and Kaspersky hasn’t deleted the Normal.dotm template, instead, the Normal.dotm template has been modified based on it’s last modified time.
According to the description, I am assuming that Kaspersky might made some changes to the template when scanning. If possible, could you please share the problematic Normal.dotm template via
OneDrive and paste a link here then we can take a further look at it? If the issue occurred again, it is suggested to try temporarily remove Word application from the scan list of Kaspersky and see if the problem
can be stopped.By the way, generally we can rename the Normal.dotm and a new Normal.dotm will be automatically recreated when Word is launched next time.
Best regards,
Yuki Sun
Please remember to
mark the replies as answers if they helped.
If you have feedback for TechNet Subscriber Support, contact
tnsf@microsoft.com.-
Изменено
Yuki SunMicrosoft contingent staff
14 декабря 2017 г. 2:14 -
Помечено в качестве ответа
xslxsl
15 декабря 2017 г. 1:01
-
Изменено
Создание нового экземпляра приложения Word из кода VBA Excel или подключение к открытому для работы с документами. Функции CreateObject и GetObject.
Работа с Word из кода VBA Excel
Часть 1. Управление приложением Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Создание объекта Word.Application
Экземпляр приложения Word необходим для того, чтобы с его помощью создавать новые документы или открывать существующие для редактирования из кода VBA Excel.
Создать новый экземпляр объекта Word.Application можно при помощи раннего или позднего связывания, используя при позднем связывании функцию CreateObject. Подключиться к открытому экземпляру приложения Word можно только при помощи позднего связывания, используя функцию GetObject.
Раннее связывание приложения Word
Создание нового экземпляра Word.Application и присвоение ссылки на него переменной myWord:
‘Создание экземпляра приложения Word ‘с ранней привязкой одной строкой Dim myWord As New Word.Application ‘Создание экземпляра приложения Word ‘с ранней привязкой двумя строками Dim myWord As Word.Application Set myWord = New Word.Application |
Для раннего связывания переменной с объектом Word.Application необходимо подключить в редакторе VBA Excel ссылку на библиотеку Microsoft Word Object Library, если она не подключена. Подключается ссылка в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References…
Раннее связывание позволяет при написании кода использовать лист подсказок для выбора и вставки свойств и методов привязанных объектов (Auto List Members). Если проект VBA Excel создается на заказ, то, после его завершения, раннее связывание следует заменить на позднее, так как на компьютере пользователя может не оказаться нужной библиотеки, и код работать не будет.
Позднее связывание приложения Word
Создание нового экземпляра Word.Application с помощью функции CreateObject и присвоение ссылки на него переменной myWord:
Dim myWord As Object Set myWord = CreateObject(«Word.Application») |
Присвоение переменной myWord ссылки на открытый экземпляр приложения Word с помощью функции GetObject:
Dim myWord As Object Set myWord = GetObject(, «Word.Application») |
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Чтобы ее избежать, следует предусмотреть создание нового экземпляра Word.Application с помощью функции CreateObject, если открытое приложение не будет найдено (смотрите пример 3).
В программы VBA Excel, работающие с Word, следует включать обработчик ошибок.
Закрытие объекта Word.Application
Новый экземпляр приложения Word открывается в фоновом режиме. Если необходимо его отобразить на экране перед завершением программы, используйте следующий код:
‘отображаем приложение Word myWord.Visible = True ‘освобождаем переменную от ссылки Set myWord = Nothing |
Если перед завершением процедуры VBA Excel необходимо приложение Word закрыть, используйте метод Quit:
‘закрываем приложение Word myWord.Quit ‘освобождаем переменную от ссылки Set myWord = Nothing |
Если переменная не содержит ссылку на приложение (myWord = Nothing), метод Quit возвратит ошибку. Чтобы этого не произошло, перед применением метода Quit необходимо проверить наличие ссылки в переменной myWord (смотрите пример 3).
Пример 1
Создаем новый экземпляр объекта Word.Application с ранним связыванием и отображаем его на экране:
Sub Primer1() Dim myWord As New Word.Application ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True Set myWord = Nothing End Sub |
Запустите код примера 1 на выполнение. Вы увидите появившийся на панели задач ярлык приложения Word. Перейдите на него и закройте приложение вручную.
Пример 2
Создаем новый экземпляр объекта Word.Application с поздним связыванием, отображаем его на экране, останавливаем программу и наблюдаем закрытие приложения методом Quit:
Sub Primer2() Dim myWord As Object Set myWord = CreateObject(«Word.Application») ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True MsgBox «Остановка программы» myWord.Quit Set myWord = Nothing End Sub |
Запустите код примера 2 на выполнение. Закройте информационное окно MsgBox и смотрите, как исчезнет с панели задач ярлык приложения Word, созданного перед остановкой кода.
Пример 3
Пытаемся создать ссылку на открытый экземпляр приложения Word с помощью функции GetObject, а если открытого экземпляра нет, создаем новый с помощью функции CreateObject:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub Primer3() Dim myWord As Object On Error Resume Next Set myWord = GetObject(, «Word.Application») If myWord Is Nothing Then Set myWord = CreateObject(«Word.Application») End If On Error GoTo Instr ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True Set myWord = Nothing Exit Sub Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If If Not myWord Is Nothing Then myWord.Quit Set myWord = Nothing End If End Sub |
Строка On Error Resume Next
передаст управление следующему оператору, если открытого экземпляра программы Word не существует, и выполнение функции GetObject приведет к ошибке. В этом случае будет создан новый экземпляр Word.Application с помощью функции CreateObject.
В код добавлен обработчик ошибок On Error GoTo Instr
, который поможет корректно завершить программу при возникновении ошибки. А также он позволит во время тестирования не наплодить большое количество ненужных экземпляров приложения Word. Проверяйте их наличие по Диспетчеру задач (Ctrl+Shift+Esc) и удаляйте лишние.
Строка Exit Sub
завершит процедуру, если она прошла без ошибок. В случае возникновения ошибки, будет выполнен код после метки Instr:
.