Страница 1 из 1

элемент Calendar в UserForm Excel

Добавлено: 25 май 2009, 21:58
Unagatta
в UserForm есть элемент Calendar и несколько TextBox'ов. нужно вставить в активный textbox дату из Календаря.
Как это сделать?

Private Sub Calendar1_Click()
"значение выделенного элемента" = Calendar1.Value
End Sub

что нужно написать вместо "значение выделенного элемента"?

Re: элемент Calendar в UserForm Excel

Добавлено: 25 май 2009, 23:17
Aent
Когда вы кликаете на календаре фокус уходит с TextBox , cоответственно есть
2 пути. Если TextBox мало - в лоб указывайте присваивание глобальной переменной
типа Сontrol в обработчике события Exit.

Код: Выделить всё

'В модуле
Global tb as Control
......
'В форме
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Set tb = TextBox1
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Set tb = TextBox2
End Sub
.....
Private Sub TextBoxN_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Set tb = TextBoxN
End Sub
' И не забываем установить значение по умолчанию
Private Sub UserForm_Layout()
     Set tb = TextBox1
End Sub
Private Sub Calendar1_Click()
     tb.text = Calendar1.value
end sub
Если TextBox'ов много - заводим модуль класса

Код: Выделить всё

'Класс MyClass
Option Explicit
Public WithEvents MTXT As MSForms.TextBox
и ... обламываемся с событием Exit. Не умеет такого VBA
Поэтому, перехватываем, например KeyUp (и возможно MouseUp)

Код: Выделить всё

Private Sub MTXT_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      ....
      sName = MTXT.Name
      .....
end sub
SName это глобальная строковая переменная, объявленная в модуле кода
При инициализации формы не забываем создать объект

Код: Выделить всё

....
Private Sub UserForm_Initialize()
     Dim i as long
     .....
     ReDim Preserve txtm(1 To N)
     For i = 1 to N
          Set txtm(i).MTXT = Me.Controls("TextBox" & Format$(i,"#"))
     Next i
End sub
Ну и как вы уже наверно догадались, присваивание идёт так

Код: Выделить всё

........
UserForm1.controls(sName).Text = .....
........
Можно так же в каждый textbox встроить кнопку для вызова выпадающего календаря.
Или обрабатывать двойной клик в поле.
Но я бы вам порекомендовал вообще отказаться от Calendar и сосредоточиться на
обработке ввода символов даты в поле. Практика показала что так гораздо быстрее и удобнее.