VBA Excel [Semua versi] - Kawalan Kalendar

VBA Excel [Semua versi] - Kawalan Kalendar

Pengenalan

Kawalan kalendar VBA telah berubah antara Excel 2003 dan Excel 2010. Versi lama mempunyai kawalan yang dinamakan sebagai " Kalendar " dan untuk versi baru ia dipanggil " Pengesan DT ". Isu keserasian mungkin timbul apabila anda cuba menggunakan:
  • buku kerja dengan kawalan Kalendar pada versi Excel baru
  • buku kerja dengan Pemilih DT pada versi sebelumnya Excel.

Kebimbangan lain terletak pada versi Microsoft Office yang digunakan. Beberapa konfigurasi korporat tidak membenarkan akses kepada kawalan DT Picker. Untuk memulihkan ini, saya cadangkan anda membuat kawalan kalendar anda sendiri, menggunakan Userform.

The UserForm

UserForm akan mengandungi:
  • 29 dan 31 butang arahan untuk "Hari".
  • Label "Pilihan Bulan".
  • 2 butang ("") untuk menavigasi antara bulan-bulan.
  • Bulan dan tahun semasa akan dipaparkan dalam "Caption" (tajuk) UserForm.
  • Semua kawalan dalam UserForm ini akan dibuat secara dinamik.

Bermula

Buka editor VBA anda, buat UserForm baru dan ubah nama Nama kepada "Calendrier".

Salin kod di bawah dalam Modul UserForm:

 Option Explicit Private User UserForm_Initialize () Dim Obj As Control Dim i As Integer, Mois As Integer, Annee As Integer Dim Cl As Classe1 'Crementation Changement de mois' LABEL Set Collect = New Collection Set Obj = Me.Controls.Add ("forms Label.1 ") Dengan Obj. Nama =" LbChoixMois ".Object.Caption =" Choix du mois: ". Kiri = 5 .Top = 5 .Width = 70 .Height = 10 Akhir Dengan 'BOUTONS Set Obj = Me. Controls.Add ("forms.CommandButton.1") Dengan Obj.Name = "MoisPrec" .Object.Caption = "" .Left = 95 .Top = 1 .Width = 20 .Eight = 20 End Dengan Set Cl = Classe1 Baru Set Cl.Bouton = Obj Collect.Add Cl 'Création entête Jours de la semaine Untuk i = 1 To 7 Set Obj = Me.Controls.Add ("forms.Label.1") Dengan Obj.Name = "Jour" & i .Object.Caption = UCase (Kiri (Format (DateSerial (2014, 9, i), "dddd"), 1)) .Left = 20 * (i - 1) + 5 .Top = 25 .Width = = 10 Tamat dengan Seterusnya boutons 'jours' Mois = Bulan (Tarikh) MoisEnCours = Mois Annee = Tahun (Tarikh) AnneeEnCours = Annee CreationBoutonsJours Mois, Annee Jika Kiri (Format (Tarikh, "dd"), 1) = "0" Kemudian Me.Controls ("Bouton" & Format (Tarikh, "d")). SetFocus Element Me.Controls (", "dd")). SetFocus End Sub 

Buat butang

Bilangan hari berbeza dari satu bulan ke bulan yang lain, jadi kami akan membuat mereka secara dinamik. Untuk ini, prosedur yang kami perlukan:
  • Keluarkan butang lama
  • Buat butang baru berdasarkan bulan dan tahun.

Buat modul (Sisipkan> Modul) dan salin kod di bawah:

 Option Explicit Public WithEvents Bouton As MSForms.CommandButton Private Sub Bouton_Click () Select Case Bouton.Name Case "MoisPrec" MoisEnCours = MoisEnCours - 1 If MoisEnCours = 0 Then MoisEnCours = 12 AnneeEnCours = AnneeEnCours - 1 If AnneeEnCours = 1899 Then MoisEnCours = 1 AnneeEnCours = 1900 MsgBox "Tahun pertama: 1900" Akhir Jika Akhir Jika Kes "MoisSuiv" MoisEnCours = MoisEnCours + 1 Jika MoisEnCours = 13 Kemudian MoisEnCours = 1 AnneeEnCours = AnneeEnCours + 1 Akhir Jika Akhir Pilih CreationBoutonsJours MoisEnCours, AnneeEnCours End Sub 

Modul Kelas

Kita perlu membuat modul kelas untuk butang arahan berfungsi.

Untuk menavigasi antara bulan:

 Option Explicit Public WithEvents Btn As MSForms.CommandButton 'Procédure lors du clic sur un bouton "jour" Private Sub Btn_Click () Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag)' La ligne suivante détermine l'action à effectuer lors d'un clic sur le bouton 'Pour entrer la date choisie dans une cellule et fermer l'Userform:' ActiveCell.Value = maDate 'Unload Calendrier MsgBox maDate End Sub' Affiche le nom du jour férié au survol du bouton par la souris Private Sub Btn_MouseMove (ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) If EstJourFerie (maDate) Atau Paques (Tahun (maDate)) = maDate Kemudian Btn.ControlTipText = QuelFerie (maDate) Sub Akhir 

Modul kelas untuk hari-hari

 Option Explicit Public WithEvents Btn As MSForms.CommandButton 'Procédure lors du clic sur un bouton "jour" Private Sub Btn_Click () Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag)' La ligne suivante détermine l'action à effectuer lors d'un clic sur le bouton 'Pour entrer la date choisie dans une cellule et fermer l'Userform:' ActiveCell.Value = maDate 'Unload Calendrier MsgBox maDate End Sub' Affiche le nom du jour férié au survol du bouton par la souris Private Sub Btn_MouseMove (ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) If EstJourFerie (maDate) Atau Paques (Tahun (maDate)) = maDate Kemudian Btn.ControlTipText = QuelFerie (maDate) Sub Akhir 

Menguruskan cuti umum

Dalam modul standard yang dibuat sebelum ini, kami akan menambah tiga fungsi untuk mengenal pasti cuti.

Fungsi yang mengembalikan cuti sebagai rentetan

 'Fonction qui retourne le jour férié en "String"' utile pour info-bulles au survol des jours fériés Public Function QuelFerie (Jour As Date) As String Dim date As Date Dim a As Integer, m As Integer, j As Integer maDate = Paques (Year (Jour)) Jika Jour = maDate Kemudian QuelFerie = "Dimanche de Pâques": Keluar Fungsi Jika Jour = CDate (maDate + 1) Kemudian QuelFerie = "Lundi de Pâques" QuelFerie = "Lundi de Pentecôte": Keluar Fungsi Jika Jour = CDate (maDate + 39) Kemudian QuelFerie = "Jeudi de l'ascension": Keluar Fungsi a = Tahun (Jour): m = = Hari (Jour) Pilih Kes m * 100 + j Kasus 101 QuelFerie = "1er Janvier": Keluar Fungsi Kes 501 QuelFerie = "1er Mai": Keluar Fungsi Kes 508 QuelFerie = "8 Mai": Keluar Fungsi Kes 714 QuelFerie = " 14 Juillet ": Keluar Fungsi Fungsi 815 QuelFerie =" 15 Août ": Keluar Fungsi Kes 1101 QuelFerie =" 1er Novembre ": Keluar Fungsi Kes 1111 QuelFerie =" 11 Novembre ": Keluar Fungsi Kes 1225 QuelFerie =" Noël ": Keluar Fungsi Akhir Pilih Fungsi Akhir 

Fungsi yang mengenal pasti cuti umum

 'SUMBER:' //blog.developpez.com/philben/p11458/vba-access/sagit-il-dun-jour-ferie EstJourFerie Fungsi Awam (ByVal laDate As Date, Option ByVal EstPentecoteFerie As Boolean = True) Sebagai Boolean 'Détermine 'la date passée en argument est un jour férié (en France) ou non:' 101 = 1er Janvier - 501 = 1er Mai - 508 = 8 Mai - 714 = 14 Juillet '815 = 15 Août - 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 est un jour férié mais parfois non chômé (EstPentecoteFerie = False dans ce ce cas) 'Philben - v1.0 - 2012 - Percuma untuk menggunakan Statik Annee Sebagai Integer, dPa As Date, dAs As Date, dPe As Date, bPe As Boolean Dim a As Integer, m As Integer, j As Integer a = Year (laDate) : m = Bulan (laDate): j = Hari (laDate) Pilih Kes m * 100 + j Kasus 101, 501, 508, 714, 815, 1101, 1111, 1225 EstJourFerie = Kes Benar 323 ke 614 ' de Pâques - 614: Dat dan maksimum Lunde Pentecôte Jika Annee atau EstPentecoteFerie bPe Kemudian Annee = a: dPa = Paques (a) + 1: dAs = dPa + 38 bPe = EstPentecoteFerie: Jika bPe Kemudian dPe = dPa + 49 Lain dPe = # 1 / 100 # Akhir Jika Pilih Kes Tarikh Tarikh (a, m, j): Kes dPa, dAs, dPe: EstJourFerie = Benar: Akhir Pilih Akhir Pilih Fungsi Akhir 
Artikel Sebelumnya Artikel Seterusnya

Tip-Tip Utama