Vba не переходит к word

I have searched thru other posts for this topic but can not find a solution. I want to run some VBA code in excel 2016 (on an imac running OS 10.13.5) to open a word document (preferably as Read Only).
If an instance of word is already running, I want to close it before proceeding. (It would be nice if word is already running to be asked if I wanted to save the other instance(s) before closing them.)
The code I have is

Private Sub CommandButton1_Click()
Dim w As Object
' If word is already open get ahold of the running instance
' Otherwise create a new instance
On Error Resume Next
Set w = GetObject(, "Word.Application")
If w Is Nothing Then Set w = CreateObject("Word.Application")  
On Error GoTo 0
' Close all open files and shutdown Word
' Loop through any open documents and close them
Do Until w.Documents.Count = 0
    w.Documents(1).Close
Loop
w.Quit False
Set w = Nothing
' Now that all instances of word are closed, open the template
Dim wdApp As Object
Dim wdDoc As Object
Set wdApp = CreateObject("Word.application")  
wdApp.Visible = True
wdApp.DisplayAlerts = False
MYPATH = "Volumes/256SSD/""How to do stuff""/""myfile.docx"""
Set wdDoc = wdApp.Documents.Open(FileName:=MYPATH)
End Sub

When I run this with word already open, I get variable results. Sometimes the code runs thru the «do until loop» and seems to close the open word instances then proceeds to the last line and gives a vba runtime error «Application-defined or object-defined error». A word instance has been started and is awaiting input of which file to be opened.

If I immediately run the code again, the «do until loop» is not entered and word come asking for file name input. VBA gives a run time error «Automation error». I can then select a file name from Recent Files and this is opened but the run time error remains and the file selected in MYPATH is not opened.

I would appreciate some help on this.

I am trying access window of MS Word from Excel. I found methods to access a new Word document or a specific one, like the one at
Copy Text from Range in Excel into Word Document,

But in my case I do not know the name of the document, it should be the last active one. I was hoping to use something like

Word.ActiveDocument

but no success. I also tried to simulat Alt+Tab keystroke to activate the window with

Application.SendKeys("%{TAB}")

but it does not work too. Any hint?

I am trying to create a macro that will just copy charts and some text around to Word and do some formating of the text along with it. So basically I can use any approach to this task.
Thanks a lot.

Community's user avatar

asked Feb 21, 2013 at 15:16

Pepacz's user avatar

3

You can access an open instance of Word by using late binding (http://support.microsoft.com/kb/245115) and GetObject. If you have multiple instances of Word open you are not guaranteed of getting any one of them in particular though.

Getting an instance of Word will allow you to access the ActiveDocument or the Application’s current Selection. I’d still suggest doing some error checking to make sure you’ve got what you want.

    Sub GetWordDocument()
        Dim wdApp As Object

        'Turn off error handling since if the Application is not found we'll get an error
        'Use Late Binding and the GetObject method to find any open instances of Word
        On Error Resume Next
        Set wdApp = GetObject(, "Word.Application")
        On Error GoTo 0

        'Check to see if we found an instance.  If not you can create one if you desire
        If wdApp Is Nothing Then
            MsgBox "No instances of Word found"
            Exit Sub
        End If

        'Check if there are documents in the found instance of Word
        If wdApp.Documents.Count > 0 Then
            wdApp.Selection.TypeText "Cool, we got it" & vbCr

            'You can now access any of the active document properties too
            wdApp.ActiveDocument.Range.InsertAfter "We did indeed"
        End If

        'Clean up the Object when Finished
        Set wdApp = Nothing
    End Sub

answered Feb 21, 2013 at 20:29

CuberChase's user avatar

CuberChaseCuberChase

4,4305 gold badges33 silver badges52 bronze badges

1

Автор Дарья, 16 июля 2019, 17:54

Имеется редактируемый непостоянный (каждый раз под новым именем) документ.
Макрос переходит в другой постоянный документ по имени файла, там выбирает и копирует таблицу.
Как вернуться в предыдущий документ, чтобы вставить содержимое буфера обмена? Alt + Tab не работает, так как макрос ссылается на имя файла, а оно меняется каждый раз.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Присвойте документам, с которыми надо работать, имена (смотрите комментарии в коде).
src означает «source», источник. Это файл, откуда извлекаются данные.
res означает «result», результат. Это файл, который нужно заполнить.

Код

Sub Макрос()

    Dim doc_src As Document, doc_res As Document

            ‘ Присваиваем имена документам, с которыми надо работать.
    Set doc_src = Documents(«полное имя файла (путь + имя с расширением)»)
    Set doc_res = ActiveDocument

        ‘ Пишите имя документа, ставьте точку и выбирайте нужный метод, свойство.
    ‘ Например, так можно узнать имена файлов.
    ‘ Результат выводится в View — Immediate Window.
    Debug.Print doc_src.Name
    Debug.Print doc_res.Name

    End Sub

[свернуть]

Примечания

1. Как указать имя известного документа:

1) можно указать полное имя (путь + имя с расширением);

2) можно указать только имя с расширением.
Но здесь есть опасность. В ворде может быть открыто два файла с одинаковыми именами. Если вы укажите только имя файла, то макрос может обратиться не к тому файлу, как вы думаете. Поэтому, если есть возможность, указывайте полное имя файла. Или делайте проверку: не открыто ли два файла с одинаковыми именами.

2. Не всегда есть необходимость переходить в файл, чтобы с ним что-то сделать. Если можно работать с файлом, не переходя в него, то не переходите, т.к. в этом нет смысла.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Если у вас написано много кода и не хочется подставлять имя (sh_src, sh_res), то можете просто переходить с файла на файл так:
doc_src.Activate
doc_res.Activate



  • Форум по VBA, Excel и Word

  • Word

  • Макросы в Word

  • Word VBA Макросы: Как переключаться между документами ворд, если имя одного файла не известно?

Seem

0 / 0 / 0

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

Сообщений: 23

1

31.07.2013, 21:20. Показов 1962. Ответов 3

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


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

Доброго времени суток!
Необходимо получить доступ к открытому экземпляру Word. Сделать это при помощи ниже приведенного кода не получается, так как Shell32.Shell содержит только окна проводника.

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim myShell As New Shell32.Shell
        Dim myWord As Object
        'ищем среди открытых окон Word
        For Each myWord In myShell.Windows
            Debug.Print(myWord.Name)
            If InStr(myWord.Name, "Здесь часть имени окна", CompareMethod.Text) Then
                Exit For
            End If
        Next myWord
        If myWord Is Nothing Then
             Exit Sub
        End If
End Sub

Через какой тип объекта можно получить доступ к word или любому другому приложению.
Спасибо Всем за помощь!



0



The_Prist

1337 / 308 / 74

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

Сообщений: 635

31.07.2013, 21:47

2

Лучший ответ Сообщение было отмечено The trick как решение

Решение

Если из VB или другого приложения(не офисного):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub

Если из Excel или любого другого офисного приложения через VBA:

Visual Basic
1
Application.ActivateMicrosoftApp xlMicrosoftWord



1



0 / 0 / 0

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

Сообщений: 23

31.07.2013, 22:08

 [ТС]

3

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

Огромное спасибо! Тема закрыта, но кому интересно предлагайте свои реализации.



0



695 / 236 / 18

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

Сообщений: 583

Записей в блоге: 1

03.08.2013, 09:48

4



1



Хитрости »

24 Февраль 2012              91422 просмотров


Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Excel диапазон "A1:A10"
    Range("A1:A10").Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    'закрываем документ Word с сохранением
    objWrdDoc.Close True    ' False - без сохранения
    'закрываем приложение Word - обязательно!
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)

В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в определенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:

Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp()
    Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

но данный метод может пригодиться только в том случае, если Вам необходимо действительно лишь активировать другое приложение, но дальше обращаться к этому приложению Вы уже не сможете.

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools -References:

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord()
    Dim objWrdApp As Word.Application
    Set objWrdApp = New Word.Application
    objWrdApp.Visible = True
End Sub

Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения.

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Метод установки ссылки на библиотеку приложения через ToolsReferences называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения в коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(ViewImmediate Window или сочетание клавиш Ctrl+G), записать вопросительный знак и вставить эту константу и нажать Enter:
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.

Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    Range.Copy
    'вставляем скопированное в ячейку А1 активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    'при этом перед Range явно указываем откуда его брать - из документа Word -objWrdDoc("C:Doc1.doc")
    objWrdDoc.Range.Copy
    'вставляем скопированное из Word в активную ячейку активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.


В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)


А в архиве ниже — практически готовое решение заполнения всевозможных бланков Word из Excel. Как это работает. У нас есть таблица Excel с данными для заполнения бланков заявлений на пособия:
Исходная таблица
Обращаю внимание, что в первой строке расположены метки. Они нужны для того, чтобы код мог понять значения какого столбца в какое место шаблона Word должны попасть. А в самом шаблоне Word мы должны проставить эти самые метки:
Шаблон Word с метками
Фигурные скобки сделаны для того, чтобы код 100% искал и заменял только метку в шаблоне, исключая при этом замену случайного текста вне скобок(ведь слово «Должность» может встречаться и само по себе).
А здесь я схематично привел то, как будут происходить замены:
Схема замен
Сначала программа создаст новую папку, в которую и будет сохранять создаваемые файлы(имя папки состоит из даты и времени запуска кода). Далее программа циклом пройдется по каждой строке таблицы, создаст на основании шаблона Word(«Шаблон.doc») новый файл для этой строки, заполнит этот шаблона данными на основании меток, и сохранит созданный файл под новым именем. Сам файл шаблона при этом не изменяется — все метки в нем сохраняются как были настроены до запуска кода. Конкретно в приложенном коде значение для имени нового файла берется из первого столбца «ФИО с инициалами». Но это можно изменить в коде при необходимости. Делается это в этой строке:

'считываем фамилию с инициалами
sWDDocName = .Cells(lr, 1).Value

Что еще важно: файл шаблона Word должен находиться в той же папке, что и файл с кодом. Название файла в приложенном к статье файле должно быть «Шаблон.doc». Но его так же можно изменить, не забыв изменив его в коде в этой строке:

'имя шаблона Word с основным текстом и метками
Const sWDTmpl As String = "Шаблон.doc"

В общем-то, если хоть чуть-чуть разбираетесь, то поменять можно многое. А для тех, кто не разбирается достаточно будет просто создавать метки в файле Word и обозначать ими столбца в таблице Excel. Количество столбцов и строк в таблице код определяет автоматически и при изменении размеров таблицы ничего изменять не надо. Главное, чтобы метки находились в первой строке, вторая строка — заголовок(необязательно), а с третьей строки начинаются данные, которые и используются для наполнения шаблонов.
Скачать пример:

  Автосоздание бланков Word из таблицы Excel.zip (37,6 KiB, 1 470 скачиваний)

Примеры работы с тем же Outlook можно посмотреть в моих статьях:
Как отправить письмо из Excel?
Сохранить вложения из Outlook в указанную папку


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Создание нового экземпляра приложения 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:.

 

Slaventy

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

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

#1

23.12.2013 19:04:31

Здравствуйте
Возникла проблема. Я копирую таблицу из excel в Word. Так как у меня в Excel большая таблица, то мне надо в Word копировать таблицы по 10 строчек на страницу. Я на первую страницу могу скопировать, но как перейти на вторую и начать там делать не знаю. Мне кажется где-то на форуме я встречал что-то подобное, но никак не могу найти.
Я вначале думал строкой

Код
   objDoc.Application.Visible = True
   objDoc.Selection.MoveDown Unit = 5, count = 5 

Но не получилось. Я могу перейти в конец документа, но перейди на вторую не получилось
Подскажите как переходить на вторую страницу в Word?

P.S. (приложил файл моего кода, если кому-то надо глянуть на код, того что я делаю)

Прикрепленные файлы

  • 21122013.xlsm (29.78 КБ)

 

Антон

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

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

#2

23.12.2013 19:32:09

http://msdn.microsoft.com/en-us/library/office/ff821348.aspx

не забываем читать.

Код
If ActiveDocument.Endnotes.Count >= 2 Then   
Selection.GoTo What:=wdGoToEndnote, Which:=wdGoToAbsolute, Count:=2  
End If

должно сработать

 

Slaventy

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

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

#3

23.12.2013 21:24:44

Антон

вашим способом не получается.
Я так понимаю функция GoTo может перейти на уже существующие страницы, а у меня существует только одна страница и мне каким-то образом надо её создать и потом перейти.
Либо ещё как-то это сделать.

Я создал документ ворд

Код
    Dim objWord As Object
    On Error Resume Next
    Application.ScreenUpdating = False
    Set objWord = GetObject(, "Word.Application")
    If Err Then Set objWord = CreateObject("Word.Application")

    Set objDoc = objWord.Documents.Add()
    objDoc.ActiveWindow.ActivePane.View.Zoom.Percentage = 100
 
    With objDoc
        .PageSetup.PaperSize = 8   '
        .PageSetup.Orientation = 1 '
        .Parent.Visible = True
    End With
 

вывел десять строк

Код
    For i = 1 To 11

        objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(2), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(3), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
        objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(5), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(4), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
        objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(9), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(6), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
        objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(15), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(2), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
    Next i
 

А теперь мне надо перейти на вторую страницу и там вывести следующие 10 строк.

Вопрос. Как перейти на вторую страницу документа ворд, если из макроса экселя создался документ имеющий одну страницу?

 

Юрий М

Модератор

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

Контакты см. в профиле

#4

23.12.2013 22:06:45

Цитата
…может перейти на уже существующие страницы, а у меня существует только одна страница и мне каким-то образом надо её создать и потом перейти.

А как Вы вручную это делаете в Word?

 

Slaventy

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

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

#5

23.12.2013 22:40:00

Вручную я просто нажимаю Enter. Я так понимаю мне предлагают просто добавить пустой параграф.

Код
objDoc.Activate  
objWord.Selection.TypeParagraph 

Если я прав то пожалуйста скажите мне.
И ещё вопрос.
И ещё небольшой вопрос. (я конечно ещё по форуму посмотрю, но если не трудно будет подсказать, буду благодарен)

я добавляю таблицу

Код
    For i = 1 To 11

     objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(2), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(3), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
     objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(5), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(4), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
     objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(9), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(6), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
     objDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, Application.CentimetersToPoints(15), Application.CentimetersToPoints(7 + 0.5 * i), Application.CentimetersToPoints(2), Application.CentimetersToPoints(0.5)).TextFrame.TextRange.Text = CStr(i)
    Next i 

Вот вычитал

Код
' Перемещаемся в конец Word-документа 
objDoc.Activate 
objWord.Selection.EndKey Unit:=6 ' 6 = wdStory 
 

Но у меня почему-то не переходит на конец таблицы. И когда я добавляю параграфы, то идёт и смещение таблицы.
Как перейти на конец таблицы, чтобы добавляя параграфы не смещать её?

 

Юрий М

Модератор

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

Контакты см. в профиле

Наверное, эти вопросы лучше задать на форуме по Word… Или попробовать записать рекордером.

 

Slaventy

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

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

#7

24.12.2013 13:20:25

Спасибо. Буду искать решение.

word-vba-tutorial-susan
Image: Sai/Adobe Stock

Visual Basic for Applications is the language behind the Office apps that allows you to automate tasks. But using VBA in Word has its challenges. The first is moving around in a document because of all the different types of content: Text, pictures, tables and so on. In this tutorial, I’ll show you two simple VBA procedures for navigating. One identifies the beginning of a Word document, and the other identifies the document’s end.

I’m using Microsoft 365 on a Windows 10 64-bit system, but you can use an earlier version. You may access the demo files here. Word for the web doesn’t support VBA.

SEE: Google Workspace vs. Microsoft 365: A side-by-side analysis w/checklist (TechRepublic Premium)

About Microsoft Word VBA’s ActiveDocument

The main VBA component that we’ll rely on in both procedures is the ActiveDocument property, which returns a Document object that represents the active document. In other words, this opens the document, as a whole. You won’t need this for every VBA procedure in Word, but you will need it when you need to reference “parts” of the document.

If no Word document is open, this property returns an error. If you’re using this property from inside Excel or PowerPoint, you should include error-handling for this situation.

This property uses the following form:

expression.ActiveDocument

where expression is a variable that represents the Application object (Word). Fortunately, in Word, this is implicitly implied.

The next piece of VBA we’ll use is the Range method, which uses the form

expression.Range(start, end)

to return a Range object. We’ll use this method to identify an area of the document.

There’s no method that says “go to the beginning,” or “go to the end,” so we’ll use the start and end arguments to identify both. Both arguments are optional, and as you might suspect, start identifies the first character position and end identifies the last character position.

Now, let’s move on to the actual VBA procedures.

How to use VBA to find the beginning of a Word document

Moving the cursor to the beginning of a Word document using VBA is amazingly simple. Listing A shows the procedure. First, the procedure declares and defines a range object, using 0s to identify the beginning of the document. Two 0s will place the cursor before any content in the active document. The second line adds a bit of text and the vbNewLine constant adds a new line.

Listing A

Sub GoToStart()

'Move cursor to the beginning of the active document.

'Add a short text phrase to show it worked.

Dim rBegin As Range

Set rBegin = ActiveDocument.Range(0, 0)

rBegin.Text = "This is the beginning of this document." & vbNewLine

End Sub

Now let’s look at the second procedure that moves the cursor to the end of a document.

How to use VBA to find the end of a Word document

As mentioned, there is no method that says “go to the end,” so we need to force the issue by finding the last character. It is a bit more complex, but not difficult, as shown in Listing B. This procedure works similar to the first, but it enters the text at the end of the document, which it finds by using the Last property of the Characters object.

This time we positioned the vbNewLine constant before the text.

Listing B

Sub GoToEnd()

'Move cursor to the end of the active document.

'Add a short text phrase to show it worked.

Dim rEnd As Range

Set rEnd = ActiveDocument.Range.Characters.Last

rEnd.Text = vbNewLine & "This is the end of this document."

End Sub

How to enter and run the VBA procedures into a Word document

Now it’s time to enter both procedures for use in a Word document. I’m using a short two-page Word document, shown in Figure A, with a variety of content saved as a macro-enabled Word file. If you are using a ribbon version, you must save the Word document as a macro-enabled file to run VBA. If you’re working in the menu version, you can skip this step.

Figure A

WordVBA_A

Image: Susan Harkins/TechRepublic. The VBA procedures will add a bit of content to the beginning and the end of this Word document.

To enter the VBA procedures, press Alt + F11 to open the Visual Basic Editor (VBE). In the Project Explorer to the left, select ThisDocument. You can enter the code manually or import the downloadable .cls file. In addition, the procedure is in the downloadable .docm and .doc files. If you enter the code manually, don’t paste from this web page. Instead, copy the code into a text editor and then paste that code into the ThisDocument module. Doing so will remove any phantom web characters that might otherwise cause errors.

Now let’s run the procedures as follows:

  1. Click the Developer tab.
  2. Choose Macros in the Code group.
  3. In the resulting dialog, choose GoToStart (Figure B).
  4. Click Run.

As you can see in Figure C, the procedure inserts text and a line break at the beginning of the Word document. Now let’s repeat this process but choose GoToEnd (Figure B). This procedure inserts a line break and a bit of text to the end of the Word document, as you can see in Figure D.

Figure B

WordVBA_B

Image: Susan Harkins/TechRepublic. Choose the procedure.

Figure C

WordVBA_C

Image: Susan Harkins/TechRepublic. GoToStart() added a sentence to the beginning of the Word document.

Figure D

WordVBA_D

Image: Susan Harkins/TechRepublic. GoToEnd() added a sentence to the end of the Word document.

One thing you might notice is that both of the inserted sentences use different formats. These sentences, like any other, will use the format in place. This is worth remembering if you want inserted text to use a specific format instead.

Most likely, you won’t want to work through all those steps to run this macro. I recommend that you add it to the Quick Access Toolbar or a custom group. If you need help with that, read How to add Office macros to the QAT toolbar for quick access.

Stay tuned

Both VBA procedures are simple — both the procedures themselves and the tasks they complete. The goal is to show you how to navigate to both spots using VBA. Over the next few months, I’ll devote a few articles to more navigational VBA in Microsoft Word documents.

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