Как получить значения полей из формы?
Сделал форму с окошком для ввода числа + радиопереключатель для отметки нужного варианта пояснения + кнопку ОК.
(сначала вводил число через inputbox, но у него нет доппараметров, поэт пришлось биться с формой).
Теперь не пойму, как в процедуру, вызывающую эту форму (командой Call Vyzov_formy(), а оттуда идет команда Show, а оттуда CommandButton1_Click), вернуть данные (число и отмеченный переключатель). В процедуре CommandButton1_Click я заношу в переменную данные из окошка ввода числа, но потом эта переменная "умирает" и возвращаться в вызывающую (исходную) процедуру уже не с чем.
Т.е. если процедура такая:
Код:
Private Sub CommandButton1_Click()
то переменная не живет
а если так:
Код:
Private Sub CommandButton1_Click(ByVal TextBox1 As Double)
пишется Procedure declaration doesnt match description of event....
Стандартный модуль
Код:
Public Variable1 As Double, Variable2 As Boolean
Private Sub Test()
UserForm1.Show
MsgBox Variable1, ,""
MsgBox Variable2, ,""
End Sub
Private Sub Test()
UserForm1.Show
MsgBox Variable1, ,""
MsgBox Variable2, ,""
End Sub
Модуль формы
Код:
Private Sub CommandButton1_Click()
iVariable1 = Val(TextBox1.Value)
iVariable2 = OptionButton1.Value
Unload Me 'Me.Hide
End Sub
iVariable1 = Val(TextBox1.Value)
iVariable2 = OptionButton1.Value
Unload Me 'Me.Hide
End Sub
или так :
Стандартный модуль
Код:
Private Sub Test()
With UserForm1
.Show
MsgBox .Variable1, ,""
MsgBox .Variable2, ,""
End With
End Sub
With UserForm1
.Show
MsgBox .Variable1, ,""
MsgBox .Variable2, ,""
End With
End Sub
Модуль формы
Код:
Public Variable1 As Double, Variable2 As Boolean
Private Sub CommandButton1_Click()
Variable1 = Val(TextBox1.Value)
Variable2 = OptionButton1.Value
Me.Hide 'Unload Me
End Sub
Private Sub CommandButton1_Click()
Variable1 = Val(TextBox1.Value)
Variable2 = OptionButton1.Value
Me.Hide 'Unload Me
End Sub
Код:
Private Sub Test()
With UserForm1
''' предварит. очистка формы
.TextBox1.Value = ""
.OptionButton1.Value = True
.Show
End With
m1 = Val(UserForm1.TextBox1.Value)
m2 = UserForm1.Barv_button.Value
End Sub
With UserForm1
''' предварит. очистка формы
.TextBox1.Value = ""
.OptionButton1.Value = True
.Show
End With
m1 = Val(UserForm1.TextBox1.Value)
m2 = UserForm1.Barv_button.Value
End Sub
Т.е. пришлось явно указать название формы, откуда брать данные.
Огромное спасибо!
Код:
Private Sub Test()
With UserForm1
.TextBox1.Value = ""
.OptionButton1.Value = True
.Show
m1 = Val(.TextBox1.Value)
m2 = .Barv_button.Value
End With
End Sub
With UserForm1
.TextBox1.Value = ""
.OptionButton1.Value = True
.Show
m1 = Val(.TextBox1.Value)
m2 = .Barv_button.Value
End With
End Sub
"уменьшить количество обращений к UserForm1" - так и сделал, спасибо.
А вот заодно вопрос (если можно): нет ли возможности не использовать окно ввода числа, т.к. число уже сидит в буфере обмена и я его туда просто вставляю двойным кликом (дописал процедуру DblClick).
Т.е. можно ли в переменную сразу помещать данные Clipboard'a?
Код:
Private iData As New MSForms.DataObject
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
iData.SetText TextBox1.Value
iData.PutInClipboard
'TextBox1.Copy
End Sub
Private Sub CommandButton1_Click()
On Error Resume Next
iData.GetFromClipboard
iText$ = iData.GetText
MsgBox iText$, , "" 'для примера
End Sub
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
iData.SetText TextBox1.Value
iData.PutInClipboard
'TextBox1.Copy
End Sub
Private Sub CommandButton1_Click()
On Error Resume Next
iData.GetFromClipboard
iText$ = iData.GetText
MsgBox iText$, , "" 'для примера
End Sub
Цитата: pashulka
Код:
iData.GetFromClipboard
iText$ = iData.GetText
iText$ = iData.GetText
Отлично!
Первый раз форму делаю поэтому можно еще вопрос?
Как передать в процедуру, что на форме нажата кнопка Отмена.
Нарисовал кнопку Otmenit и сделал процедурку:
Код:
Sub Otmenit_Click()
Me.Hide
End Sub
Me.Hide
End Sub
Форма закроется, это понятно, но надо, чтобы осн. процедура тоже прекратилась и никакие ячейки уже не заполнялись.
Для радиопереключателей я могу передать в вызывющую процедуру их значения как True/False и по ним уже действовать дальше. А по Sub Otmenit_Click ничего никуда не передается?
Модуль формы
Код:
Public CancelForm As Boolean
Private Sub Otmenit_Click()
CancelForm = True: Me.Hide
End Sub
Private Sub Otmenit_Click()
CancelForm = True: Me.Hide
End Sub
Стандартный модуль
Код:
Private Sub Test()
UserForm1.Show
If UserForm1.CancelForm = True Then
MsgBox "Вы не хочите больше работать с формой", , ""
Else
'Здесь Вы получаете необходимые данные
End If
End Sub
UserForm1.Show
If UserForm1.CancelForm = True Then
MsgBox "Вы не хочите больше работать с формой", , ""
Else
'Здесь Вы получаете необходимые данные
End If
End Sub
Но попытался аналогично прописать выход через крестик на форме (т.е. "отмена заполнения"), написал процедурку
Код:
Private Sub UserForm_Terminate()
CancelForm = True: Me.Hide
End Sub
CancelForm = True: Me.Hide
End Sub
Но значение переменной CancelForm почему-то не передается.
Т.е. строка в исходной процедуре
If Zapolnenie.CancelForm = True Then Exit Sub
обходится. А если нажимать кнопку Отмена то строка
If Zapolnenie.CancelForm = True Then Exit Sub
обрабатывается и значение передается.
И еще вопрос. Можно ли убирать форму кнопко Esc? (быстрее, чем нажимать в "крестик"). Пока форма на Esc не реагирует.
Что касается клавиши ESC , то смотрите здесь, только не забудьте добавить Me.Hide 'Unload Me, а то опять скажете, что не работает ;)
2. Код
Private Sub CommandButton1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyEscape: Me.Hide
End Select
End Sub
рабоатет странно. Надо сначала нажать на новую "скрытую" кнопку. И только потом начинает перехватываться нажатие Esc. Но если файл закрыть, то Esc опять не будет ловиться, пока не не будет выполнено нажатие на скрытую кнопку.
3. CanselForm не ловится, как и раньше, поэтому вместо проверки этой переменной просто проверяю содержание текстполя. Если = 0, то выход. Наверное проблема в размещении процедур. То в теле формы, то в модуле своего листа.
2. Код
Private Sub CommandButton1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyEscape: Me.Hide
End Select
End Sub
рабоатет странно. Надо сначала нажать на новую "скрытую" кнопку. И только потом начинает перехватываться нажатие Esc. Но если файл закрыть, то Esc опять не будет ловиться, пока не не будет выполнено нажатие на скрытую кнопку.
3. CanselForm не ловится, как и раньше, поэтому вместо проверки этой переменной просто проверяю содержание текстполя. Если = 0, то выход. Наверное проблема в размещении процедур. То в теле формы, то в модуле своего листа.
[ATTACH]5077[/ATTACH]
"Странно, что Вы не хотите сначала разобраться с примерами, дабы потом адаптировать их под Вашу задачу, а предпочитаете устраивать охоту на ведьм ..."
Согласен. Если бы все сделать с самого начала, как написано, то видимо, все бы работало. Но тяжко начинать сначала. Хотя в будущем придется делать не "с наскока", а как надо.
[COLOR="darkred"]Спасибо большое за помощь.[/COLOR]
Обратите внимание на то, что Вашу кнопку "Отмена" вполне можно использовать для перехвата нажатия клавиши ESC (см. пример UnloadFormESC)