Hôm nay TINVANPHONG xin gửi đến các bạn đọc 1 đề tài khá quen thuộc và sử dụng rất nhiều trong lập trình VBa đó là. Tạo công cụ chọn ngày tháng trong USERFORM, đây là 1 tiện ích tối ưu hóa người dùng thân thiện quen thuộc. Nó giúp đầu vào giữ liệu luôn đúng theo khuôn mẫu đề ra.
Tạo công cụ chọn ngày tháng trong USERFORM

I.TỔNG QUẢN VỀ – Tạo công cụ chọn ngày tháng trong USERFORM
Đây là công cụ Lịch VBA trong Excel mà tôi đã phát triển để sử dụng với Công cụ quản lý việc cần làm của mình. Bạn có thể gắn công cụ vào một nút. Nó tạo điều kiện cho việc chọn ngày một cách trực quan.
Công cụ Lịch VBA trong Excel cũng có thể được sử dụng như một tờ lịch để điền vào các hộp văn bản ngày trong một biểu mẫu. (Đảm bảo đặt biểu mẫu đang được điền để hiển thị modal = false). Để tải xuống bản sao miễn phí của công cụ của tôi, vui lòng sử dụng nút demo bên dưới tải xuống bên dưới.
Tôi có bộ mã công cụ Lịch VBA trong Excel để điền vào ô hiện hoạt với ngày người dùng chọn. Tuy nhiên, chúng tôi có thể dễ dàng sửa đổi mã để hoạt động như một công cụ chọn lịch bật lên.
II. HƯỚNG DẪN – Tạo công cụ chọn ngày tháng trong USERFORM
BƯỚC 1: Bạn tải file DEMO phía dưới Export FILE ( Calenar ) này về , Và vào file gốc của mình Import FIle vào như hình bên dưới

Mời bạn xem qua đoạn CODE USERFORM
Option Explicit
Private Sub CmbMonth_Change()
If Me.CmbMonth.Value <> "" And Me.CmbYear.Value <> "" Then
Call Show_Dates
Me.lblSelectedMonth = Me.CmbMonth & "/" & Me.CmbYear
End If
End Sub
Private Sub CmbYear_Change()
If Me.CmbMonth.Value <> "" And Me.CmbYear.Value <> "" Then
Call Show_Dates
Me.lblSelectedMonth = Me.CmbMonth & "/" & Me.CmbYear
End If
End Sub
Sub ButtonClick(btn As MSForms.CommandButton)
With btn
If .Caption <> "" Then
Me.TextBox1.Value = .Caption & "/" & Left(Me.CmbMonth.Value, 3) & "/" & Me.CmbYear.Value
Unload Me
End If
End With
End Sub
Private Sub CommandButton1_Click()
Call ButtonClick(Me.CommandButton1)
End Sub
Private Sub CommandButton2_Click()
Call ButtonClick(Me.CommandButton2)
End Sub
Private Sub CommandButton3_Click()
Call ButtonClick(Me.CommandButton3)
End Sub
Private Sub CommandButton4_Click()
Call ButtonClick(Me.CommandButton4)
End Sub
Private Sub CommandButton5_Click()
Call ButtonClick(Me.CommandButton5)
End Sub
Private Sub CommandButton6_Click()
Call ButtonClick(Me.CommandButton6)
End Sub
Private Sub CommandButton7_Click()
Call ButtonClick(Me.CommandButton7)
End Sub
Private Sub CommandButton8_Click()
Call ButtonClick(Me.CommandButton8)
End Sub
Private Sub CommandButton9_Click()
Call ButtonClick(Me.CommandButton9)
End Sub
Private Sub CommandButton10_Click()
Call ButtonClick(Me.CommandButton10)
End Sub
Private Sub CommandButton11_Click()
Call ButtonClick(Me.CommandButton11)
End Sub
Private Sub CommandButton12_Click()
Call ButtonClick(Me.CommandButton12)
End Sub
Private Sub CommandButton13_Click()
Call ButtonClick(Me.CommandButton13)
End Sub
Private Sub CommandButton14_Click()
Call ButtonClick(Me.CommandButton14)
End Sub
Private Sub CommandButton15_Click()
Call ButtonClick(Me.CommandButton15)
End Sub
Private Sub CommandButton16_Click()
Call ButtonClick(Me.CommandButton16)
End Sub
Private Sub CommandButton17_Click()
Call ButtonClick(Me.CommandButton17)
End Sub
Private Sub CommandButton18_Click()
Call ButtonClick(Me.CommandButton18)
End Sub
Private Sub CommandButton19_Click()
Call ButtonClick(Me.CommandButton19)
End Sub
Private Sub CommandButton20_Click()
Call ButtonClick(Me.CommandButton20)
End Sub
Private Sub CommandButton21_Click()
Call ButtonClick(Me.CommandButton21)
End Sub
Private Sub CommandButton22_Click()
Call ButtonClick(Me.CommandButton22)
End Sub
Private Sub CommandButton23_Click()
Call ButtonClick(Me.CommandButton23)
End Sub
Private Sub CommandButton24_Click()
Call ButtonClick(Me.CommandButton24)
End Sub
Private Sub CommandButton25_Click()
Call ButtonClick(Me.CommandButton25)
End Sub
Private Sub CommandButton26_Click()
Call ButtonClick(Me.CommandButton26)
End Sub
Private Sub CommandButton27_Click()
Call ButtonClick(Me.CommandButton27)
End Sub
Private Sub CommandButton28_Click()
Call ButtonClick(Me.CommandButton28)
End Sub
Private Sub CommandButton29_Click()
Call ButtonClick(Me.CommandButton29)
End Sub
Private Sub CommandButton30_Click()
Call ButtonClick(Me.CommandButton30)
End Sub
Private Sub CommandButton31_Click()
Call ButtonClick(Me.CommandButton31)
End Sub
Private Sub CommandButton32_Click()
Call ButtonClick(Me.CommandButton32)
End Sub
Private Sub CommandButton33_Click()
Call ButtonClick(Me.CommandButton33)
End Sub
Private Sub CommandButton34_Click()
Call ButtonClick(Me.CommandButton34)
End Sub
Private Sub CommandButton35_Click()
Call ButtonClick(Me.CommandButton35)
End Sub
Private Sub CommandButton36_Click()
Call ButtonClick(Me.CommandButton36)
End Sub
Private Sub CommandButton37_Click()
Call ButtonClick(Me.CommandButton37)
End Sub
Private Sub CommandButton38_Click()
Call ButtonClick(Me.CommandButton38)
End Sub
Private Sub CommandButton39_Click()
Call ButtonClick(Me.CommandButton39)
End Sub
Private Sub CommandButton40_Click()
Call ButtonClick(Me.CommandButton40)
End Sub
Private Sub CommandButton41_Click()
Call ButtonClick(Me.CommandButton41)
End Sub
Private Sub CommandButton42_Click()
Call ButtonClick(Me.CommandButton42)
End Sub
Private Sub img_Next_Click() 'Them 1 thang ''''''''''''''''''''''
On Error Resume Next
If Me.CmbMonth.ListIndex = 11 Then
Me.CmbMonth.ListIndex = 0
Me.CmbYear.Value = Me.CmbYear.Value + 1
Else
Me.CmbMonth.ListIndex = Me.CmbMonth.ListIndex + 1
End If
End Sub
Private Sub img_previous_Click() ' Them 1 thang ''''''''''''''''''''''
On Error Resume Next
If Me.CmbMonth.ListIndex = 0 Then
Me.CmbMonth.ListIndex = 11
Me.CmbYear.Value = Me.CmbYear.Value - 1
Else
Me.CmbMonth.ListIndex = Me.CmbMonth.ListIndex - 1
End If
End Sub
Private Sub UserForm_Activate()
Dim I As Integer
Dim Year_Start, Year_End As Integer
'================= Add Months to List ==============
With Me.CmbMonth
.Clear
For I = 1 To 12
.AddItem VBA.Format(VBA.DateSerial(2018, I, 1), "MM")
Next I
.Value = VBA.Format(VBA.Date, "MM")
End With
'================ Add Years =======================
Year_Start = VBA.Year(VBA.Date) - 5
Year_End = VBA.Year(VBA.Date) + 5
With Me.CmbYear
.Clear
For I = Year_Start To Year_End
.AddItem I
Next I
.Value = VBA.Format(VBA.Date, "YYYY")
End With
Call Show_Dates
If Me.TextBox1.Value <> "" Then
Call Show_Selected_Date(CDate(Me.TextBox1.Value))
End If
End Sub
Private Sub Show_Dates()
Dim first_Date As Date
first_Date = VBA.DateValue("1-" & Me.CmbMonth.Value & "-" & Me.CmbYear.Value)
Dim last_day As Integer
last_day = VBA.Day(VBA.DateSerial(VBA.Year(first_Date), VBA.Month(first_Date) + 1, 1) - 1)
Dim I As Integer
Dim btn As CommandButton
'============ Clear All button
For I = 1 To 41
Set btn = Me.Controls("CommandButton" & I)
btn.Caption = ""
Next I
'====================
For I = 1 To 7 'Set first date of month
Set btn = Me.Controls("CommandButton" & I)
If VBA.Weekday(first_Date) = I Then
btn.Caption = "1"
Else
btn.Caption = ""
End If
Next I
Dim btn1 As CommandButton
Dim btn2 As CommandButton
For I = 1 To 41
Set btn1 = Me.Controls("CommandButton" & I)
Set btn2 = Me.Controls("CommandButton" & I + 1)
If btn1.Caption <> "" Then
If last_day > btn1.Caption Then
btn2.Caption = btn1.Caption + 1
End If
End If
Next I
Call Reset_Colors
End Sub
Private Sub Reset_Colors()
Dim I As Integer
Dim btn As CommandButton
Me.img_Star.Visible = False
For I = 1 To 42
Set btn = Me.Controls("CommandButton" & I)
With btn
.BackColor = &H8000000E 'set background colors
.Enabled = True 'Enable All
If .Caption = "" Then 'Disbale for blanks
.Enabled = False
.BackColor = &HE0E0E0
End If
End With
Next I
End Sub
Function SelectedDate(Optional Target_Control As Object) As String
Dim str As String
If (TypeName(Target_Control)) = "TextBox" Or TypeName(Target_Control) = "Range" Then str = Target_Control.Value
If (TypeName(Target_Control)) = "CommandButton" Or TypeName(Target_Control) = "Label" Then str = Target_Control.Caption
If IsDate(str) Then
Me.TextBox1.Value = VBA.Format(CDate(str), "DD/MM/YYYY")
Else
Me.TextBox1.Value = ""
End If
Me.sHOW
If (TypeName(Target_Control)) = "TextBox" Or TypeName(Target_Control) = "Range" Then
Target_Control.Value = Me.TextBox1.Value
ElseIf (TypeName(Target_Control)) = "CommandButton" Or TypeName(Target_Control) = "Label" Then
Target_Control.Caption = Me.TextBox1.Value
Else
SelectedDate = Me.TextBox1.Value
End If
End Function
Sub Show_Selected_Date(dt As Date)
Dim I As Integer
Dim btn As MSForms.CommandButton
On Error Resume Next
Me.CmbMonth.Value = VBA.Format(dt, "MM")
Me.CmbYear.Value = VBA.Format(dt, "YYYY")
For I = 1 To 42
Set btn = Me.Controls("CommandButton" & I)
If btn.Caption = CStr(VBA.Day(dt)) Then
Me.img_Star.Left = btn.Left + 3
Me.img_Star.Top = btn.Top + 3
Me.img_Star.Visible = True
btn.BackColor = vbWhite
End If
Next I
End Sub
Bước 2 : Bạn sử dụng đoạn code bên dưới để sử dụng cho textbox :

Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call Calendar.SelectedDate(UserForm1.TextBox1) End Sub
Sự kiện TextBox1_MouseUp : là sự một kiện liên quan đến chuột Quy trình sự kiện MouseDown hoặc MouseUp chỉ định các hành động xảy ra khi nhấn hoặc nhả nút chuột. Các sự kiện MouseDown và MouseUp cho phép bạn phân biệt giữa các nút chuột trái, phải và chuột giữa. Bạn cũng có thể viết mã cho các tổ hợp chuột-bàn phím sử dụng các công cụ sửa đổi bàn phím SHIFT, CTRL và ALT.
ByVal X As Single, ByVal Y As Single : Cần thiết. Vị trí ngang hoặc dọc, tính bằng điểm, từ cạnh trái hoặc trên cùng của biểu mẫu, Khung hoặc Trang .
Shift : Cần thiết. Trạng thái SHIFT, CTRL và ALT.
Lưu ý bạn cần chỉnh sửa UserForm1.TextBox1 để cho phù hợp
III.DOWN FILE
Các bài có thể xem thêm
Cho phép nhập liệu số trong TEXTBOX

Bật mí 2 cách đánh số trang trong excel nhanh, gọn, lẹ không thể không biết
Hướng dẫn tạo và sử dụng bộ lọc Filter trong Excel 2019 – Thủ thuật Excel 05
Khám Phá Biểu Đồ Mini Sparklines Trong Excel 2019 – Thủ Thuật Excel 02
Tạo Đường Kẻ Chéo Trong Ô Excel 2019 – Thủ Thuật Excel 01
Đánh Số Thứ Tự Tự Động Trong Excel 2019 – Thủ Thuật Excel 03
Cách sửa Lỗi value trong Excel cực kỳ đơn giản, hiệu quả 100%
Sửa lỗi không mở được File Excel với 6 cách đơn giản nhất
Cách sử dụng Hàm Address để lấy giá trị ô đơn giản nhất