Vba не видит word

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

#1

02.09.2016 12:23:58

Добрый день, столкнулся со следующей проблемой в 2016 офисе.

Есть макрос, выполняющий роль заполнялки документов по шаблону. Выполняется макрос из excel файлика, среди шаблонов есть Word документы, соответсвенно приходится в самом макросе оперировать с этими word объектами через Word.Application. Макрос корректно работал на версии офиса 2010 и младше. Сейчас установили 2016 офис и возникла проблема — при выполнении одной из строк кода возникает ошибка

Код
Run-Time Error 4605
Данная команда недоступна

Начальная инициализация

Код
Dim WordApp As Object

Set WordApp = CreateObject("Word.Application")
With WordApp
        .Visible = False
        .WindowState = wdWindowStateNormal
        .ScreenUpdating = False
End With

Проблемная функция

Код
Private Sub WordReplacement(word_selection As String, _
                            replacement_text As String, _
                            appobject As Object)
                             
    appobject .Application.Selection.Find.ClearFormatting
    appobject .Application.Selection.Find.Replacement.ClearFormatting

    With appobject.Application.Selection.Find
        .Text = word_selection
        .Replacement.Text = replacement_text
        appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
    End With

Проблемная строка на которой светится ошибка 4605

Код
 appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Буду рад любой помощи

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А на этой строке нет ошибки?
.WindowState = wdWindowStateNormal
точно? Зачем Вам позднее связывание, если внутри кода напихали констант ворда?
Советую ознакомиться:

Как из Excel обратиться к другому приложению

проблема в том, что Excel ничего не знает о константах Word-а, в том числе и про эту: wdReplaceAll

Изменено: The_Prist02.09.2016 12:29:09

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

#3

02.09.2016 12:43:05

The_Prist
Да, все верно, именно поэтому приходится в начале инициализировать экземпляр объекта Word.Application
.WindowState = wdWindowStateNormal — на эту строку не ругается
Инициализация объекта Word.Application идет в самом начале макроса. Если я убираю вот эту строку из кода

Код
appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll

То макрос выполняется без ошибок. Шаблон с Word документом сохраняется с нужным мне именем. Однако нужных мне замен в этом шаблоне не производится.

ПОдключенные библиотеки

<#1><#2>

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#4

02.09.2016 12:48:58

Вместо констант пишите явно значение этих констант.

Код
Const wdReplaceAll = 2
    Member of Word.WdReplace

Изменено: Hugo02.09.2016 13:00:20

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

Проблема решена  — поменял формат шаблонов на .docx и переместил их с системного диска в документы пользователя.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

02.09.2016 13:51:39

Цитата
postrelll написал: Проблема решена

не хотите Вы прислушиваться и читать…Она обязательно может всплыть в другой раз. Т.к. библиотека Word 16 может не подхватиться на более ранних.
Сказать, почему макрос выполняется без ошибок? потому что все остальные переменные Word-а, возможно, тупо как 0 воспринимаются, т.к. директива Option Explicit не объявлена. И это тоже может повлечь свои ошибки.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

The_Prist
Да, я понимаю значение директивы Option Explicit.
Макрос выполняется корректно и результат так же корректен.

Проблема была в «безопасном режиме» шаблона, который открывался. В моем случае макрос открывал шаблон из указанного пути. В шаблоне в цикле делал замены в нужные места документов и затем сохранял шаблон под определенным именем. Ошибка изначально была связана с тем, что при открытии шаблона в безопасном режиме его невозможно редактировать, соответственно и делать замены в нём так же нельзя. А этот безопасный режим появился только в 2016 офисе (возможно и в 2013 он так же есть), поскольку в 2010 все открывалось нормально в обычном режиме. Стоит так же сказать, что шаблоны были в .doc формате для лучшей совместимости с более старыми офисами, поскольку макросом пользуются на самых разных ПК. Из-за этого и выползала ошибка.

Плюс я изначально все шаблоны загонял в отдельную папку на диске С.  Учитывая, что макрос сейчас запускается из-под WIn 10, проблему так же создавала встроенная защита системы, поскольку она любит подтверждать через UAC все процедуры перезаписи/удаления. Поэтому и перенес папку с шаблонами в документы пользователя.

Изменено: postrelll02.09.2016 17:05:03

 

Сергей Редькин

Пользователь

Сообщений: 1
Регистрация: 11.07.2021

#8

19.01.2022 08:58:23

У меня была похожая проблема со вставкой неформатированных значений из ячеек в размеченные закладками места в Word. Ошибки периодически вылазили на этой строке:

Код
.Application.Selection.PasteAndFormat (wdFormatPlainText)

Перенос файла шаблона в папку шаблонов по умолчанию не помог. Насколько понимаю проблемы возникают при вызове функций Word из VBA, запущенном в Excel, но до конца в причинах я так и не разобрался. Заменил Copy/Paste на вставку значения текстовой переменной. Самое интересное, что один Selection.Copy / Selection.PasteAndFormat (wdFormatPlainText) в самом конце макроса работает корректно, но как только вставляю в макрос несколько — вылазят ошибки.

Код
Sub CreateLetter()
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Dim SaveAsName As String

Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Set wdDoc = wdApp.Documents.Add(Template:="C:____.dotx", NewTemplate:=False, DocumentType:=0)

With wdDoc
       
    Text = Cells(6, 2).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Должность"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)
       
    Text = Cells(6, 1).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Организация"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)

    Text = Cells(6, 3).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Кому"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(6, 4).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Обращение"
    .Application.Selection.InsertAfter (Text)
           
    Text = Cells(2, 11).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Должность_подписант"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(2, 10).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Подписант"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(1, 10).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Исполнитель"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(1, 11).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Телефон"
    .Application.Selection.InsertAfter (Text)
    
    ActiveSheet.PivotTables("Заезжающие").PivotSelect _
        "'[#Inbox люди].[Фамилия Имя Отчество].[Фамилия Имя Отчество]'[All]", _
        xlLabelOnly + xlFirstRow, True
    Selection.Copy
    .Application.Selection.Goto wdGoToBookmark, , , "Список"
    .Application.Selection.PasteAndFormat (wdFormatPlainText)
    
    .SaveAs2 Filename:=("D:_______ & Format(Now, "yyyy-mm-dd hh-mm-ss") & ".docx"), _
    FileFormat:=wdFormatXMLDocument, AddtoRecentFiles:=False
    
    .Close
End With

wdApp.Quit

End Sub

Изменено: Сергей Редькин19.01.2022 10:39:43

Ципихович Эндрю

1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

1

18.10.2013, 17:23. Показов 6964. Ответов 28

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

здравствуйте, есть код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Public ObjectWord As Word.Application
 
Sub Main()
 
    Set ObjectWord = ThisDocument.Application
    
    ObjectWord.ScreenUpdating = False
 
    With ObjectWord.Selection.Fields(1).Code
        If .Text = "MACROBUTTON marr-not-marr marr" Then
            .Text = "MACROBUTTON marr-not-marr not marr"
        Else
            .Text = "MACROBUTTON marr-not-marr marr"
        End If
    End With
    
    ObjectWord.ScreenUpdating = True
 
End Sub

на строке
ObjectWord As Word.Application — определяемый пользователем тип не определён
как его определять? Спасибо

Добавлено через 44 минуты

Visual Basic
1
2
'при раннем связывании надо сначала подключить соответствующую библиотеку в референсах
'Проект > Ссылки > Microsoft Office 11.0 Object Library > выбрать > ОК

какую надо?



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 минут
дык — Microsoft Word 11.0 Object Library
и тогда пошло поехало, ThisDocument — тыщу раз меня к этому приучают, ну не взлетает….???
а я упираюсь ActiveDocument и взлетаю
ну почему мне пишут то, что не работает — ThisDocument — чем Вам это прельщает??



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

18.10.2013, 17:46

4

Set ObjectWord = ThisDocument.Application

Ну такое пройдёт разве что в макросе ворда, но никак не VB6

Добавлено через 1 минуту
В бейсике должен работать исключительно с объектом ObjectWord



0



Ципихович Эндрю

1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

18.10.2013, 17:50

 [ТС]

5

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

ThisDocument — тыщу раз меня к этому приучают, ну не взлетает….???

и как писать
???

Добавлено через 2 минуты

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

и как писать

Visual Basic
1
Set ObjectWord = ActiveDocument.Application

так, да??



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

18.10.2013, 17:52

6

Изначально док надо открыть или создать?
Я имею в виде что это для VB6

Добавлено через 35 секунд
Создать:

Visual Basic
1
2
3
4
5
6
7
Private Sub Command1_Click()
'Creating a new object
Set objWord = New Word.Application
objWord.Visible = True
'Creating a new document
Set objDoc = objWord.Documents.Add
End Sub

Добавлено через 45 секунд
Объявления глобально:

Visual Basic
1
2
Dim objWord As Word.Application
Dim objDoc As Word.Document

Добавлено через 34 секунды
Открыть:

Visual Basic
1
2
3
4
Private Sub Command5_Click()
  Set objWord = Word.Application
  Set objDoc = objWord.Documents.Open(App.Path & "HI.doc")
End Sub



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 минуты

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
'Открытие документа
 Function OpenDocum()
Dim NumPart As Integer
Err.Clear
 
'Смена стрелки мышки на часы
Screen.MousePointer = 11
 
On Error GoTo Notloaded
 
'Проверка на открытие WORD - а
    Set MyWord = GetObject(, " Word.Application")
 
Notloaded:
'Если Word не открыт
 If Err.Number = 429 Then
' Открытие WORD - а
Set MyWord = CreateObject("Word.Application")
    ElseIf Err.Number <> 0 Then
'Выдается сообщение об ошибке
MsgBox Err.Description & vbCrLf & "Error"
Screen.MousePointer = 0
        Exit Function
    End If
'Отменяется показ документа на экране, все будет происходить невидимо для пользователя
MyWord.PrintPreview = False
 
'Открытие стандартного документа,созданного мной, как  document1 или document2……
 
MyWord.Documents.Add "c:blank.doc", False
 
'Преход в функцию для печати необходимого текста вдокумент
PrintReportinWord
 
End Function



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

ну не прёт

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit
 
'при раннем связывании надо сначала подключить соответствующую библиотеку в референсах
'Проект > Ссылки > Microsoft Word 11.0 Object Library > выбрать > ОК
'объявляем глобально для видимости во всём проекте
Dim objWord As Word.Application
Dim objDoc As Word.Document
 
Sub Main()
 
    Set objWord = Word.Application
    Set objDoc = GetObject(, " Word.Application")
    
    objDoc.ScreenUpdating = False
 
    MsgBox$ objDoc.Fields.Count
        
    objDoc.ScreenUpdating = True
 
End Sub

Добавлено через 16 минут

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

Set objDoc = GetObject(, » Word.Application»)

главное ошибка 429 компонет активХ не может

создать

объект

Добавлено через 1 час 9 минут
Ворд открыт, но если так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Option Explicit
 
'при раннем связывании надо сначала подключить соответствующую библиотеку в референсах
'Проект > Ссылки > Microsoft Word 11.0 Object Library > выбрать > ОК
'объявляем глобально для видимости во всём проекте
Dim objWord As Word.Application
Dim objDoc As Word.Document
 
Sub Main()
 
On Error GoTo Notloaded
 
'Проверка на открытие WORD'а
    Set objDoc = GetObject(, " Word.Application")
 
Notloaded:
'Если Word не открыт
 If Err.Number = 429 Then
'Открытие WORD'а
Set objDoc = CreateObject("Word.Application")
End If
         
    objDoc.ScreenUpdating = False
 
    MsgBox$ objDoc.Fields.Count
        
    objDoc.ScreenUpdating = True
 
End Sub

тогда на строке

Visual Basic
1
Set objDoc = CreateObject("Word.Application")

ошибка 13 — несоответствие типов



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

18.10.2013, 19:46

12

Visual Basic
1
2
3
4
5
Dim MyWord
Dim D As Object
 
    Set MyWord = GetObject(, "Word.Application")
Set D = MyWord.ActiveDocument

Добавлено через 39 секунд
D = открытому доку



0



Ципихович Эндрю

1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

18.10.2013, 20:10

 [ТС]

13

спасибо пока проверю

Добавлено через 14 минут
ну не пошло

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
'при раннем связывании надо сначала подключить соответствующую библиотеку в референсах
'Проект > Ссылки > Microsoft Word 11.0 Object Library > выбрать > ОК
'объявляем глобально для видимости во всём проекте
Dim objAsWordApplication As Word.Application
Dim objAsWordDocument As Word.Document
Dim objAsObject As Object
 
Sub Main()
 
 Set objAsWordApplication = Word.Application
 Set objAsWordDocument = GetObject(, "Word.Application")
 Set objAsObject = objAsWordDocument.ActiveDocument
 
    objAsObject.ScreenUpdating = False
 
    MsgBox$ objAsObject.Fields.Count
        
    objAsObject.ScreenUpdating = True
 
End Sub

всё тоже несоответствие типов

Visual Basic
1
Set objAsWordDocument = GetObject(, "Word.Application")



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 вполне хватит.

можно даже вообще не объявлять тип!
Работает и так!

Visual Basic
1
2
3
4
5
6
7
8
Private Sub Комманда1_Click()
Dim MyWord
Dim D
 Set MyWord = GetObject(, "Word.Application")
Set D = MyWord.ActiveDocument
 MyWord.ScreenUpdating = False
 Debug.Print MyWord.ScreenUpdating
End Sub

Добавлено через 2 минуты
А если закомментить Option Explicit, то вообще:

Visual Basic
1
2
3
Private Sub Комманда1_Click()
Set MyWord = GetObject(, "Word.Application"): Set D = MyWord.ActiveDocument: MyWord.ScreenUpdating = False
End Sub



0



1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

18.10.2013, 21:24

 [ТС]

17

как насчёт
ошибка 4248 Данная команда не доступна, так как не открыт ни один документ
ОН ОТКРЫТ



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

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Сначала закрой все.

это обязательно, без этого почему никак?

Добавлено через 34 секунды

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Так определись сначала: есть ли открытый документ?

ну глазам то я верю — есть открытый



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

Cindy Meister's user avatar

asked Oct 30, 2018 at 21:34

Kaiser Otto's user avatar

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.

  1. In the VBA IDE ensure each module starts with ‘Option explicit’

  2. In the VBA IDE ensure that all checkboxes in Tools.Option.Code Settings are ticked

answered Oct 30, 2018 at 21:49

freeflow's user avatar

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:.

Понравилась статья? Поделить с друзьями:
  • Vba надстройка для word
  • Vba надстройка для excel скачать
  • Vba на сортировку excel от а до я
  • Vba на разных листах excel
  • Vba на английском excel