Тема: Изменение текста WordArt в колонтитулах
Каким образом обратиться к объекту WordArt, для изменения его текста, находящемуся в колонтитулах?
Особенность в том, что объект WordArt вставлен в автофигуру.
С уважением
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Каким образом обратиться к объекту WordArt, для изменения его текста, находящемуся в колонтитулах?
Особенность в том, что объект WordArt вставлен в автофигуру.
С уважением
У меня вот такое получилось с нарисованными самим автофигурой и объектом Wordart в нем:
Selection.HeaderFooter.Shapes(1).Select
Selection.InlineShapes(1).TextEffect.Text = "тут изменененный текст"
Как я понимаю, для вас важно именно это?.
Приведенным кодом осуществляется выбор первой автофигуры (можно вместо цифры ее имя в кавычках) и изменение текста объекта WordArt (TextEffect.Text).
Так как сам еще не умею выбирать автофигуры, могу только такой вариант предложить.
Вполне вероятно, что в последнюю строку тоже нужно будет вносить изменение.. Но с тем, что я нарисовал, это работает!!!!
Вот что еще нашел в инете по этому поводу:
Обычно вы ссылаетесь на элемент управления в документе по его кодовому имени - так же, как если бы этот элемент управления находился на форме. Однако в документах Word существует еще одна возможность доступа к элементам управления - через коллекции InlineShapes и Shapes. Элемент управления, помещенный в текстовый слой, содержится в объекте InlineShape, а элемент управления из слоя рисования - в объекте Shapes.
Чувствую, не получится толком объяснить у меня. Может, Вождь поправит. Просто приведу пример изменения текста WordArt, расположенного в надписи в верхнем колонтитуле первого раздела активного документа:
ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Shapes(1).TextFrame.TextRange.InlineShapes(1).TextEffect.Text="Новый текст"
Конечно, на полноценный код это не тянет. Если известно, только то, что где-то в колонтитуле расположен текст WordArt, который нужно изменить, то нужно перебрать все объекты Shapes в соответствующем колонтитуле, проверить какой из них имеет внутри текст. Если текст есть, то нужно проверять коллекцию InlineShapes на наличие в ней объекта типа WordArt. И только найдя этот объект WordArt, изменять в нём текст.
andrkar, Этот вариант я использовал. Для этого необходимо переводить документ в режим редактирования колонтитулов, а этого хотелось бы избежать. Но все равно спасибо.
viter.alex, да спасибо, код срабатывает. А если усложнить задачу до сгруппированных автофигур?
Для примера прилагаю файл.
Только как пример:
Sub test()
Dim osh As Shape
Dim oShGr As Shape
Dim oInSh As InlineShape
For Each osh In ActiveDocument.Sections.First.Headers(wdHeaderFooterPrimary).Shapes
If osh.GroupItems.Count <> 0 Then
For Each oShGr In osh.GroupItems
If oShGr.TextFrame.HasText Then
For Each oInSh In oShGr.TextFrame.TextRange.InlineShapes
oInSh.TextEffect.Text = "Новый текст"
Next
End If
Next
End If
Next
End Sub
Перебираем все фигуры в колонтитуле. Если есть сгрупированные, то перебираем сгрупированные. Если в сгруппированной фигуре есть текст, то ищем объект WordArt и меняем в нём текст.
Кстати, в справке по свойству TextEffect какая-то путаница со свойством Type для InlineShape:
InlineShape.TextEffect Property
Returns a TextEffectFormat object that contains text-effect formatting properties for the specified inline shape. Read-only.
Syntaxexpression.TextEffect
expression A variable that represents an InlineShape object.
Example
This example sets the font style to bold for shape three on myDocument if the shape is WordArt.
Visual Basic for Applications
Set myDocument = ActiveDocument With myDocument.Shapes(3) If .Type = msoTextEffect Then .TextEffect.FontBold = True End If End With
Обратите внимание, что я выделил красным и для какого объекта приведён код. У InlineShape свойство Type принимает значения из перечисления WdInlineShapeType, а там нет значения msoTextEffect
viter.alex, большое спасибо. Код вполне отвечает конкретному примеру. Что касается справки по VBA, то никогда не читал ее с особой скурпулезностью. Что касается приведенного Вами образца справки, то мне кажется, что в данном случае TextEffect Property ни как не связано с msoTextEffect. Перефразировав этот пример с использованием InlineShape мы можем поставить в условие любое другое выражение, например то же WdInlineShapeType.
Нет, дело не в том. Ведь в примере сначала проверятся, что объект является WordArt и только потом изменяется его текст
Прошу прощения, я говорил про справку VBA, которую вы выложили после кода примера и про пример в этой справке, а там меняется не текст а шрифт. Я думаю, что можно в этом примере спокойно заменить Shapes на InlineShapes и условие проверки выбрать соответствующее.
К стати, при проверке тип объекта WordArt выдает равный 3, что соответствует wdInlineShapePicture
…К стати, при проверке тип объекта WordArt выдает равный 3, что соответствует wdInlineShapePicture
Что не есть верно. Если вставиь картинку, то она тоже будет того же типа, но TextEffect для неё не будет работать
Да, здесь вы правы. Остается только непосредственно в компанию обращаться.
К стати, по ходу подскажите, какие вообще есть функции для проверки положения курсора в конце документа.
К стати, по ходу подскажите, какие вообще есть функции для проверки положения курсора в конце документа.
Не подскажу. Оформите этот вопрос отдельной темой.
Это не из-за вредности, а для облегчения поиска.
Я попытаюсь написать подробнее о работе с графическими объектами, а пока ограничусь фрагментом со страницы
внешняя ссылка
(я перевел вступительную фразу и комментарий в тексте программы)
Helmut Weber <nbhymsjxdgcn[ at ]mailinator.com>:
Я не могу найти другой способ проверить,
является ли встроенная в текст фигура картинкой WordArt,
кроме следующего:
Sub Test48800()
Dim oShpNrm As Shape ' обычная фигура
Dim oShpInl As InlineShape
Dim strTemp As String
For Each oShpNrm In ActiveDocument.Shapes
If oShpNrm.Type = msoTextEffect Then
oShpNrm.Select
MsgBox "WordArt Shape"
End If
Next
For Each oShpInl In ActiveDocument.InlineShapes
If oShpInl.Type = wdInlineShapePicture Then
oShpInl.Select
On Error Resume Next
strTemp = ""
strTemp = oShpInl.TextEffect.Text
If strTemp <> "" Then
MsgBox "WordArt Inlineshape"
End If
End If
Next
End Sub
With shapes it is easy.
--
Greetings from Bavaria, GermanyHelmut Weber, MVP WordVBA
Win XP, Office 2003
"red.sys" & Chr$(64) & "t-online.de"
Спасибо, Марк. Этот способ напрашивался сам собой. Ждём пояснений по поводу графических объектов.
На странице внешняя ссылка я выложил небольшую статью
Обработка графики в Microsoft Word средствами VBA, содержащей предварительные сведения об объектах Shape и InlineShape и набор учебных макросов с подробным описанием, демонстрирующих перебор графических объектов в документе Microsoft Word.
В прилагаемом файле GraphProc.rar сжат документ
GraphProc02.doc (465 408 байт) с текстом этой страницы и VBA-модулями с описанными на ней макросами.
Отредактировано Марк (01.04.2010 22:15:51)
В качестве практического примера обработки графических объектов в Microsoft Word предлагаю шаблон EachShape.
На странице внешняя ссылка можно скачать последнюю версию шаблона.
Запустите макрос EachShape. Он поочередно выделяет все графические объекты в активном документе и выводит информацию о каждом из них.
Шаблон не защищен, его можно бесплатно использовать для любых целей. Единственная просьба — ссылаться на страницу внешняя ссылка и указывать автора шаблона.
Прошу прощения за то, что интерфейс пользователя на английском языке — используется терминология из нелокализованной справки VBA.
Отредактировано Марк (30.03.2010 10:05:05)
Марк, большое спасибо и за помощь и за статью.
На странице внешняя ссылка я дописал статью
Обработка графики в Microsoft Word средствами VBA, включив в нее описание кода программы EachShape
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться