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.
Çalışma sayfasına eklemek için:
Başlıca olaylar:
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.
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.
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.
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.
Ö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.| A | B | |
|---|---|---|
| 1 | Müşteri | Randevu Tarihi |
| 2 | Ayşe Yılmaz | |
| 3 | Mehmet Demir | 18.03.2024 |
| 4 | Zeynep Kaya | 21.03.2024 |
Randevu ListesiExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Tarih | Gün Adı | Hafta No | Ay Sonu | Hafta Sonu mu |
| 2 | 15.03.2024 | Cuma | 11 | 31.03.2024 | YANLIŞ |
| 3 | 23.03.2024 | Cumartesi | 12 | 31.03.2024 | DOĞRU |
| 4 | 29.02.2024 | Perşembe | 9 | 29.02.2024 | YANLIŞ |
| 5 | 31.12.2024 | Salı | 1 | 31.12.2024 | YANLIŞ |
| 6 | 01.01.2025 | Çarşamba | 1 | 31.01.2025 | YANLIŞ |
| 7 | 19.05.2025 | Pazartesi | 21 | 31.05.2025 | YANLIŞ |
Tarih BilgisiExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Personel | Başlangıç | Bitiş | Takvim Günü | İş Günü |
| 2 | Ayşe Yılmaz | 01.07.2024 | 12.07.2024 | 12 | 10 |
| 3 | Mehmet Demir | 08.07.2024 | 10.07.2024 | 3 | 3 |
| 4 | Zeynep Kaya | 02.08.2024 | 19.08.2024 | 18 | 12 |
| 5 | Can Özdemir | 27.09.2024 | 04.10.2024 | 8 | 6 |
İzin TalepleriExcelDepo v1.0.0
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.