1

Тема: Как управлять состоянием элементов управления?

Уважаемые знатоки, подскажите, пожалуйста, как решить следующую задачу. Надо, чтобы при запуске макроса синхронно менялся РАЗНЫЙ текст в разных, но строго определенных местах.
Т.е. жмем «макрос 1» в нужных местах появляется «текст1», «текст2», «текст3»
потом при необходимости жмем «макрос 2» в тех же нужных местах текст заменяется на «текст4», «текст5», «текст6»
Вижу решение в том, чтобы расположить в нужных местах элементы управления содержимым «Поле со списком» или элементы управления «коллекция стандартных блоков» и дальше управлять их состоянием с помощью макроса. Но как это сделать на практике? И еще одно важное условие, формат документа должен быть не docm, чтобы программа пакетной печати смогла его обработать (используется Print Conductor).  Есть ли решение у данной задачи?

2

Re: Как управлять состоянием элементов управления?

andy116 пишет:

Уважаемые знатоки, подскажите, пожалуйста, как решить следующую задачу. Надо, чтобы при запуске макроса синхронно менялся РАЗНЫЙ текст в разных, но строго определенных местах.
Т.е. жмем «макрос 1» в нужных местах появляется «текст1», «текст2», «текст3»
потом при необходимости жмем «макрос 2» в тех же нужных местах текст заменяется на «текст4», «текст5», «текст6»
Вижу решение в том, чтобы расположить в нужных местах элементы управления содержимым «Поле со списком» или элементы управления «коллекция стандартных блоков» и дальше управлять их состоянием с помощью макроса. Но как это сделать на практике? И еще одно важное условие, формат документа должен быть не docm, чтобы программа пакетной печати смогла его обработать (используется Print Conductor).  Есть ли решение у данной задачи?

Вы можете использовать стандартный формат .docx, а макросы разместить в файле Normal.dotm или в отдельном файле аддона с расширением имени

3

Re: Как управлять состоянием элементов управления?

andy116 пишет:

Уважаемые знатоки, подскажите, пожалуйста, как решить следующую задачу. Надо, чтобы при запуске макроса синхронно менялся РАЗНЫЙ текст в разных, но строго определенных местах.
Т.е. жмем «макрос 1» в нужных местах появляется «текст1», «текст2», «текст3»
потом при необходимости жмем «макрос 2» в тех же нужных местах текст заменяется на «текст4», «текст5», «текст6»
Вижу решение в том, чтобы расположить в нужных местах элементы управления содержимым «Поле со списком» или элементы управления «коллекция стандартных блоков» и дальше управлять их состоянием с помощью макроса. Но как это сделать на практике? И еще одно важное условие, формат документа должен быть не docm, чтобы программа пакетной печати смогла его обработать (используется Print Conductor).  Есть ли решение у данной задачи?

andy116 пишет:

Уважаемые знатоки, подскажите, пожалуйста, как решить следующую задачу. Надо, чтобы при запуске макроса синхронно менялся РАЗНЫЙ текст в разных, но строго определенных местах.
Т.е. жмем «макрос 1» в нужных местах появляется «текст1», «текст2», «текст3»
потом при необходимости жмем «макрос 2» в тех же нужных местах текст заменяется на «текст4», «текст5», «текст6»
Вижу решение в том, чтобы расположить в нужных местах элементы управления содержимым «Поле со списком» или элементы управления «коллекция стандартных блоков» и дальше управлять их состоянием с помощью макроса. Но как это сделать на практике? И еще одно важное условие, формат документа должен быть не docm, чтобы программа пакетной печати смогла его обработать (используется Print Conductor).  Есть ли решение у данной задачи?

Вы можете использовать стандартный формат .docx, а макросы разместить в файле Normal.dotm или в отдельном файле аддона с расширением имени ".dotm". Что касается элементов управления, то вы можете использовать не ЭУС (т.е., Content Controls), а обычные поля (Fields) или закладки (Bookmarks), управляя их содержимым с помощью макросов.
Напр., для примера с закладками поступите так: создайте по месту изменяемых контекстов закладки с именами "Text1", "Text2", "Text3".  В приведенном ниже примере в зависимости от  вызываемого на исполнение   макроса (TextVar1 или TextVar2) соответственно изменяется содержимое закладок. Недостаток предложенной методики тот, что устанавливаемые макросами значения прописаны прямо в коде. Вместе с тем, при желании можно расширить VBA-код, "доставая" нужные значения для текстов напр., из внешнего файла, либо из пользовательских свойств документа.

Sub TextVar1()
SetTextToBookmark "Text1", "111111"
SetTextToBookmark "Text2", "22222222222"
SetTextToBookmark "Text3", "33"
End Sub
Sub TextVar2()
SetTextToBookmark "Text1", "444"
SetTextToBookmark "Text2", "5555"
SetTextToBookmark "Text3", "666666666"
End Sub

Sub SetTextToBookmark(bmkname As String, bmktext As String)
ActiveDocument.Bookmarks(bmkname).Select
Selection.text = bmktext
ActiveDocument.Bookmarks.add bmkname, Selection.Range
End Sub

4

Re: Как управлять состоянием элементов управления?

Спасибо yshindin, добрый человек, за идею с закладками. Это то что надо!

SetTextToBookmark "Text1", "111111" 

у меня почему то не работает.

Получилось добавлять текст в закладку следующим кодом:

Sub TextVar1()
Dim oRng As Word.Range
  Set oRng = ActiveDocument.Bookmarks("закладка").Range
  oRng.Text = ActiveDocument.Bookmarks("закладка").Range.Text & "текст закладки"
  ActiveDocument.Bookmarks.Add " закладка ", oRng
lbl_Exit:
  Exit Sub
End Sub

Одна проблема, текст добавляется, а старый текст, где был, там и остается. Как бы прописать удаление текста в закладке перед добавлением нового?

5

Re: Как управлять состоянием элементов управления?

andy116 пишет:
SetTextToBookmark "Text1", "111111" 

у меня почему то не работает.

Попробуйте еще так:

Sub TextVar1()
Application.run MacroName:="SetTextToBookmark", varg1:="Text1", varg2:="111111"
Application.run MacroName:="SetTextToBookmark", varg1:="Text2", varg2:="22222222222"
Application.run MacroName:="SetTextToBookmark", varg1:="Text3", varg2:="33"
End Sub

Проверьте также, выставлен ли у вас в Word параметр правки "Заменять выделенный фрагмент".  И сообщите, пжл, что именно у вас не работает при применении моего варианта макроса.

6

Re: Как управлять состоянием элементов управления?

При выполнении кода

Sub TextVar1()
Application.run MacroName:="SetTextToBookmark", varg1:="Text1", varg2:="111111"
Application.run MacroName:="SetTextToBookmark", varg1:="Text2", varg2:="22222222222"
Application.run MacroName:="SetTextToBookmark", varg1:="Text3", varg2:="33"
End Sub

ошибка:
Run time error 308 “object doesn’t support this property or method”

при выполнении кода

Sub TextVar1()
SetTextToBookmark "Text1", "111111"
SetTextToBookmark "Text2", "22222222222"
SetTextToBookmark "Text3", "33"
End Sub

Ошибка: compile error: Sub or Function not defined

Замена выделенного фрагмента выставлена.
   
В общем то, найден рабочий метод добавления текста в закладку и это решает мою задачу.

Sub TextVar1()
Dim oRng As Word.Range
  Set oRng = ActiveDocument.Bookmarks("закладка").Range
  oRng.Text = ActiveDocument.Bookmarks("закладка").Range.Text & "текст закладки"
  ActiveDocument.Bookmarks.Add " закладка ", oRng
lbl_Exit:
  Exit Sub
End Sub

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

7

Re: Как управлять состоянием элементов управления?

Решение найдено. Код добавляющий текст в закладку с заменой исходного текста:

Sub TextVar1()
Dim oRng As Word.Range
  Set oRng = ActiveDocument.Bookmarks("закладка").Range
  Selection.GoTo What:=wdGoToBookmark, Name:="закладка"
  Selection.Cut
  ActiveDocument.Bookmarks.Add "закладка", oRng
  oRng.Text = ActiveDocument.Bookmarks("закладка").Range.Text & "текст закладки"
  ActiveDocument.Bookmarks.Add " закладка ", oRng
lbl_Exit:
  Exit Sub
End Sub