Take a look at the attached. This is a great example of using more than one userform in conjunction with each other. We're using the first form (fAppointment - note singular name) to load an appointment item from fAppointments (note the plural name).
I also took the time to add two properties to fAppointment. This has several advantages. First and foremost, you can load these properties up when calling the form, either by launch or by another form. You can set defaults if you don't want to use the system's (i.e. a Long variable will default with a 0 value, a String will be vbNullString or "", a Boolean will be False, etc.).
While this is starting to get into intermediate VBA, it still serves as a great example for how to use them. If you want to be good with VBA, these are excellent fundamentals to learn early on. Don't worry too much about how to structure custom properties or how to code them, there are tools to help you write them so you don't have to have the exact nomenclature memorized. The thing you need to know is 1) they all have a default based on the [variable] type, 2) you can have a read-only property, 3) you can have a read-write property, 4) you can perform any action within those properties, i.e. "do this when someone gets this property value".
File: Calendar Rev 3.1.2.xlsm
For transparency and ease of consumption, I'll post the code below.
fAppointment properties:
fAppointment button commands:' Variables to hold [value] for writing property Private pNewAppointment As Boolean Private pAppointmentIndex As Long Public Property Get NewAppointment() As Boolean ' Read property NewAppointment = pNewAppointment End Property Public Property Let NewAppointment( _ ByVal Value As Boolean _ ) ' Write property pNewAppointment = Value End Property Public Property Get AppointmentIndex() As Long ' Read property AppointmentIndex = pAppointmentIndex End Property Public Property Let AppointmentIndex( _ ByVal Value As Long _ ) ' Write property pAppointmentIndex = Value End Property
fAppointments buttom commands:Private Sub CancelButton_Click() Unload Me End Sub Private Sub OkButton_Click() Dim Table As ListObject Dim DateTime As Date Dim DatePart As Date Dim TimePart As Date Dim Index As Long On Error Resume Next DateTime = CDate(Me.tDateTime.Value) DatePart = Int(DateTime) TimePart = DateTime - DatePart On Error GoTo 0 If DateTime = 0 Then MsgBox "Please enter a date and time.", vbExclamation + vbOKOnly, "Date/Time" Exit Sub End If If Me.tAppointment.Value = vbNullString Then MsgBox "Please enter an appointment text.", vbExclamation + vbOKOnly, "Appointment" Exit Sub End If Set Table = ThisWorkbook.Worksheets("Calendar").ListObjects("Table2") If Me.NewAppointment Then If Table.DataBodyRange Is Nothing Then Table.ListRows.Add Me.AppointmentIndex = 1 Else For Index = 1 To Table.ListRows.Count If WorksheetFunction.CountA(Table.DataBodyRange(Index, 1).Resize(1, 3)) = 0 Then Me.AppointmentIndex = Index Exit For End If Next Index End If If Index > Table.ListRows.Count Then Table.ListRows.Add End If Else Index = Me.AppointmentIndex End If If Me.AppointmentIndex > 0 Then Table.DataBodyRange(Me.AppointmentIndex, 1).Value = Format(TimePart, "h:mm AM/PM") Table.DataBodyRange(Me.AppointmentIndex, 2).Value = Me.tAppointment.Value Table.DataBodyRange(Me.AppointmentIndex, 3).Value = Format(DatePart, "mm/dd/yyyy") Unload Me Else MsgBox "Something went wrong.", vbExclamation + vbOKOnly, "Whoops!" End If End Sub
Buttom calls/form loads:Private Sub lAppointments_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim Appointment As New fAppointment Dim DateTime As Date Dim Index As Long Dim SelectedIndex As Long For Index = 0 To Me.lAppointments.ListCount - 1 If Me.lAppointments.Selected(Index) Then SelectedIndex = Index Exit For End If Next Index If SelectedIndex = 0 Then Exit Sub On Error Resume Next DateTime = Me.lAppointments.List(SelectedIndex, 2) + Me.lAppointments.List(SelectedIndex, 0) On Error GoTo 0 Load Appointment Appointment.tDateTime.Value = Format(DateTime, "m/d/yyyy h:mm AM/PM") Appointment.tAppointment.Value = Me.lAppointments.List(SelectedIndex, 1) Appointment.NewAppointment = False Appointment.AppointmentIndex = SelectedIndex + 1 Appointment.Show Me.Repaint End Sub Private Sub CloseButton_Click() Unload Me End Sub
Sub ShowAppointments() Dim Appointments As New fAppointments Load Appointments Appointments.Show End Sub Sub ShowAddAppointment() Dim Appointment As New fAppointment Load Appointment Appointment.NewAppointment = True Appointment.Show End Sub




Reply With Quote