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

» Word VBA

Автор: popkov
Дата сообщения: 09.05.2007 19:29
AndVGri
Спасибо!

Ещё вопрос: как присвоить заначение wdUndefined элементу стиля, если этот параметр уже имеет значение.
Код
With ActiveDocument.Styles("Знак концевой сноски").Font
.Superscript = wdUndefined
.Superscript = wdUndefined
End With
Почему-то не изменяет ничего (так и остаётся Superscript, идущий по умолчанию).

И можно ли как-то сбросить разницу между стилями? Например, приравнять "Знак концевой сноски" основному шрифту абзаца?
Автор: AndVGri
Дата сообщения: 10.05.2007 00:57
popkov

Цитата:
Почему-то не изменяет ничего

Undefined по словарю - неопределённый. Установите в False, чтоб изменения были видны.
Учитывая последующий вопрос, это и не к чему

Цитата:
приравнять "Знак концевой сноски" основному шрифту абзаца

ActiveDocument.Styles("Знак концевой сноски").Font = ActiveDocument.Styles("Обычный").Font
Автор: popkov
Дата сообщения: 10.05.2007 04:17
AndVGri

Цитата:
ActiveDocument.Styles("Знак концевой сноски").Font = ActiveDocument.Styles("Обычный").Font

Дело в том, что после этого в свойствах стиля всё равно написано:

Цитата:
Основной шрифт абзаца + не надстрочнуе/подстрочные

То есть определённая разница сохранилась.
Хотя это не так важно в конкретном случае, но для общности хотелось бы понять, как можно вообще сбросить эту разницу, чтобы было просто:
Основной шрифт абзаца +
Такой стиль можно создать искусственно, но вот способа избавиться от дополнительных параметров форматирования я не нашел...

Да, ещё один вопрос: как выяснить, какой стиль автоматически применяется к знакам и текстам сносок по умолчанию и поставить другой?
Автор: AndVGri
Дата сообщения: 10.05.2007 07:52
popkov
"Знак концевой сноски" и "Текст концевой сноски"
"Знак сноски" и "Текст сноски"

Цитата:
но вот способа избавиться от дополнительных параметров форматирования я не нашел...

А это так принципиально важно? Нарушается структура документа?
Автор: popkov
Дата сообщения: 10.05.2007 08:29

Цитата:
"Знак концевой сноски" и "Текст концевой сноски"
"Знак сноски" и "Текст сноски"

Я знаю, но в английской винде они будут называться иначе...
Автор: AndVGri
Дата сообщения: 10.05.2007 09:22
popkov

Цитата:
Я знаю, но в английской винде они будут называться иначе...

Увы, Word позволяет (покрайней мере в Office 2003) узнать только национальное название стиля
ActiveDocument.Styles(10).NameLocal
Просто свойства Name - нет. Так что, ищи название выделив и посмотрев, что пишет вкладка Стили и форматирование (или Styles and Formats, если правильно перевёл на English)
Автор: popkov
Дата сообщения: 10.05.2007 14:52
AndVGri

Цитата:
ActiveDocument.Styles(10).NameLocal

Выяснил последовательным перебором, что "Знак сноски" - это стиль номер 26.
Теперь самый главный вопрос: этот номер не зависит от локализации и постоянен или меняется?
Попробовал удалить этот стиль из Normal - удалился, но запрос
MsgBox (ActiveDocument.Styles(26).NameLocal)
по-прежнему возвращает "Знак сноски"
Кроме того,
Selection.Range.Style = "Знак сноски"
действительно применило этот стиль к заданному выделению - он после этого появился в списке стилей, причём такой же, как и был изначально.
Аналогичного эффекта добился
Selection.Range.Style = ActiveDocument.Styles(26)

Интересно, список стиелй по номерам где-нибудь документирован?

Добавлено:
Похоже, что номер может меняться, но можно также обращаться к стилю по его зарезервированному имени:

Цитата:
Use Styles(index), where index is the style name, a WdBuiltinStyle constant or index number, to return a single Style object. You must exactly match the spelling and spacing of the style name, but not necessarily its capitalization.


Цитата:
You can specify built-in styles across all languages by using the WdBuiltinStyle constants or within a language by using the style name for the language version of Word.

Только, насколько я понимаю, можно лишь догадываться о том, какому стилю соответствует WdBuiltinStyle по названию константы... Документации на эти параметры нигде нет?

Добавлено:
Хм. Надо же, нашёл:
http://msdn2.microsoft.com/en-us/library/microsoft.office.interop.word.wdbuiltinstyle(VS.80).aspx

Автор: popkov
Дата сообщения: 12.05.2007 20:27
AndVGri
А как вызвать диалог SaveAs, предлагающий пользователю сохранить файл под другим именем?
Автор: AndVGri
Дата сообщения: 13.05.2007 02:05
popkov

Код:
Dim pSaveDialog As Office.FileDialog

Set pSaveDialog = Application.FileDialog(msoFileDialogSaveAs)
pSaveDialog.Title = "Сохранение документа"
pSaveDialog.AllowMultiSelect = False

If pSaveDialog.Show Then
ActiveDocument.SaveAs pSaveDialog.SelectedItems(1&)
End If
Автор: popkov
Дата сообщения: 13.05.2007 13:23
AndVGri
Спасибо!
А можно ещё перехватывать нажатие на отмену в этом диалоге и чтобы в нём сразу была открыта та папка, в которой находится текущий документ (если существует). Неплохо ещё подставить имя файла по умолчанию.
Автор: AndVGri
Дата сообщения: 13.05.2007 13:52
popkov

Код:
'...
pSaveDialog.InitialFileName = ActiveDocument.FullName

If pSaveDialog.Show Then
ActiveDocument.SaveAs pSaveDialog.SelectedItems(1&)
Else
'код при нажатии отмена
End If
Автор: popkov
Дата сообщения: 13.05.2007 14:08

Цитата:
Уже лениво нажимать F1 в VBE?

Смотрел по Shift+F2 списки свойств, но не догалался, что pSaveDialog.Show - это результат выбора пользователя.
А pSaveDialog.InitialFileName через несколько минут сам нашёл, но не пришло в голову, что если там поставить в начале ActiveDocument.Path + "\" + "Название", то автоматически будет открыта указанная папка...
Спасибо!

Добавлено:
AndVGri
Вот теперь ещё хочу выводить на экран окно запроса с возможностью выбора нескольких опций (галочками, рядом с которыми описания опций). Соответствующего VbMsgBoxStyle не нашёл. Видимо, делается существенно сложнее?
Автор: AndVGri
Дата сообщения: 13.05.2007 14:25
popkov

Цитата:
ActiveDocument.Path + "\" + "Название"

Не забудь только, что для нового документа Path = "", а если документ в корне диска, то, в твоём случае, будет InitialFileName = "d:\\Название"

Добавлено:
popkov
Делаешь форму с "галочками" и описаниями.
Автор: popkov
Дата сообщения: 13.05.2007 14:42

Цитата:
Не забудь только, что для нового документа Path = "", а если документ в корне диска, то, в твоём случае, будет InitialFileName = "d:\\Название"

Проверил оба варианта - работает!

Цитата:
Делаешь форму с "галочками" и описаниями.

Мне нужно, чтобы она в окне запроса только появлялась, в документе её быть не должно.
Автор: AndVGri
Дата сообщения: 13.05.2007 16:49
И зачем так изгаляться? Можешь попробовать, как вариант.
[more]
Подключаешь Tools/References
Microsoft Forms 2.0 Object Library
Microsoft Visual Basic for Application Extesibility 5.3
В настройках безопасности разрешаешь модификацию VBProject

Добавляешь модуль с названием "QuestionFormModule"
Размещение элементов управления всё на тебе, добавление 1 "галочки" для примера

Код:
Option Explicit
Public Sub ShowQuestionForm()
MyShowForm1.Controls.Add "Forms.CheckBox.1", "myCheck1"
MyShowForm1.Show
End Sub
Автор: popkov
Дата сообщения: 13.05.2007 18:04
Ой, похоже, я неправильно выразился. Я просто не знал, что в VBE можно рисовать формы запросто, поэтому подумал, что ты имел в виду добавить форму в сам текст документа.
Теперь нужную форму я нарисовал в VBE. Пытаюсь разобраться, как её вызвать и получить ответы пользователя: в форме 5 галочек и две кнопки: Выполнить и Отмена.
Ещ интересно, что происхдит при нажатии на крестик (закрытие окна формы).
Автор: AndVGri
Дата сообщения: 13.05.2007 18:37
popkov

Цитата:
Пытаюсь разобраться, как её вызвать

Пишешь
Public Sub MyFormShow()
UserForm1.Show
End Sub
Цепляешь процедуру на кнопку макроса в пользовательской панели Word.

Цитата:
Ещ интересно, что происхдит при нажатии на крестик

Вызываются обработчики события - закрытие формы
UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserForm_Terminate()
Автор: popkov
Дата сообщения: 13.05.2007 19:02

Цитата:
Вызываются обработчики события - закрытие формы
UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserForm_Terminate()

А как перехватить нажатие на крестик (оно должно быть эквивалентом нажатия кнопки Cancel)?

Сейчас разбираюсь, как вообще заставить форму работать: получить значения 7 флажков, при нажатии на кнопки Выполнить (RunMacro) и Отмена (Cansel) форма должна закрываться, а выбор перехватываться.
Автор: AndVGri
Дата сообщения: 13.05.2007 19:09
popkov

Цитата:
А как перехватить нажатие на крестик

В этих обработчиках (обычные процедуры, только Private) в коде формы и перехватываешь, если установишь в 1 Cancel в True, то форма не закроется.
Для кнопки Cancel в обработчике щелчёк на кнопке
CancelButton_Click
вызываешь код закрытия формы
Unload Me
Автор: popkov
Дата сообщения: 13.05.2007 19:52
AndVGri
А целевой макрос (т.е. мою подпрограмму) нужно вызывать из соответствующего обработчика?
Почему-то в нём не работает
Private Sub RunMacro_Click()
Call ConvertCitation
Unload Me
End Sub

ConvertCitation - это мой модуль. Потом надо будет передавать ему результат выбора пользователя, видимо.

Добавлено:
Что-то вообще непонятно, как вызвать процедуру из
Private Sub RunMacro_Click()
End Sub
Вызов процедуры игнорируется...
Автор: popkov
Дата сообщения: 14.05.2007 00:44
AndVGri

Цитата:
Цепляешь процедуру на кнопку макроса в пользовательской панели Word.

А как это сделать? В Настройка::Макросы не отображаются Forms...

Сейчас я весь код запихнул в форму, оформив процедуру как сабрутину. Так даже удобнее, но как всё это привязать к кнопке панели инструментов??
Автор: AndVGri
Дата сообщения: 14.05.2007 07:54
popkov
Так, давай по порядку
1) В редакторе кода формы на областью ввода есть 2 раскрывающихся списка. Левый список объектов формы, включая саму форму. Правый список событий для выбранного объекта. Если тебе нужен обработчик события объекта, выбираешь в них объект и соответствующе событие. VBA автоматически формирует тебе процедуру обработчик события, остаётся только вписать код.
2) Если тебе нужно вызвать процедуру из обработчика события, то либо пишешь её в форме и объявляешь её скрытой Private, если хочешь скрыть её видимость вне пределов кода формы. Если же тебе нужно вызвать стороннюю процедуру (в коде какого-нибудь модуля) до объявляй её с атрибутом Public - видимый везде.
3) Добавление кода вызова формы
В модуле пишешь процедуру
Public Sub MyFormShow() 'или назови её как тебе нравиться
UserForm1.Show 'форма может у тебя называться по другому (смотри инспектор объектов проекта)
End Sub
Далее переключаешься в Word и в меню Вид/Панели инструментов/Настройка
там на вкладке панели, если хочешь создаёшь свою панель инструментов. На вкладке команды выбираешь выбираешь в списке категорий категорию макросы, а в ней будут отображены все Public процедуры без параметров, включая и MyFormShow перетягиваешь её на панель инструментов, настраиваешь подсказку и внешний вид. Жмёшь Ок. И читай, будь добр, справку. Вопросы то...
Автор: popkov
Дата сообщения: 14.05.2007 11:43
AndVGri
Разместить процедуру вызова формы
Public Sub MyFormShow()
UserForm1.Show
End Sub
в коде формы никак нельзя? Обязательно в другом модуле?
Автор: popkov
Дата сообщения: 16.05.2007 23:06
AndVGri
А как узнать имя закладки, на которуя ссылается поле wdFieldGoToButton? Цель - превратить это поле в гиперссылку на эту закладку.
Автор: Ramon106
Дата сообщения: 17.05.2007 18:13
Доброго времени суток.
Можете ли кто-нибудь привести пример работы со стилями форматирования (MS Word) на vba.
Хотелось бы узнать какие стили есть в текущем документе и вывести их в массив или объект наподобие listbox.
Интересно и то, как по заданному стилю на vba реализовать выделение текста с таким стилем.
Буду рад любым примерам работы с ними.
Заранее спасибо.
Автор: AndVGri
Дата сообщения: 17.05.2007 19:12
Ramon106

Цитата:
Хотелось бы узнать какие стили есть в текущем документе и вывести их


Код:
Dim pStyle As Style
For Each pStyle In ActiveDocument.Styles
Debug.Print pStyle.NameLocal
Next pStyle
Автор: popkov
Дата сообщения: 17.05.2007 21:14
2All Есть ли универсальный способ получить диапазон (Range), внутри которого находится значение данного поля (Filed). Нужно, чтобы после разрыва связи с полем (fld.Unlink) в соответствующей переменной типа Range сохранилось отображаемое значение поля.

Для разных типов полей работают, к сожалению, только разные мотоды.

Например, для полей типа
Цитата:
{ GOTOBUTTON ZEqnNum182504 \* MERGEFORMAT { REF ZEqnNum182504 \! \* MERGEFORMAT }}

Работает метод fld.Code (где fld - текущее поле wdFieldGoToButton), а также метод fld.Next.Result.
Однако для полей типа
Цитата:
{ REF _Ref166949450 \h }

этот метод не работает, но работает метод fld.Result...

Есть ли универсальный метод, который для любого типа полей позволяет получить Range, в котором после Unlink окажется значение поля?
Автор: goldzub
Дата сообщения: 20.05.2007 16:32
Как написать надстройку?
С первого раза в инете ничего не нашел. Может кто знает хорошие ссылки посвященные этому вопросу?
Автор: popkov
Дата сообщения: 20.05.2007 17:26
goldzub

Цитата:
хорошие ссылки посвященные этому вопросу

Тоже долго искал. Нашёл только хороший курс ИНТУИТ: http://www.intuit.ru/department/office/vba2000/
Если найдёшь ещё что-либо стоящее - не поленись, запости сюда, а то и правда трудно инфу искать...
Автор: AndVGri
Дата сообщения: 20.05.2007 18:29
goldzub
Так такового понятия надстройка для Word нет (на VBA разумеется). Эту функцию выполняют шаблоны dot. Создаёшь public процедуры действий, цепляешь их на кнопки пользовательских панелей инструментов, вкладываем панели в шаблон. Аналогично при создании меню.
Реально надстройки делаются в Visual Studio (может и ещё в чём то, не знаю). Есть расширение для Visual Studio Tools For Microsoft Office System, которое содержит макеты проектов и шаблоны для создания надстроек. Хотя программировать в нём несколько сложнее (хотя кому как покажется)

Страницы: 1234567891011121314151617181920212223242526

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


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