Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как получить значения полей из формы?

248
21 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
Задача: занести в ячейку Екселя число (заменив точку на запятую), а в соседнюю ячейку вписать типовое пояснение (их может быт быть варианта).
Сделал форму с окошком для ввода числа + радиопереключатель для отметки нужного варианта пояснения + кнопку ОК.
(сначала вводил число через 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....
275
21 апреля 2011 года
pashulka
985 / / 19.09.2004
Если заполнить ячейки, используя CommandButton1_Click нельзя, то добиться желаемого можно, например, так :

Стандартный модуль

 
Код:
Public Variable1 As Double, Variable2 As Boolean

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


или так :

Стандартный модуль

 
Код:
Private Sub Test()
    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
248
21 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
C трудом, но получилось так:
 
Код:
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

Т.е. пришлось явно указать название формы, откуда брать данные.

Огромное спасибо!
275
21 апреля 2011 года
pashulka
985 / / 19.09.2004
Странно … ведь я выкладывал проверенные временем примеры, а что касается последнего кода, то, при желании, там можно уменьшить количество обращений к UserForm1, т.е.

 
Код:
Private Sub Test()
    With UserForm1
    .TextBox1.Value = ""
    .OptionButton1.Value = True
    .Show

    m1 = Val(.TextBox1.Value)
    m2 = .Barv_button.Value
  End With
End Sub
248
21 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
"Странно … ведь я выкладывал проверенные временем примеры". Ну может я что-то не точно сделал, т.к. переменные у меня другие, пока менял, может что-то и недоглядел.
"уменьшить количество обращений к UserForm1" - так и сделал, спасибо.
А вот заодно вопрос (если можно): нет ли возможности не использовать окно ввода числа, т.к. число уже сидит в буфере обмена и я его туда просто вставляю двойным кликом (дописал процедуру DblClick).
Т.е. можно ли в переменную сразу помещать данные Clipboard'a?
275
21 апреля 2011 года
pashulka
985 / / 19.09.2004
Код:
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
248
22 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
Цитата: pashulka
 
Код:
iData.GetFromClipboard
    iText$ = iData.GetText


Отлично!
Первый раз форму делаю поэтому можно еще вопрос?
Как передать в процедуру, что на форме нажата кнопка Отмена.
Нарисовал кнопку Otmenit и сделал процедурку:

 
Код:
Sub Otmenit_Click()
Me.Hide
End Sub

Форма закроется, это понятно, но надо, чтобы осн. процедура тоже прекратилась и никакие ячейки уже не заполнялись.
Для радиопереключателей я могу передать в вызывющую процедуру их значения как True/False и по ним уже действовать дальше. А по Sub Otmenit_Click ничего никуда не передается?
275
22 апреля 2011 года
pashulka
985 / / 19.09.2004
Попытка #2

Модуль формы

 
Код:
Public CancelForm As Boolean

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
248
22 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
Все сработало. Спасибо.
Но попытался аналогично прописать выход через крестик на форме (т.е. "отмена заполнения"), написал процедурку
 
Код:
Private Sub UserForm_Terminate()
    CancelForm = True: Me.Hide
End Sub

Но значение переменной CancelForm почему-то не передается.
Т.е. строка в исходной процедуре
If Zapolnenie.CancelForm = True Then Exit Sub
обходится. А если нажимать кнопку Отмена то строка
If Zapolnenie.CancelForm = True Then Exit Sub
обрабатывается и значение передается.
И еще вопрос. Можно ли убирать форму кнопко Esc? (быстрее, чем нажимать в "крестик"). Пока форма на Esc не реагирует.
275
22 апреля 2011 года
pashulka
985 / / 19.09.2004
Если хотите использовать события формы UserForm_Terminate или UserForm_QueryClose, то уберите Me.Hide, ибо в этой инструкции уже нет смысла, и обратите внимание на мой самый первый вариант, так как он позволяет сохранить значение переменной CancelForm, в т.ч. и после выгрузки/скрытия формы.

Что касается клавиши ESC , то смотрите здесь, только не забудьте добавить Me.Hide 'Unload Me, а то опять скажете, что не работает ;)
248
23 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
Me.Hide убрал. ОК
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, то выход. Наверное проблема в размещении процедур. То в теле формы, то в модуле своего листа.
248
23 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
Me.Hide убрал. ОК
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, то выход. Наверное проблема в размещении процедур. То в теле формы, то в модуле своего листа.
275
23 апреля 2011 года
pashulka
985 / / 19.09.2004
Странно, что Вы не хотите сначала разобраться с примерами, дабы потом адаптировать их под Вашу задачу, а предпочитаете устраивать охоту на ведьм ...

[ATTACH]5077[/ATTACH]
248
23 апреля 2011 года
Dmitry2064
590 / / 06.12.2006
С Esc разобрался. Вставил указанную процедуру обработки, но пришлось еще в TabOrder перенести эту новую скрытую кнопку на первое место, тогда держится фокус (т.к. при инициализации фомы фокус ставился на кнопку "Отмена" и Esc не работало). Спасибо.

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

[COLOR="darkred"]Спасибо большое за помощь.[/COLOR]
275
23 апреля 2011 года
pashulka
985 / / 19.09.2004
Обратите внимание на то, что Вашу кнопку "Отмена" вполне можно использовать для перехвата нажатия клавиши ESC (см. пример UnloadFormESC)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог