Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Word VBA

Автор: oshizelly
Дата сообщения: 04.08.2012 12:13
grbdv 02:11 04-08-2012
Цитата:
Вот, в лоб:

Спасибо! Но, не понял, прошу прощения, почему код зачеркнут? В том смысле, что лобовое решение некорректно?


Цитата:
Вот тебе еще и третья кнопка - чтобы все взад вернуть.

Взад - это куда? Как было до первого применения макроса?


Цитата:
Считать в переменную текущее значение параметра, увеличить/уменьшить значение переменной на шаг равный или больший минимального, присвоить параметру новое значение переменной. Это если по-уму

А как будет "по уму" для рассматриваемого примера?

З.Ы.

Цитата:
Ну-у, тебя не дождешься Вот, в лоб:

Так спать-то тоже изредка надо
Автор: grbdv
Дата сообщения: 04.08.2012 12:34
oshizelly
Зачеркнут, т.к. ниже - актуальная модифицированная версия. Ты хоть сообщение прочти внимательно, код сравни для интересу... Вот же пичалька :(
Цитата:
Добавлено:
Вот тебе еще и третья кнопка...


Взад - это к дефолтному значению 0 одним нажатием, а не цепочкой обратных действий. Ты ведь глазом можешь и не различить и умом не помнить - сколько раз и где ты нажал +/-.

По-уму - потом. Это некритично. С этим вначале разберись :)

Ты хоть запускал? Или обратно спать улегся? ;)

Добавлено:
Значит спать...

Вот, окончательный код самостоятельного модуля по-уму. С предыдущим несовместим, заменить полностью. [more]

Код:
Option Explicit

Private Const TRPos% = 1
Private Const TRNeg% = -1
Private Const TRZer% = 0

Private nSpcStp!, nSpcPre!, nSpcNew!

Public Sub sb_Spacing_UP()
Call sb_Spacing(TRPos)
End Sub

Public Sub sb_Spacing_DN()
Call sb_Spacing(TRNeg)
End Sub

Public Sub sb_Spacing_ZR()
Call sb_Spacing(TRZer)
End Sub

Private Sub sb_Spacing(pUpDn%)
nSpcStp = 0.1
With Selection.Font
nSpcPre = .Spacing
nSpcNew = (nSpcPre * pUpDn + nSpcStp) * pUpDn
.Spacing = nSpcNew
End With
End Sub
Автор: Alexey87
Дата сообщения: 07.08.2012 17:34
Уважаемые форумчане, все еще нахожусь в поиске решения вопроса.
Надеюсь на помощь и отзывчивость.
Автор: grbdv
Дата сообщения: 07.08.2012 18:59
Alexey87

Цитата:
Подскажите пожалуйста как должен выглядеть код макроса, который сможет реализовать выбор значений из полей со списком (элементы ActiveX), находящихся в таблице (таблицу задействовал как автотекст)

Перебрать все элементы комбобокса можно следующим кодом:

Код:
Private Sub sb_CBEnum()
Dim i%, iLstCnt%
With ComboBox1
iLstCnt = .ListCount - 1
For i = 0 To iLstCnt
Debug.Print .List(i, 0)
Next
End With
End Sub
Автор: Alexey87
Дата сообщения: 13.08.2012 22:19
grbdv, что-то не получаеться
может быть друг друга не поняли (исходный файл)
автотекст - табл
Автор: grbdv
Дата сообщения: 13.08.2012 22:44
Alexey87
Что не получается? У меня все получается.

- Создай новый документ
- Вставь в него комбобокс
- В проект вставь следующий код:

Код:
Private Sub Document_Open()
With ComboBox1
.AddItem "информатика"
.AddItem "автомобили"
End With
Call sb_CBEnum
End Sub
Private Sub sb_CBEnum()
Dim i%, iLstCnt%
With ComboBox1
iLstCnt = .ListCount - 1
For i = 0 To iLstCnt
MsgBox .List(i, 0)
Debug.Print .List(i, 0)
Next
End With
End Sub
Автор: Alexey87
Дата сообщения: 15.08.2012 21:15
grbdv

Цитата:
Про остальную лирику (автотекст и пр.) надо отдельно говорить.

автотекст собственно меня и интересует...
когда вставляю автотект "табл" ничего не выбирается в комбобоксе
Автор: grbdv
Дата сообщения: 15.08.2012 21:29
Alexey87
Давай идти последовательно.

1. Ты код из предыдущего поста запускал по инструкции? Работает он или нет? Ты понял, как в простейшем случае обращаться с комбобоксом? Доложись, плз.

2. Пример, который ты выложил - шаблон. Там только код и никаких таблиц, ни автотекста, ни просто текста. Выложи простой файл с кодом - doc, а не dot.

Надо добиться, чтобы хоть локальный, в отдельно взятом документе вариант заработал, а потом уже проецировать его на шаблон...
Автор: Alexey87
Дата сообщения: 15.08.2012 23:10
grbdv

Цитата:
Доложись, плз.

работает

Цитата:
2. Пример, который ты выложил - шаблон. Там только код и никаких таблиц, ни автотекста, ни просто текста.

Чтобы вставить таблицу нужно выбрать меню Автотекст, а в нем элемент "табл"
Автор: grbdv
Дата сообщения: 15.08.2012 23:43
Alexey87
- Выложи простой файл с кодом - doc, а не dot.
- Чтобы вставить таблицу нужно выбрать меню Автотекст, а в нем элемент "табл"


Ну-ну... поумничать решил? Спасибо, что просветил :) А то я не увидел...

Ты не понял разве, что мне нужно от тебя, чтобы продолжить консультацию? Щаз... все брошу и буду за тебя контролы на лист набрасывать и автотексты вставлять.
Автор: Alexey87
Дата сообщения: 16.08.2012 07:13
grbdv

Цитата:
Выложи простой файл с кодом - doc

Doc1.doc
Автор: grbdv
Дата сообщения: 16.08.2012 13:58
Вот я писал:

Цитата:
Давай идти последовательно ... Выложи простой файл с кодом - doc, а не dot.
Надо добиться, чтобы хоть локальный, в отдельно взятом документе вариант заработал, а потом уже проецировать его на шаблон...


Попробую объяснить по-другому:
Сейчас у тебя и код, и элемент автотекста хранится в шаблонах Normal и Doc1.dot (первый твой пример). Поэтому, во втором твоем примере ничего запрошенного мной нет, кроме таблицы, нарисованной автотекстом. Этот док имеет лишь ссылки на Normal и Doc1.dot (есно - твои).

Сделай так
- Создай новый документ
- Вставь в него ComboBox1
- Вставь в него ComboBox2
- В его проект вставь код из Doc1.dot

Код:
Private Sub Document_Open()
ComboBox1.AddItem "информатика"
ComboBox1.AddItem "автомобили"
End Sub

Private Sub ComboBox1_Change()
Select Case ComboBox1
Case "информатика"
ComboBox2.AddItem "07"
ComboBox2.AddItem "08"
Case "автомобили"
ComboBox2.AddItem "06"
End Select
End Sub
Автор: Alexey87
Дата сообщения: 16.08.2012 17:14

Цитата:
- Выложи полученный файл

ComboBox.doc

так-то все работает, но [more=функционал]выбор значений из полей со списком (элементы ActiveX), находящихся в таблице[/more] не срабатывает при вставке автотекста (таблица с двумя комбобоксами)
Автор: grbdv
Дата сообщения: 16.08.2012 17:32
Alexey87
Т.е. ты пытаешься таблицу с наброшенными комбобоксами сохранить как автотекст...Но код-то не сохранится... Автотекст созраняется в шаблоне Normal. Когда ты этот автотекст вставляешь в очередной документ, коду-то взяться неоткуда.

Щаз не могу проэкспериментировать (чуть позже), чисто умозрительно:

В VBA (Alt+F11) находишь проект Normal, вставляешь в него модуль, в него загоняешь свой код. Процедуры Sub переделываешь в Public Sub. Компилируешь. Сохраняешь. Должно заработать. Рекомендую назвать комбики по-оригинальней, а не по умолчанию во избежание конфликтов в будущем.

Проверь, чтобы код этот остался только в Normal - больше нигде.


Добавлено:
Alexey87
Отставить. Не получится. Чуть позже.

Добавлено:
Alexey87
Ты пока расскажи, чего хочешь добиться, А именно - почему именно автотекст? Почему не шаблон с заготовленной таблицей с комбиками?

И даже через шаблон все равно не будет работать - созданный на его основе документ необходимо будет сохранить и переоткрыть, чтобы заработал код заполнения первого комбика.
Автор: Alexey87
Дата сообщения: 16.08.2012 18:15
0

Автор: grbdv
Дата сообщения: 16.08.2012 22:20
Alexey87
Цитата:
grbdv, так и не работает ... тогда будет время - посмотрите, пожалуйста :-)

Я же отбил выше...
Ты не ответил на мои вопросы.

Цитата:
Ты пока расскажи, чего хочешь добиться, А именно - почему именно автотекст? Почему не шаблон с заготовленной таблицей с комбиками?

Времени было достаточно.

Автотекст не канает. Я сделал мимо автотекста. На базе шаблона создаешь документ, сохраняешь, открываешь - все начинает работать. Но - это мурня полнейшая. По-любому надо концепцию менять.
Автор: oshizelly
Дата сообщения: 19.08.2012 00:36
grbdv 12:34 04-08-2012
Цитата:
Вот, окончательный код самостоятельного модуля по-уму. С предыдущим несовместим, заменить полностью. Подробнее... [?]

Спасибо, всё работает!
Как, впрочем, и предыдущий "упрощённый" вариант этого макроса.
Автор: grbdv
Дата сообщения: 19.08.2012 00:39
oshizelly
Вот и слава Богу! А то я ужЕ переживать начал :)
Автор: AKBA
Дата сообщения: 09.09.2012 11:15
Здравствуйте!

Мне требуется решить вот такую проблему:
Имеется документ MS Word, который состоит из двух страниц. На первой странице документа в четырех местах имеется шифр вида "x" и этот шифр необходимо менять в арифметической последовательности "x+1", а остальной текст оставлять без изменений и при этом распечатывать каждый раз при изменении значения в автоматическом режиме, используя двустороннюю печать.

Используя возможности VB я добился следующего:
1 - при открытии документа у меня появляется форма, в которую я ввожу начальное значение шифра вида "x", потом ввожу общее число необходимых мне подстановок "y" (то есть например, при вводе числа y=50, будет выведено на печать 50 документов, с изменёнными значениями начиная с "x" и заканчивая "x+49" - это пока не реализовано)
2 - кнопка "подстановка" меняет шифр вида "x" на введённое значение в создаваемом документе в необходимых мне четырёх местах (это я сделал при помощи закладок)
3 - кнопка "отмена" закрывает форму, потом документ и затем закрывает Word

Мне осталось сделать самое главное - кнопка "подстановка" должна называться "печать"и при этом документ автоматически должен распечатываться на одном листе с двух сторон в необходимом количестве экземпляров, учитывая значения "x" и "y"

Помогите пожалуйста.
Автор: ol7ca
Дата сообщения: 25.09.2012 04:58
Здравствуйте!
Подскажите кто может)
Надо выделенный текст в ворде скопировать вниз документа и там создать из этого текста список. Как найтивыделенный текст и сделать копи - я разобрался а как вставить это вниз и сделать список - тут затык.

Спасибо.
Автор: zippun
Дата сообщения: 25.09.2012 08:37
ol7ca
В чем проблема? Непонятно.
Запиши все действия в макрос и редактируй его. Что не получается-то?
Автор: ol7ca
Дата сообщения: 27.09.2012 04:35
zippun
Спасибо, но ваш совет не работает. Попробуйте это сделать и сами убедитесь.
Автор: zippun
Дата сообщения: 27.09.2012 07:12
ol7ca
Я попросил объяснить суть проблемы.
Макрос не пишется? Редактор кода не вызывается, код непонятен или работает не так, как задумано?
Где не работает мой совет?

Добавлено:
Оторвал задницу от стула, проверил. Заняло 10 минут. УМВР

Код: Sub sb_ol7ca
With Selection
.Range.ListFormat.ApplyListTemplate _
ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
ContinuePreviousList:=False, _
ApplyTo:=wdListApplyToWholeList, _
DefaultListBehavior:=wdWord10ListBehavior
.Cut
.EndKey (wdStory)
.PasteAndFormat (wdPasteDefault)
End With
End Sub
Автор: Gena1971
Дата сообщения: 27.09.2012 11:50
zippun
Что то мне подсказывает, что под словом "выделенный" ol7ca подразумевал текст жирный или другим цветом. Наверное из-за этого
Цитата:
Как найтивыделенный текст

Просто в VBA искать выделенное как то глупо звучит
Автор: zippun
Дата сообщения: 27.09.2012 12:24
Gena1971
Вообще-то, под "жирный или другим цветом" понимается отформатированный
Почему глупо? Можно и форматированное хоть жирным, хоть курсивом искать хоть в VBA, хоть в интерфейсе. Но эта задача у него решена - "найтивыделенный текст и сделать копи - я разобрался ". Осталось найденное ВЫДЕЛИТЬ и запустить мой код.


Автор: Gena1971
Дата сообщения: 27.09.2012 13:29
zippun
Я имел ввиду правильное понимание "выделенный". Его искать не надо. Это Selection. И оно просто копируется.
А форматированный - это да. Его надо найти прежде чем что то с ним делать. Тут цикл нужен по всем "выделенным/форматированным". Мне так показалось, что с этим проблема.
Вообще если б посмотреть что уже сделано, то и легко сказать чего надо доделать или исправить.
Автор: ol7ca
Дата сообщения: 27.09.2012 17:49
zippun

да, я имел ввиду текст форматирован как bold.

Спасибо за скрипт - такой не получится если просто записать макро.

Можно ли чуть исправить?
- не вырезать а копировать.
- и еще одно - в конце добавить слово список и после него уже вставить сам список.

Спасибо!

full version:
Sub SubtractBoldTxt()

Dim s As Range
Dim doc As Document

Set doc = Word.Documents("Doc2.docm")

For Each s In doc.Sentences
If s.Words(1).Bold = True Then
x = s.Words(1).Bold
s.Font.ColorIndex = wdRed
s.Select
With Selection
.Range.ListFormat.ApplyListTemplate _
ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
ContinuePreviousList:=False, _
ApplyTo:=wdListApplyToWholeList, _
DefaultListBehavior:=wdWord10ListBehavior
.Cut
.EndKey (wdStory)
.PasteAndFormat (wdPasteDefault)
End With

End If
Next
End Sub
Автор: zippun
Дата сообщения: 27.09.2012 18:47
ol7ca
Цитата:
Спасибо за скрипт - такой не получится если просто записать макро.

Не за что. Я ведь писал:
Цитата:
Запиши все действия в макрос и редактируй его



Цитата:
- не вырезать а копировать.
Замени .Cut на .Copy

Цитата:
в конце добавить слово список и после него уже вставить сам список

Вот модифициорванный код:

Код: Sub sb_ol7ca()
With Selection
.Range.ListFormat.ApplyListTemplate _
ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
ContinuePreviousList:=False, _
ApplyTo:=wdListApplyToWholeList, _
DefaultListBehavior:=wdWord10ListBehavior
.Copy
.EndKey (wdStory)
.Text = "Список:" & vbCr
.EndKey (wdStory)
.PasteAndFormat (wdPasteDefault)
End With
End Sub
Автор: ol7ca
Дата сообщения: 27.09.2012 20:49
zippun

Спасибо, но работает не корректно. Попробуйте в связке с моим кодом сделать тест. Возможно, в моем коде проблема.


Цитата:
Замени .Cut на .Copy


я пробовал до того но работает не корректно.
Автор: zippun
Дата сообщения: 27.09.2012 22:10
ol7ca
Добавь переменные:
Dim sHeader$
Dim iLen%

Инициализируй их (сразу после 'Set doc = ...'):
sHdr = "Список:"
iLen = Len(sHdr)

Сразу же после 'For...' добавь строку:
If Left(s.Text, iLen = sHdr Then Exit For

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

Страницы: 1234567891011121314151617181920212223242526

Предыдущая тема: Кластеризация изображений


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.