VBA Excel [ทุกรุ่น] - การควบคุมปฏิทิน

VBA Excel [ทุกรุ่น] - การควบคุมปฏิทิน

บทนำ

ตัวควบคุมปฏิทินของ VBA เปลี่ยนไประหว่าง Excel 2003 และ Excel 2010 รุ่นเก่ามีตัวควบคุมชื่อเป็น " ปฏิทิน " และสำหรับรุ่นใหม่จะเรียกว่าตัวควบคุม "ตัว เลือก DT " ปัญหาความเข้ากันได้อาจเกิดขึ้นเมื่อคุณพยายามใช้:
  • สมุดงานที่มีการควบคุมปฏิทินใน Excel เวอร์ชันใหม่
  • สมุดงานกับ DT Picker ใน Excel รุ่นก่อนหน้า

ข้อกังวลอีกประการคือรุ่นของ Microsoft Office ที่ใช้งานอยู่ การกำหนดค่าองค์กรบางอย่างไม่อนุญาตให้เข้าถึงตัวควบคุม DT Picker เพื่อแก้ไขปัญหานี้ฉันขอแนะนำให้คุณสร้างการควบคุมปฏิทินของคุณเองโดยใช้ Userform

UserForm

UserForm จะประกอบด้วย:
  • ปุ่มคำสั่ง 29 และ 31 สำหรับ "วัน"
  • ป้ายกำกับ "ทางเลือกประจำเดือน"
  • 2 ปุ่ม ("") เพื่อนำทางระหว่างเดือน
  • เดือนและปีปัจจุบันจะแสดงใน "คำบรรยายภาพ" (ชื่อเรื่อง) ของ UserForm
  • การควบคุมทั้งหมดภายใน UserForm นี้จะถูกสร้างขึ้นแบบไดนามิก

เริ่มต้นใช้งาน

เปิดโปรแกรมแก้ไข VBA สร้าง UserForm ใหม่และเปลี่ยนคุณสมบัติ Name เป็น "Calendrier"

คัดลอกรหัสด้านล่างในโมดูลของ UserForm:

 ตัวเลือกที่ชัดเจนส่วนตัว Sub UserForm_Initialize () Dim Obj เป็นการควบคุม Dim i As Integer, Mois As Integer, Annee As Integer Dim Cl As Classe1 'Créationการเปลี่ยนแปลงการตั้งค่า mois' LABEL Set Collect = ชุดสะสมใหม่ Obj = Me.Controls.Add ("ฟอร์ม .Label.1 ") พร้อม Obj .Name =" LbChoixMois ".Object.Caption =" Choix du mois: ".Left = 5 .Top = 5. ความกว้าง = 70. ความสูง = 10 ลงท้ายด้วย 'BOUTONS Set Obj = Me Controls.Add ("forms.CommandButton.1") ด้วย Obj .Name = "MoisPrec" .Object.Caption = "" .Left = 95 .Top = 1. ความกว้าง = 20. ความสูง = 20 End ด้วย Set Cl = New Classe1 Set Cl.Bouton = Obj Collect.Add Cl 'Créationไปยัง Jours de la semaine สำหรับ i = 1 ถึง 7 Set Obj = Me.Controls.Add ("forms.Label.1") ด้วย Obj .Name = "Jour" & i .Object.Caption = UCase (ซ้าย (รูปแบบ (DateSerial (2014, 9, i), "dddd"), 1)) .Left = 20 * (i - 1) +5. Top = 25. ความกว้าง = 20. ความสูง = 10 ลงท้ายด้วย Next i 'création boutons "jours" Mois = เดือน (วันที่) MoisEnCours = Mois Annee = ปี (วันที่) AnneeEnCours = Annee CreationBoutonsJours Mois, Annee หากซ้าย (รูปแบบ (วันที่, "dd"), 1) = "0" แล้วฉันควบคุม ("Bouton" & รูปแบบ (วันที่, "d")) SetFocus Else Me.Controls ("Bouton" และรูปแบบ (วันที่, "dd")). SetFocus End Sub 

สร้างปุ่ม

จำนวนวันแตกต่างกันไปจากเดือนหนึ่งไปยังอีกดังนั้นเราจะสร้างพวกเขาแบบไดนามิก สำหรับสิ่งนี้ขั้นตอนที่เราต้องการ:
  • ลบปุ่มเก่า
  • สร้างปุ่มใหม่ตามเดือนและปี

สร้างโมดูล (แทรก> โมดูล) และคัดลอกโค้ดด้านล่าง:

 ตัวเลือกที่ชัดเจนสาธารณะ WithEvents Bouton เป็น MSForms.CommandButton Private Sub Bouton_Click () เลือก Case Bouton.NesNNNNNNNNNNSEEours = MoisEnCours = 1 แล้ว MoisEnCours = 12 AnneeEnCours = 1900 MsgBox "Premièreannée: 1900" สิ้นสุดถ้าสิ้นสุดหาก Case "MoisSuiv" MoisEnCours = MoisEnCours + 1 ถ้า MoisEnCours = 13 จากนั้น MoisEnCours = 1 AnneeEnCours = 1 AnneeEnCours = 1 AnneeEnCours = 1 EndeeEoursCours 

โมดูลระดับ

เราจะต้องสร้างโมดูล class เพื่อให้ปุ่มคำสั่งทำงานได้

วิธีนำทางระหว่างเดือน:

 ตัวเลือกที่ชัดเจนประชาชนด้วยกิจกรรม Btn ในฐานะ MSForms.CommandButton 'Procédure lors du clic sur un bouton "jour" Private Sub Btn_Click () Dim maDate ณ วันที่ maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) l'action à effectuer lors d'un clic sur le bouton 'Pour entrer la date Choisie และ une cellule และ fermer l'Userform:' ActiveCell.Value = maDate 'ยกเลิกการโหลด Calendrier MsgBox maDate End Sub คุณสามารถดูส่วนย่อย Btn_MouseMove (ปุ่ม ByVal As Integer, ByVal Shift As Integer, ByVal X เป็น Single, ByVal Y เป็นโสด) Dim maDate ณ วันที่ maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) หาก EstJourFerie (maDate) หรือ Paques (ปี (maDate)) = maDate จากนั้น Btn.ControlTipText = QuelFerie (maDate) End Sub 

โมดูลระดับสำหรับวัน

 ตัวเลือกที่ชัดเจนประชาชนด้วยกิจกรรม Btn ในฐานะ MSForms.CommandButton 'Procédure lors du clic sur un bouton "jour" Private Sub Btn_Click () Dim maDate ณ วันที่ maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) l'action à effectuer lors d'un clic sur le bouton 'Pour entrer la date Choisie และ une cellule และ fermer l'Userform:' ActiveCell.Value = maDate 'ยกเลิกการโหลด Calendrier MsgBox maDate End Sub คุณสามารถดูส่วนย่อย Btn_MouseMove (ปุ่ม ByVal As Integer, ByVal Shift As Integer, ByVal X เป็น Single, ByVal Y เป็นโสด) Dim maDate ณ วันที่ maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) หาก EstJourFerie (maDate) หรือ Paques (ปี (maDate)) = maDate จากนั้น Btn.ControlTipText = QuelFerie (maDate) End Sub 

ผู้จัดการวันหยุดนักขัตฤกษ์

ในโมดูลมาตรฐานที่สร้างไว้ก่อนหน้านี้เราจะเพิ่มสามฟังก์ชันเพื่อระบุวันหยุด

ฟังก์ชันที่ส่งคืนวันหยุดเป็นสตริง

 'แบบอักษรที่ซ้ำกันบนข้อความ "สตริง"' ใช้สำหรับข้อมูลและวัวที่เหลือรอด jours fériésฟังก์ชั่นสาธารณะ QuelFerie (Jour As Date) As String Dim maDate ณ วันที่ Dim a As Integer, m As Integer, j As Integer = Paques (ปี (Jour)) ถ้า Jour = maDate จากนั้น QuelFerie = "Dimanche de Pâques": ฟังก์ชั่น Exit หาก Jour = CDate (maDate + 1) QuelFerie = "Lundi de Pâques": ฟังก์ชันออกหาก Jour = CDD ( 50) QuelFerie = "Lundi de Pentecôte": ฟังก์ชั่น Exit หาก Jour = CDate (maDate + 39) QuelFerie = "Jeudi de l'ascension": ฟังก์ชันออก a = ปี (Jour): m = เดือน (Jour): j = วัน (Jour) เลือกเคส m * 100 + j Case 101 QuelFerie = "1er Janvier": ออกจากฟังก์ชัน Case 501 QuelFerie = "1er เชียงใหม่": Exit Function Case 508 QuelFerie = "8 เชียงใหม่": Exit Function Case 714 QuelFerie = " 14 Juillet ": ออกจากฟังก์ชัน Case 815 QuelFerie =" 15 Août ": ออกจากฟังก์ชัน Case 1101 QuelFerie =" 1er Novembre ": ออกจากฟังก์ชัน Case 1111 QuelFerie =" 11 Novembre ": ออกจากฟังก์ชัน 1225 QuelFerie =" No ": ออกจากฟังก์ชั่น End เลือก End Function 

ฟังก์ชั่นที่ระบุวันหยุดนักขัตฤกษ์

 'SOURCES:' //blog.developpez.com/philben/p11458/vba-access/sagit-il-dun-jour-ferie ฟังก์ชั่นสาธารณะ EstJourFerie (ByVal laDate As Date, ตัวเลือก ByVal EstPentecoteFerie As Boolean = True) As Boolean = True si la date passée en argument est un jour férié (en France) ou non: '101 = 1er Janvier - 501 = 1er เชียงใหม่ - 508 = 8 เชียงใหม่ - 714 = 14 Juillet' 815 = 15 อ่าว - 1101 = 1er Novembre - 1111 = 11 Novembre - 1225 = 25 Décembre 'dPa = Lundi de Pâques - dAs = Jeudi de l'Ascension - dPe = Lundi de Pentecôte' Remarque: Le lundi de Pentecôteไม่ได้เป็นคนโชคดี 'Philben - v1.0 - 2012 - ใช้ Annee แบบคงที่ฟรีในฐานะ Integer, dPa เป็น Date, dAs As Date, dPe As Date, bPe As Boolean Dim a As Integer, As Integer, j As Integer a = Year (laDate) : m = เดือน (laDate): j = วัน (laDate) เลือกกรณี m * 100 + j กรณี 101, 501, 508, 714, 815, 1101, 1111, 1225 EstJourFerie = กรณีจริง 323 ถึง 614 '323: วันที่มินิ Lundi de Pâques - 614: Dat e Maxi Lundi de Pentecôteถ้า Annee หรือ EstPentecoteFerie bPe Annee = a: dPa = Paques (a) + 1: dAs = dPa + 38 bPe = EstPentecoteFerie: ถ้า bPe แล้ว dPe = dPa + 49 Else dPe = 49 1 100 # End ถ้าเลือกวันที่กรณีซีเรียล (a, m, j): กรณี dPa, dAs, dPe: EstJourFerie = True: End เลือก End เลือก End Select End Function End 
บทความก่อนหน้านี้ บทความถัดไป

เคล็ดลับยอดนิยม