Özellik ikonu

MonthView

İndirme izni yok

Genel Bakış

MonthView (Microsoft MonthView Control 6.0), kullanıcıya aylık takvim görünümünden tek bir tarih ya da tarih aralığı seçtiren ActiveX denetimidir. Çalışma sayfasına veya UserForm üzerine eklenir; seçilen tarihi Value, SelStart ve SelEnd özellikleriyle VBA koduna verir. Tarihi elle yazdırmak yerine takvimden seçtirerek hatalı tarih girişini önler.

Denetimi ekleme ve gereksinimler​

MonthView, Excel'in kendi denetimi değil, Windows'taki MSCOMCT2.OCX dosyasında gelen bir ActiveX denetimidir. Bu yüzden bilgisayarda kayıtlı olması gerekir. 64 bit Office sürümlerinde bu dosya genellikle bulunmaz; denetim 32 bit Office'te sorunsuz çalışır.

Çalışma sayfasına eklemek için:
  • Geliştirici > Denetimler > Ekle > Diğer Denetimler (Developer > Controls > Insert > More Controls) komutunu seçin.
  • Listeden Microsoft MonthView Control 6.0 öğesini seçip sayfada bir alan çizin.
  • Denetim varsayılan olarak MonthView1 adını alır; adı Özellikler (Properties) penceresinden değiştirebilirsiniz.
  • Kod yazarken ya da özellik değiştirirken Tasarım Modu (Design Mode) açık olmalıdır; kullanmak için kapatın.
UserForm'a eklemek için: VBA düzenleyicisinde Araç Kutusu'na sağ tıklayıp Ek Denetimler (Additional Controls) seçeneğinden aynı denetimi işaretleyin. Geliştirici sekmesi görünmüyorsa Dosya > Seçenekler > Şeridi Özelleştir (File > Options > Customize Ribbon) bölümünden açın.

Önemli özellikler​

  • Value: Seçili tarihi okur ya da ayarlar. Tek seçimde kullanılır.
  • SelStart ve SelEnd: MultiSelect açıkken seçilen aralığın ilk ve son tarihidir.
  • MultiSelect: True olursa birden çok gün seçilebilir. Seçilebilecek en çok gün sayısını MaxSelCount belirler (varsayılan 7).
  • Day, Month, Year: Seçili tarihin gün, ay ve yıl bileşenleridir. DayOfWeek ve Week ise haftanın gününü ve hafta numarasını verir.
  • MinDate ve MaxDate: Seçilebilecek en erken ve en geç tarihi sınırlar.
  • StartOfWeek: Haftanın ilk gününü belirler; 1 Pazar, 2 Pazartesi, 3 Salı biçiminde devam eder.
  • ShowToday ve ShowWeekNumbers: Alttaki bugün satırını ve hafta numaralarını gösterir ya da gizler.
  • MonthRows ve MonthColumns: Aynı anda görünecek ay sayısını satır ve sütun olarak belirler.
  • DayBold: Belirli bir tarihi kalın gösterir; örneğin DayBold(tarih) = True.
  • MonthBackColor, TitleBackColor, TitleForeColor, TrailingForeColor: Takvimin renklerini ayarlar.

Önemli yöntemler ve olaylar​

Denetimin sık kullanılan yöntemleri Refresh (görünümü yeniler) ve SetFocus (odağı denetime verir) yöntemleridir. Tarihi değiştirmek için çoğunlukla Value özelliğine atama yapmanız yeterlidir.

Başlıca olaylar:
  • DateClick: Kullanıcı bir güne tıkladığında oluşur ve tıklanan tarihi verir.
  • DateDblClick: Bir güne çift tıklandığında oluşur.
  • SelChange: Seçim değiştiğinde oluşur; başlangıç ve bitiş tarihini verir, Cancel True yapılırsa değişiklik iptal edilir.
  • GetDayBold: Görünen aylar çizilirken hangi günlerin kalın olacağını belirlemeye yarar.
  • Click, DblClick, KeyDown, KeyPress: Genel fare ve klavye olaylarıdır.

Olay yordamı nereye yazılır ve söz dizimi​

Denetim çalışma sayfasındaysa olay yordamları o sayfanın kod modülüne, UserForm üzerindeyse UserForm modülüne yazılır; standart modülde çalışmaz. Yordam adı DenetimAdı_OlayAdı biçimindedir. Çift tıklayarak ya da kod penceresindeki açılır listelerden seçerek şablonu otomatik oluşturabilirsiniz.

VBA 3 satır
Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
Private Sub MonthView1_DateDblClick(ByVal DateDblClicked As Date)
Private Sub MonthView1_SelChange(ByVal StartDate As Date, ByVal EndDate As Date, Cancel As Boolean)
  • DateClicked: Tıklanan tarih; zorunlu, olay tarafından verilir.
  • StartDate, EndDate: Yeni seçimin ilk ve son günü; zorunlu, olay tarafından verilir.
  • Cancel: True atanırsa seçim değişikliği iptal edilir; varsayılanı False'tur.

1. Tıklanan tarihi hücreye yazma​

Çalışma sayfasına Geliştirici > Denetimler > Ekle > Diğer Denetimler ile MonthView1 adlı bir MonthView denetimi ekleyin. Aşağıdaki kodu bu sayfanın kod modülüne yapıştırın (sayfa sekmesine sağ tıklayıp Kod Görüntüle deyin). Sayfa açıldığında takvim bugüne ayarlanır; bir güne tıklandığında tarih B2 hücresine yazılır.
VBA 19 satır
Option Explicit

' Sayfa modulu: sayfada MonthView1 adli denetim bulunmalidir
Private Sub Worksheet_Activate()
    With Me.MonthView1
        .MultiSelect = False
        .ShowWeekNumbers = True
        .StartOfWeek = 2   ' 2 = Pazartesi
        .Value = Date
    End With
End Sub

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
    ' Tiklanan tarihi B2 hucresine yaz
    With Me.Range("B2")
        .Value = DateClicked
        .NumberFormat = "dd.mm.yyyy"
    End With
End Sub
MonthView
Formülünü incelemek için bir hücre seçin.
AB
1MüşteriRandevu Tarihi
2Ayşe Yılmaz
3Mehmet Demir18.03.2024
4Zeynep Kaya21.03.2024
Randevu ListesiExcelDepo v1.0.0
Bu örnek ActiveX denetimi gerektirdiği için burada çalıştırılmaz. Tasarım Modu kapalıyken takvimde bir güne tıkladığınızda DateClick olayı tetiklenir ve tıklanan tarih B2 hücresine tarih biçiminde yazılır. Me ifadesi kodun bulunduğu sayfayı temsil eder; böylece başka bir sayfa etkin olsa bile doğru sayfa güncellenir.

2. Tarihten gün adı, hafta no ve ay sonu bulma​

MonthView denetiminin Value özelliği Date türünde bir değer verir. Aşağıdaki kod, bu değerle yapılabilecek hesapları denetime ihtiyaç duymadan gösterir: gün adı, hafta numarası (Week özelliğinin verdiği bilgiye benzer), ayın son günü ve hafta sonu kontrolü. Kodu standart modüle yapıştırın ve TarihBilgisiYaz yordamını çalıştırın. GunAdi işlevi standart modülde Private olarak tanımlıysa denetimin DateClick olayından (sayfa ya da UserForm modülünden) çağrılamaz; bunun için işlevi Public olarak tanımlayın. Böylece işlevi DateClicked değeriyle de çağırabilirsiniz.
VBA 25 satır
Option Explicit

' Tarihin gun adini dondurur (Pazartesi = 1)
Private Function GunAdi(ByVal t As Date) As String
    GunAdi = Choose(Weekday(t, vbMonday), "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar")
End Function

Sub TarihBilgisiYaz()
    Dim ws As Worksheet
    Dim r As Long
    Dim t As Date

    Set ws = ActiveSheet
    For r = 2 To 7
        t = ws.Cells(r, 1).Value
        ws.Cells(r, 2).Value = GunAdi(t)
        ' Pazartesi baslangicli, ilk haftasi en az 4 gun olan hafta numarasi
        ws.Cells(r, 3).Value = DatePart("ww", t, vbMonday, vbFirstFourDays)
        ' Ayin son gunu: sonraki ayin 0. gunu
        ws.Cells(r, 4).Value = DateSerial(Year(t), Month(t) + 1, 0)
        ws.Cells(r, 4).NumberFormat = "dd.mm.yyyy"
        ' Cumartesi ve Pazar hafta sonudur
        ws.Cells(r, 5).Value = (Weekday(t, vbMonday) > 5)
    Next r
End Sub
MonthView
Formülünü incelemek için bir hücre seçin.
ABCDE
1TarihGün AdıHafta NoAy SonuHafta Sonu mu
215.03.2024Cuma1131.03.2024YANLIŞ
323.03.2024Cumartesi1231.03.2024DOĞRU
429.02.2024Perşembe929.02.2024YANLIŞ
531.12.2024Salı131.12.2024YANLIŞ
601.01.2025Çarşamba131.01.2025YANLIŞ
719.05.2025Pazartesi2131.05.2025YANLIŞ
Tarih BilgisiExcelDepo v1.0.0
A2 hücresindeki tarih için gün adı Cuma, hafta numarası 11, ay sonu 31.03.2024 ve hafta sonu bilgisi YANLIŞ olarak yazılır. Artık yıl günü olan A4 hücresinde ay sonu 29.02.2024 değerini alır; DateSerial ile ayın 0. günü isteyerek ayın son gününü bulmanın güvenli yoludur. A7 hücresindeki tarihin günü Pazartesi, hafta sonu bilgisi YANLIŞ olur.

3. Seçilen aralıktaki iş günlerini sayma​

MultiSelect özelliği True olan bir MonthView'da kullanıcı birden çok gün seçer; başlangıç ve bitiş tarihi SelStart ve SelEnd (ya da SelChange olayında StartDate ve EndDate) ile alınır. Aşağıdaki kod bu iki tarih arasındaki takvim ve iş günlerini hesaplayan işlevi içerir. Burada tarihler denetimden değil sayfadaki B ve C sütunlarından okunur; böylece kod denetim olmadan da çalışır. Kodu standart modüle yapıştırıp IzinGunleriniHesapla yordamını çalıştırın.
VBA 26 satır
Option Explicit

' Iki tarih arasindaki (sinirlar dahil) Pazartesi-Cuma gunlerini sayar
Private Function IsGunuSay(ByVal bas As Date, ByVal bit As Date) As Long
    Dim g As Date
    Dim n As Long
    For g = bas To bit
        If Weekday(g, vbMonday) <= 5 Then n = n + 1
    Next g
    IsGunuSay = n
End Function

Sub IzinGunleriniHesapla()
    Dim ws As Worksheet
    Dim r As Long
    Dim bas As Date
    Dim bit As Date

    Set ws = ActiveSheet
    For r = 2 To 5
        bas = ws.Cells(r, 2).Value   ' MonthView.SelStart karsiligi
        bit = ws.Cells(r, 3).Value   ' MonthView.SelEnd karsiligi
        ws.Cells(r, 4).Value = CLng(bit - bas) + 1
        ws.Cells(r, 5).Value = IsGunuSay(bas, bit)
    Next r
End Sub
MonthView
Formülünü incelemek için bir hücre seçin.
ABCDE
1PersonelBaşlangıçBitişTakvim Günüİş Günü
2Ayşe Yılmaz01.07.202412.07.20241210
3Mehmet Demir08.07.202410.07.202433
4Zeynep Kaya02.08.202419.08.20241812
5Can Özdemir27.09.202404.10.202486
İzin TalepleriExcelDepo v1.0.0
Ayşe Yılmaz için izin 12 takvim gününü kapsar ve bunun 10 günü iş günüdür. Zeynep Kaya'nın izni 18 takvim günü, 12 iş günüdür. Gerçek bir uygulamada IsGunuSay işlevini Private yerine Public olarak tanımlarsanız, SelChange olayında StartDate ve EndDate değerlerini bu işleve göndererek seçimi anında hesaplayabilirsiniz. Resmi tatiller bu hesaba dahil değildir.

Kullanırken dikkat edin​

  • 64 bit Office uyumsuzluğu: MSCOMCT2.OCX dosyası 64 bit Office'te bulunmaz; denetim listede görünmez ya da eklenen dosya açılırken hata verir. Dosyayı farklı bilgisayarlarda paylaşacaksanız alıcıların Office sürümünü kontrol edin. Bu durumda tarih seçimi için kendi takvim UserForm'unuzu hazırlamak daha güvenlidir.
  • Tasarım Modu ve olayların çalışmaması: Tasarım Modu açıkken olay yordamları çalışmaz. Kod beklendiği gibi tetiklenmiyorsa Tasarım Modu'nun kapalı olduğunu, yordam adındaki denetim adının doğru olduğunu ve kodun doğru modüle yazıldığını kontrol edin.
  • Tek ve çoklu seçimde farklı özellikler: MultiSelect kapalıyken tarihi Value ile okuyun. MultiSelect açıkken aralığı SelStart ve SelEnd ile alın; seçilebilecek gün sayısı MaxSelCount ile sınırlıdır (varsayılan 7). Daha uzun aralıkları seçtirmek istiyorsanız bu değeri artırın.
  • Tarihi hücreye yazarken biçim: Value, Date türünde bir değer verir; hücreye bu değeri yazdıktan sonra NumberFormat ile biçimi belirleyin. Tarihi metin olarak birleştirip yazarsanız Excel onu tarih olarak tanımayabilir ve sonraki hesaplar bozulur.
  • Dosya paylaşımı ve Mac: ActiveX denetimleri yalnızca Windows'ta çalışır; Mac için Excel bu denetimi desteklemez. Ayrıca güvenlik ayarları ActiveX içeriğini engelleyebilir; dosya açılırken denetimlerin etkinleştirilmesi gerekir. Dosyayı makro içerdiği için .xlsm olarak kaydedin.
  • İlgili konular:
    • DateTimePicker: Açılır liste biçiminde tek tarih seçtiren, aynı denetim ailesinden ActiveX denetimi.
    • UserForm ve Araç Kutusu: MonthView'u form üzerinde kullanmanın temeli.
    • Worksheet_Activate ve Worksheet_Change olayları: Sayfa düzeyindeki olay yordamları.
    • Weekday, DateSerial, DatePart: VBA tarih işlevleri.
    • TARİH, HAFTASAY, İŞGÜNÜ ve TAM_İŞGÜNÜ: Tarih hesapları için çalışma sayfası işlevleri.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
7
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst