Te anexo un control de calendario. En el archivo está la clase cCalendar, simplemente copia el módulo de clase a tu archivo.
Antes de que intentes adaptar todos los códigos a tu UserForm, realiza pruebas en el archivo que estoy compartiendo.
Funciona de la siguiente manera:
1. Debes crear un módulo de clase llamado: "Class1"
2. Pon el siguiente código en el módulo de clase "Class1":
Public WithEvents MultTextbox As MSForms.TextBox
Private Sub MultTextbox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With DatePickerForm
Set .TxtBx = MultTextbox
.Show
End With
End Sub
3. Crea un userform con el nombre: "DatePickerForm" (simplemente copia o arrastra el userform a tu archivo).
4. El código en el form "DatePickerForm":
Option Explicit
Private WithEvents Calendar1 As cCalendar
Public TxtBx As Object 'MSForms.TextBox
Private Sub Calendar1_Click()
Call CloseDatePicker(True)
End Sub
Private Sub Calendar1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyEscape Then
Call CloseDatePicker(False)
End If
End Sub
Private Sub UserForm_Initialize()
If Calendar1 Is Nothing Then
Set Calendar1 = New cCalendar
With Calendar1
.Add_Calendar_into_Frame Me.Frame1
.UseDefaultBackColors = False
.DayLength = 3
.MonthLength = mlENShort
.Height = 140
.Width = 180
.GridFont.Size = 7
.DayFont.Size = 7
.Refresh
End With
Me.Height = 173 'Win7 Aero
Me.Width = 197
End If
End Sub
Private Sub UserForm_Activate()
Calendar1.Value = Date 'Target.Value
Me.Top = UserForm1.Top + TxtBx.Top + TxtBx.Height
Me.Left = UserForm1.Left + TxtBx.Left + TxtBx.Width
End Sub
Sub CloseDatePicker(Save As Boolean)
UserForm1.Controls(TxtBx.Name) = Calendar1.Value
UserForm1.Controls(TxtBx.Name).SetFocus
End Sub
5. En tu userform, en mi ejemplo es el UserForm1 pon el siguiente código:
Dim TxtBx() As New Class1
Private Sub UserForm_Initialize()
Dim i As Long, n As Long
Dim ctrl As MSForms.Control
i = 1
For Each ctrl In Me.Controls
If TypeName(ctrl) = "TextBox" Then
Select Case ctrl.Name
Case "TextBox2", "TextBox7", "TextFecha4", "TextFecha5"
ReDim Preserve TxtBx(i)
Set TxtBx(i).MultTextbox = ctrl
i = i + 1
End Select
End If
Next
End Sub
6. En esta línea debes poner los nombres de los textbox que son para capturar fecha:
Case "TextBox2", "TextBox7", "TextFecha4", "TextFecha5"
Lo que hace el código en el userform1 es hacer una colección de todos los textbox en los cuales vas a capturar una fecha y asociarlos a una clase.
Entonces los eventos que ocurran en esos textbox, podrán ser controlados desde la clase "Class1".
Para este caso, cuando des clic en los textbox de fecha se abrirá el calendario, al seleccionar la fecha en el calendario, automáticamente se llenará el textbox seleccionado.
Mi archivo de pruebas:
https://drive.google.com/file/d/106jNb43igqH-wEsKBBvqfa2N6wF6mVig/view?usp=sharing