Содержание
- 1 Adding Controls to a UserForm at Design Time
- 2 Cancels a cancelable event (an event that has a Cancel parameter).
- 3 Change caption
- 4 Close a form
- 5 Creating UserForms Programmatically
- 6 Display form in Modal mode
- 7 Format fonts
- 8 Form count
- 9 Loading a Form into Memory Prior to Displaying It
- 10 Open a form, format the fonts and close it
- 11 Output form to html file
- 12 To remove the Userform from the computer»s memory, you must use the Unload statement; otherwise, the Userform is only hidden.
- 13 Using the Show Method to Display a Form
Adding Controls to a UserForm at Design Time
<source lang="vb">
Sub RunTimeButton()
Dim Butn As CommandButton Set Butn = UserForm1.Controls.Add("Forms.rumandButton.1") With Butn .Caption = "Added at runtime" .Width = 100 .Top = 10 End With UserForm1.Show
End Sub
</source>
Cancels a cancelable event (an event that has a Cancel parameter).
<source lang="vb">
Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("Are you sure you want to save changes to this record?", _ vbYesNo Or vbInformation, "Confirm Upate") = vbNo Then DoCmd.CancelEvent End If
End Sub
</source>
Change caption
<source lang="vb">
Sub ChangeCaption(frmAny As Form)
If IsNull(frmAny.Caption) Then frmAny.Caption = "Form For - " & CurrentUser Else frmAny.Caption = frmAny.Caption & " - " & CurrentUser End If
End Sub
</source>
Close a form
<source lang="vb">
Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub
</source>
Creating UserForms Programmatically
<source lang="vb">
Sub MakeForm()
Dim TempForm As Object Dim NewButton As Msforms.rumandButton Dim Line As Integer Application.VBE.MainWindow.Visible = False Set TempForm = ThisWorkbook.VBProject. _ VBComponents.Add(3) "vbext_ct_MSForm With TempForm .Properties("Caption") = "Form" .Properties("Width") = 200 .Properties("Height") = 100 End With Set NewButton = TempForm.Designer.Controls _ .Add("forms.rumandButton.1") With NewButton .Caption = "Click Me" .Left = 60 .Top = 40 End With With TempForm.CodeModule Line = .CountOfLines .InsertLines Line + 1, "Sub CommandButton1_Click()" .InsertLines Line + 2, " MsgBox ""Hello!""" .InsertLines Line + 3, " Unload Me" .InsertLines Line + 4, "End Sub" End With VBA.UserForms.Add(TempForm.name).Show ThisWorkbook.VBProject.VBComponents.Remove TempForm
End Sub
</source>
Display form in Modal mode
<source lang="vb">
Sub cmdGetUserForm_Click()
frmStats.Show vbModal
End Sub
</source>
Format fonts
<source lang="vb">
Sub PermanentFormFonts (strFont As String)
On Error GoTo PermanentFormFonts_Err Dim objAO As AccessObject Dim objCP As Object Dim ctlControl As Control Set objCP = Application.CurrentProject For Each objAO In objCP.AllForms DoCmd.OpenForm objAO.Name, acDesign, , , , acHidden For Each ctlControl In objAO.Controls ctlControl.FontName = strFont Next DoCmd.Close acForm, objAO.Name, acSaveYes Next
PermanentFormFonts_Exit:
Exit Sub
PermanentFormFonts_Err:
If Err.Number = 438 Then Resume Next Else MsgBox Err.Description Resume PermanentFormFonts_Exit End If
End Sub
</source>
Form count
<source lang="vb">
Sub exaFormsContainer()
Dim db As Database Dim frm As Form Dim doc As Document Set db = CurrentDb Debug.Print "Opened form count: " & Forms.Count For Each frm In Forms Debug.Print frm.Name Next Debug.Print "Saved form count: " & db.Containers!Forms.Documents.Count For Each doc In db.Containers!Forms.Documents Debug.Print doc.Name Next
End Sub
</source>
Loading a Form into Memory Prior to Displaying It
<source lang="vb">
Sub ModifySimpleForm()
Dim sNewCaption As String Load frmSimpleForm sNewCaption = InputBox("Enter a caption for the form.") frmSimpleForm.Caption = sNewCaption frmSimpleForm.Show MsgBox "OK - same form again except with default caption", vbOKOnly frmSimpleForm.Show
End Sub
</source>
Open a form, format the fonts and close it
<source lang="vb">
Sub PermanentFormFonts (strFont As String)
Dim objAO As AccessObject Dim objCP As Object Dim ctlControl As Control Set objCP = Application.CurrentProject For Each objAO In objCP.AllForms DoCmd.OpenForm objAO.Name, acDesign, , , , acHidden For Each ctlControl In objAO.Controls ctlControl.FontName = strFont Next DoCmd.Close acForm, objAO.Name Next
End Sub
</source>
Output form to html file
<source lang="vb">
Sub OutputToDAP()
DoCmd.OutputTo acOutputForm, "frmComplaints", acFormatDAP, "c:P.html"
End Sub
</source>
To remove the Userform from the computer»s memory, you must use the Unload statement; otherwise, the Userform is only hidden.
<source lang="vb">
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Unload Me "Removes Userform named frmStats from memory.
End Sub
</source>
Using the Show Method to Display a Form
<source lang="vb">
Sub SimpleFormExample()
ShowSimpleForm True MsgBox "OK - Same form now, but modeless.", vbOKOnly ShowSimpleForm False MsgBox "Exiting the SimpleFormExample procedure.", vbOKOnly
End Sub
Private Sub ShowSimpleForm(bModal As Boolean)
If bModal Then frmSimpleForm.Show vbModal Else frmSimpleForm.Show vbModeless End If
End Sub
</source>
Практическая работа2 Тема: Разработка программ с использованием математических процедур и функций (линейные программы)
Цель: приобрести навыки программирования с использованием встроенных функций ввода/вывода языка Visual Basic for Application. Осуществить вывод полученных результатов, используя элемент управления текстовое поле (TextBox)
Задание. Найти значение функции: y=sin5x+cos3x при любом заданном х.
Содержание занятия:
-
Откройте приложение MS Word.
-
Выполните команду Разработчик — Visual Basic или нажмите Alt+F11.
-
Добавьте форму (команда Insert UserForm)
-
Для изменения размеров формы используйте указатель мыши помещённый в правый нижний угол окна Формы(UserForm)
-
Разработайте пользовательский интерфейс, расположив на форме с помощью панели инструментов управления (Toolbox), следующие объекты управления: Label (Метка), TextBox (Текстовое поле), CommandButton (Командная кнопка).
-
В окне Properties (Свойства) для каждого объекта управления установить свойства, приведённые в таблице 1.
Таблица 1.
Элемент управления |
Свойства |
Значения |
UserForm |
Caption |
Задание 2 |
Label1 |
Caption |
Вычисление значения функции y=sin5x+cos3x |
Label2 |
Caption |
X= |
Label3 |
Caption |
Y= |
TextBox1 |
Name |
TextBox1 |
TextBox2 |
Name |
TextBox2 |
CommadButton1 |
Name |
cmdRun |
Caption |
Вычислить |
|
CommadButton2 |
Name |
cmdClear |
Caption |
Очистка |
-
Для перехода в окно программирования нажмите правую кнопку мыши на объекте CommandButton и в появившимся контекстом меню выбрать команду View Code или двойной щелчок мыши.
-
Между строками «Private Sub cmdRun_Click()» и «End Sub» введите следующий код программы:
Private Sub cmdRun_Click()
Dim X As Single
Dim Y As Single
X = Val(TextBox1.Text)
Y = sin(5*x)+cos(3*x)
TextBox2=Y
End Sub
-
Примерный интерфейс программы и контрольные значения:
-
Для очистки текстовых полей формы между строками «Private Sub cmdClear_Click()» и «End Sub» введите следующий код программы:
TextBox1 = «»
TextBox2 = «»
Напишите программу, которая бы вычисляла значение функции z=2x+3,5y2
Создайте в сетевой папке вашей группы свою папку под вашей фамилией и сохраните файл под именем «Функция2»
ТЕМА
– РАБОТА С МАКРОСАМИ В ФОРМАХ
Содержание
Часть 2. Макросы в формах Excel
Часть 1. Макросы в формах Word
Задание
— В текстовом редакторе Word
создать форму, позволяющую
включить или исключить любой из
четырёх элементов заголовка: имя,
адрес, номер телефона и факса или
адрес электронной почты.
Форма
должна иметь такой же вид, как и на
рисунке 1.
Создание
такой диалоговой формы можно разбить
на 2 этапа:
-
создание
формы; -
создание
кода для использования формы.
АЛГОРИТМ
1. Создание формы.
-
Откройте
редактор VBA.
(Alt + F11) -
Если
в редакторe VBA
окно проекта не отображается на экране,
нажмите сочетание клавиш [Ctrl]+[R]
для его открытия.
-
В
списке проектов выберите проект Normal. -
Выполните
команду InsertUserForm
(ВставкаUserForm). -
Щёлкните
в пределах формы. При этом на экране
будет отображена Панель элементов
(Toolbox),
содержащая элементы управления, которые
могут быть добавлены в форму. -
В
окне свойств
присвойте свойству Name
имя FrmLetterHead. -
Свойству
Caption
присвойте Заголовок
письма.
-
Щёлкните
на кнопке Флажок (CheckBox)
на панели элементов, а затем щёлкните
в левом верхнем углу формы, чтобы
обозначить место в форме для размещения
создаваемого флажка. (Созданный флажок
получает имя по умолчанию CheckBox1) -
Трижды
повторите шаг 8
для создания остальных флажков. -
Используя
команды меню FormatAlign
(ФорматВыравнять)
разместите четыре созданных флажка в
столбец, распложенный вдоль левого
края формы. -
Разместить
под созданными флажками кнопку
(CommandButton). -
Оставив
кнопку CommandButton1
выделенной, выделите свойство
Name
в окне свойств и измените его значение
на cmdHeading. -
Выделите
свойство Caption
(Подпись)
и измените его значение на Создать
заголовок. -
Поочередно
выделите каждый из четырёх флажков и
измените значения свойств Name
и Caption
для них в соответствии с таблицей1.
Таблица
1. Значение
свойств для флажков.
Исходное |
Новое |
Новое |
CheckBox1 |
ChkName |
Имя |
CheckBox2 |
ChkAddress |
Адрес |
CheckBox3 |
ChkPhones |
Телефон |
CheckBox4 |
chkEmail |
Электронная |
-
Выделите
всю форму, выполнив щелчок на её строке
заголовка, а затем, перетаскивая один
из угловых размерных маркеров, уменьшите
её до необходимого размера. -
Проверьте,
как отображается созданная форма, нажав
[F5]. -
Вернитесь
в окно редактора. -
Активизируйте
элемент ChkName. -
Установите
для свойства ControlTipText
значение: Вставляет
в документ имя адресата. -
Запустите
форму. Подведите указатель мыши к флажку
для имени и задержите мышь. Должна
появиться всплывающая подсказка. -
Определите
подсказки для остальных флажков.
Задание
2. Подготовка
кода для использования в форме.
У
Вас есть готовый код макроса
Заголовок_для_письма,
который надо переработать. При доработке
кода необходимо учитывать следующие
моменты:
-
основная
процедура макроса должна обеспечивать
открытие формы Заголовок письма. После
того как форма будет открыта, её код
будет управлять выполнением программы
до завершения операции; -
поскольку
макрос должен отвечать на щелчок на
кнопке Создать
заголовок,
необходимо
переместить имеющийся код макроса,
осуществляющий вставку текста,
в определенную процедуру обработки
события, связанную с формой Заголовок
письма.
А именно, в процедуру cmdHeading_Click,
выполняемую
при щелчке
на кнопке Создать
заголовок.
Все действия, связанные со вставкой
текста в
документ, выполняются в рамках именно
этой процедуры. -
необходимо
дополнить процедуру cmdHeading_Click
четырьмя
условными структурами.
Это позволит определять, какие строки
текста подлежат вставке
в документ, основываясь на значениях
представленных флажками параметров.
Несмотря
на то, что подобный план значительно
отличается от первоначальных
действий, выполняемых исходным
макросом, эта часть работы по созданию
кода будет сравнительно несложной. В
окне кода необходимо переместить большой
блок кода из исходного макроса в процедуру
cmdHeading_Click.
Затем
следует
добавить новую строку кода для открытия
окна диалога в код макроса.
И наконец, необходимо добавить
последовательность условных инструкций
в процедуру cmdHeading_Click
для
вставки соответствующих частей
информации.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Summary: My company sends out letters to customers and wants me to write a macro to fill in different text form fields that have been set up in a word document since a very limited amount of things change between different letters sent out. I’ve done macros in excel, but this is my first encounter with ms-word macros
Problem: I’ve had a hard time finding effective, intelligent navigation through ms-word. I did find this article about moving in different directions
which is really the same as the arrow keys. Was hoping to get some insight into the best way to navigate the word document. For example should I do a loop of moving to the right 1 space until I find something meaningful or is there a more effective way?
Question: Is it possible to store a specific form location in a variable or does ms-word have no coordinate system?
Thanks in advance!
asked Aug 16, 2012 at 13:34
Mike KelloggMike Kellogg
1,1585 gold badges15 silver badges34 bronze badges
9
To work with the content controls, you have to ensure that you have set the Title
of the control. You can also set the Tag
as well if you want. See Snapshot
And then you can use this code to update the content control or retrieve it’s value
Sub Sample()
Dim cc As ContentControl
For Each cc In ActiveDocument.ContentControls
If cc.Title = "MyTextBox1" Then
cc.Range.Text = "Hello World!"
Exit For
End If
Next cc
End Sub
When you run the code, this is how it looks
To get the control’s text you can use Debug.Print cc.Range.text
answered Aug 16, 2012 at 16:25
Siddharth RoutSiddharth Rout
146k17 gold badges206 silver badges250 bronze badges
1
There are at least three types of Form Field in recent Windows version of Word — Content Controls, «Legacy Form Fields» and ActiveX Form Fields. Assuming you are dealing with Legacy Form Fields, you should be able to index the FormFields collection using the bookmark name, then use, e.g.
ActiveDocument.FormFields("Text1").Result = "mytextformfieldresult"
ActiveDocument.FormFields("DropDown1").Result = "mydropdownformfieldresult"
ActiveDocument.FormFields("Check1").Checkbox.Value = True
answered Aug 16, 2012 at 16:50
1
You should be able to create bookmarks at various places in the document that you need to go to. In modern Word, this is on the «Insert» tab, in the «Links» group. Then you can access the bookmarks from VBA and insert text into them with this sort of code:
ActiveDocument.Bookmarks("myBookmark").Range.InsertBefore "Inserted Text"
This MVP site has more data on the technique. Also, MSDN has some data on bookmark objects.
answered Aug 16, 2012 at 13:56
dsolimanodsolimano
8,7903 gold badges48 silver badges63 bronze badges
1
Продолжаем серию заметок по теме автоматизации документов.
Сегодня я расскажу, как добавить к вашим документам специальную форму, с помощью которой можно легко и просто вводить данные в документ. Введенные в форму данные адресата по нажатию кнопки на форме будут автоматически внесены в документ.
Предполагается, что у вас есть готовый шаблон документа, например, письма. В качестве образца можно использовать подготовленный мною шаблон официального письма вымышленной организации.
Использование шаблона необходимо, ведь на его основе вы в дальнейшем будете создавать свои документы.
Распакуйте файл из архива и поместите его в папку с шаблонами редактора Word. Как правило, эта папка находится по адресу: C:Documents and SettingsИМЯ_ПОЛЬЗОВАТЕЛЯApplication DataMicrosoftШаблоны.
Итак, шаблон документа у нас есть, открыт и готов к изменению. В первую очередь нам необходимо добавить закладки в те позиции в документе, куда вы собираетесь вставлять данные из формы. Как правило, письмо должно содержать фамилию, имя и отчество адресата, наименование организации адресата, полный почтовый адрес и приветствие.
Исходя из этого мы добавим в документ следующие закладки:
- name
- company
- address
- date
- salutation
Обратите внимание, реквизитов адресата, которые должно содержать письмо, на самом деле может быть много, а закладок мы определили всего пять. Это логично, так как в дальнейшем мы будем подставлять несколько реквизитов к одной закладке (например, адрес, который будет состоять из индекса, названия города, области, улицы).
После добавления закладок (и если у вас включен режим отображения меток закладок), наш документ будет выглядеть примерно как на рисунке ниже (щелкните по картинке для ее увеличения):
Эти метки закладок после нажатия кнопки «Внести данные» будут заменены на конкретные тексты.
Не забывайте сохранять сделанные вами изменения в шаблоне на всякий «пожарный» случай.
На втором шаге мы создадим специальную форму с текстовыми полями, которая будет открываться при создании каждого нового документа на основе вашего шаблона письма. Кратко расскажу, как добавить в шаблон форму.
- Откройте редактор Visual Basic с помощью сочетания клавиш «Alt»+«F11». Убедитесь, что в окне проектов выделен ваш шаблон:
- В меню Insert выберите команду UserForm. В окне проектов будет создан новый объект Forms с пустой формой или просто добавлен в проект модуль userForm.
- Разместите на форме необходимые элементы. Например, как на рисунке ниже:
Текстовые поля (со стандартными именами TextBox1) были мною переименованы с учетом их назначения. Обратите внимание в нижеприведенном коде, как они теперь называются.
Третий шаг — написание кода для элементов нашей формы.
- В меню Insert выберите команду Module. В окне проектов будет создан новый модуль Module1. Дважды щелкните по модулю и перейдите в окно редактирования кода. Вставьте следующий код:
- Перейдите на модуль UserForm1. Переименуйте его в MyForm.
- Нажмите клавишу «F7» и в окне редактора кода вставьте следующий код (содержит процедуры для действий с элементами формы):
- Ниже этого кода вставьте следующий код:
- Сохраните проект и попробуйте создать на основе вашего шаблона новый документ. Введите необходимые данные в поля формы и нажмите кнопку «Внести данные».
Sub AutoNew() Dim oF As MyForm Set oF = New MyForm oF.Show Set oF = Nothing End Sub
Этот код запускает форму каждый раз при создании нового документа на основе вашего шаблона.
Private Sub CommandButton1_Click() 'Действия формы по нажатию кнопки "Ввести данные" Dim bm As Bookmarks Dim rng As Word.Range Dim addr As String Dim sText As String Dim sResult1 As String Dim sResult2 As String Dim arName() As String Set bm = ActiveDocument.Bookmarks sText = Me.tbName.Text 'присваиваем переменной текст из текстового поля "Имя адресата" arName = Split(sText) 'создаем массив из отдельных слов, вместе составляющих ФИО адресата 'Действия с полем "Дата" With Me.tbDate If Not IsDate(.Text) Then 'если данные введены не в формате даты, то MsgBox "В поле ""Дата"" неверно введены данные." 'выводим сообщение .Text = Format(Now, "dd MMMM yyyy") 'автоматически заполняем поле текущей датой .SetFocus 'фокус на поле "Дата" .SelStart = 0 ' .SelLength = Len(.Text) 'выделяем весь текст в поле, начиная с левого края Exit Sub Else Set rng = bm("date").Range 'присваиваем переменной rng ссылку на закладку "date" rng.Text = .Text & " г." 'определяем новый текст закладки bm.Add "date", rng 'заменяем закладку End If End With Set rng = bm("name").Range 'присваиваем переменной rng ссылку на закладку "name" sResult1 = arName(0) & " " 'присваиваем переменной значение первого слова из поля "Имя адресата" и добавляем пробел sResult1 = sResult1 & Left(arName(1), 1) & ". " 'добавляем к первому слову первую букву Имени и точку sResult1 = sResult1 & Left(arName(2), 1) & "." 'добавляем первую букву Отчества и точку rng.Text = sResult1 'определяем новый текст закладки bm.Add "name", rng 'заменяем закладку Set rng = bm("company").Range 'присваиваем переменной rng ссылку на закладку "company" rng.Text = Me.tbCompany 'определяем новый текст закладки bm.Add "company", rng 'заменяем закладку If Len(sText) > 0 Then 'если в поле "Имя адресата" есть какие-то символы, то sText = sResult1 & vbCr 'присваиваем переменной текст закладки "name" и переводим строку End If If Len(Me.tbCompany.Text) > 0 Then 'если в поле "Организация" есть какие-то символы, то Me.tbCompany.Text = Me.tbCompany.Text & vbCr 'присваиваем переменной текст из поля и переводим строку End If If Len(Me.tbAddress.Text) > 0 Then 'если в поле "Адрес" есть какие-то символы, то Me.tbAddress.Text = Me.tbAddress.Text 'присваиваем переменной текст из поля End If If Len(Me.tbIndex.Text) > 0 Then 'если в поле "Индекс" есть какие-то символы, то Me.tbIndex.Text = Me.tbIndex.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If If Len(Me.tbCity.Text) > 0 Then 'если в поле "Город" есть какие-то символы, то Me.tbCity.Text = Me.tbCity.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If If Len(Me.tbOblast.Text) > 0 Then 'если в поле "Область" есть какие-то символы, то Me.tbOblast.Text = Me.tbOblast.Text & "," 'присваиваем переменной текст из поля и добавляем запятую End If 'присваиваем переменной фрагментов текста из полей "Индекс", "Город", "Область" и "Адрес" addr = Me.tbIndex.Text & " " & Me.tbCity.Text & " " & Me.tbOblast.Text & " " & Me.tbAddress.Text Set rng = bm("address").Range 'присваиваем переменной rng ссылку на закладку "address" rng.Text = addr 'определяем новый текст закладки из переменной addr bm.Add "address", rng 'заменяем закладку Set rng = bm("salutation").Range 'присваиваем переменной rng ссылку на закладку "salutation" rng.Text = Me.tbSalutation.Text 'определяем новый текст закладки bm.Add "salutation", rng 'заменяем закладку Unload Me 'Закрываем форму ActiveDocument.Range.Fields.Update 'Обновляем все поля в документе End Sub
Private Sub CommandButton2_Click() 'Выход из формы и закрытие окна документа при нажатии кнопки "Отменить" On Error GoTo ErrLabel Unload Me 'Закрываем форму ActiveDocument.Close 'Закрываем текущий документ ErrLabel: End Sub Private Sub tbIndex_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Устанавливаем правила заполнения поля "Индекс" With Me.tbIndex If Not IsNumeric(.Text) Or Len(.Text) <> 6 Then 'если в поле "Индекс" данные не цифры и меньше 6, то MsgBox "Ошибка!" & " " & "Введите 6 цифр индекса города или района." 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus End If End With End Sub Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'При выходе из поля "Имя адресата" его имя подставляется в поле "Приветствие" sText = Me.tbName.Text arName = Split(sText) sResult2 = arName(1) & " " sResult2 = sResult2 & arName(2) Me.tbSalutation = "Уважаемый " & sResult2 & "!" End Sub Private Sub UserForm_Initialize() Me.tbDate = Format(Now, "dd MMMM yyyy") With Me.tbName .Text = "Фамилия Имя Отчество" .SetFocus .SelStart = 0 .SelLength = Len(.Text) End With End Sub
Вы можете скачать уже готовый шаблон письма и подредактировать его под свои нужды.
В этом шаблоне есть небольшой недостаток: в текстовые поля нужно вводить информацию в правильном формате и регистре, иначе в итоговом письме придется вручную править недочеты.
Образцом для шапки шаблона послужила картинка из шаблона городского письма редактора Word 2007.
Образцом кода для данного макроса и формы послужила заметка Gregory Maxey Address a Letter Using as UserForm.