aski4 0 / 0 / 0 Регистрация: 05.05.2020 Сообщений: 2 |
||||||||
1 |
||||||||
Как правильно определить конец документа для работы с ним?05.05.2020, 12:50. Показов 4019. Ответов 3 Метки vba word (Все метки)
Сразу два вопроса: 1) Была тут тема Как определить конец документа в Word?. Пытался подробным способом выделить и удалить последнюю страницу.
(Извиняюсь что код на шарпе, а не vba, не думаю что это сильно влияет на суть вопроса. Ответ приветствуется на любом языке.) 2) Примерно таким же способом пытаюсь перейти на конец документа и добавить пустую страницу
Добавляется две пустых страницы вместо одной. Как правильно добавить одну страницу в конец документа?
0 |
amd48 779 / 461 / 79 Регистрация: 18.05.2016 Сообщений: 1,242 Записей в блоге: 4 |
||||||||||||
06.05.2020, 07:33 |
2 |
|||||||||||
не совсем понятно, что именно надо получить. количество листов в документе?
или, если у вас приложуха Word запущена, то почему просто не перейти к концу документа?
Добавлено через 7 минут
а вы добавляете разрыв страницы InsertBreak
1 |
aski4 0 / 0 / 0 Регистрация: 05.05.2020 Сообщений: 2 |
||||||||
06.05.2020, 09:35 [ТС] |
3 |
|||||||
amd48 2. пустая страница добавляется так:
Такая вставка новой страницы работает, спасибо. Количество страниц, не совсем то что мне нужно определить, для определения количества я использую:
Остался вопрос: как удалить последнюю страницу со всем содержимым?
0 |
amd48 779 / 461 / 79 Регистрация: 18.05.2016 Сообщений: 1,242 Записей в блоге: 4 |
||||
06.05.2020, 13:36 |
4 |
|||
как удалить последнюю страницу со всем содержимым? Ну удаляется не страница, а текст. Если страница добавлена разрывом страниц, то это символ разрыва.
Добавлено через 8 минут
0 |
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
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:
- Click the Developer tab.
- Choose Macros in the Code group.
- In the resulting dialog, choose GoToStart (Figure B).
- 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
Figure C
Figure D
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.
In my vba code I need to go to the end of the word document.
The vba is written and executed from Excel.
The statement : Selection.EndKey unit:=wdStory, Extend:=wdMove » will not run.
Can anyone explain where I do the mistyping.
I have tried to use the statement in other vba codes, but without success.
Sub InsertFromFilesTestEnd()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Set wrdApp = New Word.Application
Set wrdDoc = wrdApp.Documents.Open("c:userspeterdocumentsdirekte 0302 1650.docm")
wrdApp.Visible = True
wrdApp.Activate
Application.ScreenUpdating = False
Selection.EndKey unit:=wdStory, Extend:=wdMove
End Sub
Hopefully you can guide me to the end of my document. When so, I am sure I can use «selection» to move around in the document.
asked Feb 8, 2019 at 13:04
2
The issue here is that Selection
isn’t qualified to which application’s Selection
you are wanting. As such, it’s using the default for Excel VBA, which would be the Excel Application in which the VBA was launched. Implicitly you are saying:
Application.Selection.EndKey unit:=wdStory, Extend:=wdMove
The error is because Excel’s Application.Selection
object doesn’t have an EndKey
method and so VBA has no idea what you are trying to do here.
Instead you want to qualify that Selection
with the instance of the Word.Application
object you are already working with:
wrdApp.Selection.EndKey unit:=wdStory, Extend:=wdMove
answered Feb 8, 2019 at 13:57
JNevillJNevill
45.8k3 gold badges36 silver badges60 bronze badges
0
Using Selections in cases like this is quite unnecessary. Aside from being inefficient, it’s also prone to producing a lot of screen flicker. Try, for example:
Sub InsertFromFilesTestEnd()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Set wrdApp = New Word.Application
With wrdApp
.Visible = True
.ScreenUpdating = False
Set wrdDoc = .Documents.Open("c:userspeterdocumentsdirekte 0302 1650.docm")
With wdrDoc
.Range.Characters.Last.InsertFile FileName:="MyFileName", Range:="", _
ConfirmConversions:=False, Link:=False, Attachment:=False
End With
.Activate
.ScreenUpdating = True
End With
End Sub
answered Feb 10, 2019 at 20:30
macropodmacropod
12.6k2 gold badges9 silver badges21 bronze badges
Поскольку вы используете константы Word, вы, очевидно, установили ссылку на Word. В этом случае вам лучше воспользоваться этим в полной мере. Например:
Dim WdApp As New Word.Application, WdDoc As Word.Document, WdRng As Word.Range
With WdApp
Set WdDoc = .Documents.Open("\tp.corpdata" & a & "document.docx")
With WdDoc
Set WdRng = .Range.Characters.Last
With WdRng
.Font.ColorIndex = wdBlue
.InsertDateTime DateTimeFormat:="yyyy-MM-dd", InsertAsField:= _
False, DateLanguage:=wdPolish, CalendarType:=wdCalendarWestern, _
InsertAsFullWidth:=False
.TypeText Text:=" text "
.Collapse wdCollapseEnd
.Font.ColorIndex = wdBlack
.TypeParagraph
End With
End With
End With
Примечание: нет необходимости, чтобы Word был видимым или чтобы что-то было выбрано, пока выполняется что-либо из этого.
Программирование в Word |
217 |
Select() — позволяет просто выделить весь документ. Этот метод существует для очень большого количества объектов, в том числе для Selection
и Range.
TransformDocument() — исключительно мощный метод, но только для программистов, которые хорошо разбираются в XML и XSLT. Позволяет применить к документу таблицу преобразований стилей (Extensible Stylesheet Language Transformation, XSLT), при помощи которой можно поменять все, что угодно.
Undo() — отменяет определенное количество последних действий. По синтаксису и принципам работы — полный аналог метода Redo().
UndoClear() — очищает буфер отмены изменений, чтобы пользователь не смог откатить произведенные действия.
UnProtect() — снимает защиту с документа (определенную методом Protect() или в графическом интерфейсе). Может быть очень полезным перед программным внесением изменений в защищенный документ.
Часто используемых событий у объекта Document всего три: New (можно определить только для шаблона, срабатывает, когда на основе этого шаблона создается новый документ), Open и Close. Все эти события очевидны и изначально доступны в окне редактора кода Visual Basic.
10.5.1. Работа с объектом Selection
После того как мы запустили приложение, нашли и активизировали нужный нам файл, следующее действие, которое выполняется чаще всего, — ввод или редактирование текста в нужном месте. Для этого используются объекты Selection, Range и Bookmark. Каждое из них используется в своих ситуациях и для своих задач.
Первый объект, который мы рассмотрим, — это объект Selection.
Обычно перед тем, как что-либо сделать в окне документа Word, пользователь либо выделяет нужный фрагмент текста, либо переставляет указатель вставки текста в нужное место. Объект Selection представляет именно такой выделенный участок текста (а если ничего не выделено пользователем, то место, где находится указатель вставки). Именно этот объект обычно использует макрорекордер.
Создавать объект Selection и получать на него ссылку в переменную совершенно не нужно. Дело в том, что объект Selection в документе может быть
только один. Он создается автоматически при запуске Word и всегда доступен. Обращаться к нему можно так:
Application.Selection.Text = «Вставляемый текст»
или просто:
Selection.Text = «Вставляемый текст»
Обычно нам нужно правильно определить то место, на которое указывает объект Selection, чтобы выделить нужный нам участок текста или точку для ввода.
Существует несколько способов для настройки выделения в документе Word:
самый простой способ — положиться на выделение нужного текста пользователем. Обычно такой способ применяется для сложного редактирования или форматирования участков текста и для ввода информации в указанное пользователем место документа, когда в автоматическом режиме нужное место не найти;
воспользоваться методом Select(), который предусмотрен для огромного числа объектов (Document, Range, Bookmark, Table со всеми подобъектами типа столбцов и строк, PageNumber, Field и т. п.). Этот метод просто выделяет весь документ, закладку, таблицу и т. п.;
воспользоваться многочисленными методами объекта Selection, чтобы преобразовать уже существующее выделение;
воспользоваться объектом Find для поиска нужного фрагмента текста. Подробнее об этом объекте — в разд. 10.6.5;
если вам нужно ввести информацию в самое начало документа, можно вообще ничего не делать. По умолчанию указатель вставки устанавливается на начало документа. Только не забудьте сделать этот документ активным.
Если вы полагаетесь на выделение нужного места пользователем, то помните, что пользователь может ухитриться выделить одновременно несмежные участки текста (при помощи клавиши <Ctrl>) или выделить не текст, а часть таблицы, рисунок или другой нестандартный объект в документе. Чаще всего поведение программы, работающей с объектом Selection, в этом случае становится совершенно непредсказуемым, поэтому рекомендуется всегда использовать дополнительные проверки при помощи свойств Type и Information
объекта Selection.
Несмотря на то, что применение объекта Selection — самый простой и наглядный метод редактирования текста, и чаще всего именно он используется макрорекордером, на практике программисты применяют его редко. Объясняется это очень просто: при использовании этого объекта мы слишком зави-
Программирование в Word |
219 |
сим от действий пользователя. Если во время выполнения нашего кода пользователь проявит инициативу и начнет щелкать по документу мышью, результат может быть непредсказуемым. Защититься от вмешательства пользователя можно двумя способами:
работать со скрытым (т. е. невидимым) документом или, возможно, со скрытым экземпляром Word. Для включения и отключения видимости можно использовать свойство Visible объектов Document или Application;
более удобный способ — вместо объекта Selection использовать объекты Range и Bookmark, о которых будет рассказано в следующих разделах.
10.5.2. Свойства и методы объекта Selection
Вначале расскажем о самых часто используемых свойствах объекта
Selection.
Bookmarks — возвращает коллекцию Bookmarks, т. е. все закладки, которые имеются в выделенном фрагменте текста. Закладки — один из самых часто используемых объектов в приложениях VBA с использованием Word. Подробнее о них будет рассказано в разд. 10.5.
Start и End — свойства, которые определяют номера первого и последнего символа в выделении (по отношению к тексту документа или другим его частям, например, к сноске). Первая позиция в тексте документа — всегда 0. Если вы создаете документ из неизменяемого шаблона, можно использовать эти свойства, чтобы найти нужное место в документе для ввода текста (однако этот способ не очень рекомендуется, потому что при правке шаблона вам придется править много программного кода).
ExtendMode — переключает пользователя в режим выделения текста, когда нажатие клавиш со стрелками, <Home> и <End> приводит не к перемещению указателя ввода, а к изменению выделения.
Find — очень важное свойство, которое возвращает объект Find. Подробнее об этом объекте и о его вложенном объекте Replace будет рассказано в
разд. 10.6.5.
Flags — свойство, которое позволяет проверить или изменить некоторые моменты, связанные с выделением: является ли оно активным, находится ли в конце строки и т. п. Регулирует одновременно пять параметров при помощи битовой маски.
Font — возвращает объект Font, при помощи которого можно управлять оформлением текста в выделении. Доступны все возможности, которые есть на графическом интерфейсе в меню Формат | Шрифт. Например, чтобы назначить выделенному тексту шрифт Arial 10 pt, можно использовать код:
Selection.Font.Name = «Arial»
Selection.Font.Size = 10
Information — важнейшее свойство объекта Selection для целей проверок. Возвращает огромное количество информации о выделении (в какой части документа, внутри таблицы или нет, включены ли клавиши <CapsLock> и <NumLock>, включен ли режим «Замена» при вводе текста, на какой странице находится выделение и сколько страниц и т. п.).
IPAtEndOfLine — возвращает True, если курсор ввода текста (insertion point — IP) находится в конце строки (в крайнем правом положении при выравнивании).
LanguageId — позволяет пометить выделение, как написанное на определенном языке. Правильное определение языка позволяет избежать проблем при проверке орфографии.
NoProofing — отменяет для выделения проверку орфографии и грамматики. Очень рекомендуется помечать таким образом текст с программным кодом, списками фамилий, названиями фирм, специфическими терминами и т. п.
Range — создает из выделения объект Range.
StoryType — еще одно свойство для проверок. Определяет тип текста документа, в котором находится выделение.
Text — самое важное свойство объекта Selection. Позволяет ввести текст на месте выделения (или в том месте, где стоит указатель). Например, чтобы 100 раз напечатать текст «Привет!», можно воспользоваться кодом:
For i = 0 To 100
Selection.Text = «Привет!»
Selection.EndOf
Next
Метод EndOf() здесь позволяет перейти в конец текущего выделения. Он нужен здесь для того, чтобы не перезаписывать один и тот же текст 100 раз, поскольку после ввода текст остается выделенным.
Type — еще одно проверочное свойство, которое позволяет предупредить ошибку, если пользователь выделил что-то неположенное. Например, при обычном выделении значение этого свойства будет равно 1, а если выделены несмежные участки текста — 2.
Words — позволяет вернуть коллекцию Words. Эта коллекция состоит из набора объектов Range, каждому из которых соответствует слово в выделенном тексте.
Программирование в Word |
221 |
Методов у объекта Selection гораздо больше, чем свойств.
Calculate() — позволяет посчитать математическое выражение прямо в процессе ввода текста и вернуть его результат (используя только тип дан-
ных Single).
ClearFormatting() — очищает форматирование (и на уровне текста, и на уровне параграфа). Этот метод можно применять не только для объекта
Selection, но и для объектов Find и Replace.
Collapse() — превращает выделение в указатель вставки. Можно использовать два варианта: указатель вставки помещается на начало выделения или на конец выделения. Очень удобно, если вам требуется только вставить новый текст без удаления старого.
Copy(), CopyAsPicture(), Cut(), Paste() и Delete() — эти методы можно использовать для копирования выделенного участка документа, копирования и вставки в виде изображения, вырезания, вставки и удаления соответственно.
EndKey() — этот метод так называется, поскольку он очень похож по функциональности на нажатие клавиши <End>. Он позволяет (в зависимости от переданных параметров) перейти на конец строки, столбца или записи в таблице (по умолчанию на конец строки) и либо выделить до этого места, либо установить на нем указатель вставки. Чтобы перевести курсор вставки на конец текста документа, можно воспользоваться кодом:
Selection.EndKey Unit:=wdStory, Extend:=wdMove
Если же нужно перейти на начало элемента, используется аналогичный метод HomeKey().
EndOf() — по функциональности практически идентичен методу EndKey(). Он позволяет перейти на конец символа, слова, предложения, абзаца, секции, текста документа, таблицы и т. п. Различие между этими методами заключается в том, что EndKey() работает только с текущим элементом текста, а при помощи EndOf() можно, например, найти следующую таблицу в выделенной части документа и перейти на ее конец. Чтобы перейти на начало элемента текста, существует метод StartOf().
Expand() — расширяет выделение на слово, предложение, абзац и т. п., в зависимости от переданного параметра. Метод Extend() позволяет расширить выделение (вместо слова — предложение, вместо предложения — абзац и т. п.). Метод, обратный методу Expand(), — Shrink().
GoTo() — работает практически аналогично такому же методу объекта
Document.
Insert…
GotoNext() — перейти на следующую строку, страницу, закладку и т. п. Аналогично работает метод GotoPrevious() (переход на предыдущий элемент).
Назначение многочисленных методов с префиксом очевидно. Чаще всего используются методы InsertBefore() (вставить перед выделением) и InsertAfter() (вставить после выделения).
Методы с префиксом Move… также встречаются едва ли не в любой программе, связанной с вводом текста в Word. Самые важные и удобные из этих методов:
•MoveLeft(), MoveRight(), MoveUp(), MoveDown(), MoveEnd(), MoveStart() —
эти методы позволяют переместить выделение соответственно влево, вправо, вверх, вниз, к концу существующего выделения или к его началу. Каждый из этих методов принимает дополнительные параметры, при помощи которых можно определить, на сколько символов будет перемещаться указатель, будет ли двигаться выделение, распространяясь на новую область, и т. п.;
•MoveStartUntil(), MoveStartWhile(), MoveEndUntil(), MoveStartWhile() —
отличаются тем, что курсор вставки перемещается не на определенное количество символов, а пока не будет найдено (или пока встречается) определенная последовательность символов. Также очень удобно использовать эти методы для установки курсора в нужное место в документе для ввода текста;
•Move() — более гибкий метод. Он позволяет отсчитывать не только оп-
ределенное количество символов, но и слов, предложений, абзацев, разделов, столбцов и строк в таблице и т. п. Позволяет обойтись минимальным количеством изменений в коде, если изменился исходный шаблон для ввода данных.
Next() — позволяет перейти вперед на определенное количество символов, слов, предложений, абзацев, разделов, столбцов и строк в таблице и т. п. Переход назад осуществляет метод Previous().
NextField() — позволяет перейти на следующее поле в форме или проверить, не кончились ли поля (в этом случае метод вместо объекта Field возвратит Nothing). Есть также метод PreviousField().
SelectColumn(), SelectRow(), SelectCell() — очень удобные методы для выполнения различных операций в таблице Word.
SelectCurrentAlignment(), SelectCurrentFont(), SelectCurrentIndent(),
SelectCurrentColor() и т. п. — выделяют текст до изменения выравнивания, шрифта, отступа, цвета и т. п. Также очень удобно использовать эти
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #