Genel Bakış
MultiPage (Çok Sayfalı Denetim), UserForm üzerine yerleştirilen ve birden çok sayfayı (sekmeyi) tek bir denetim içinde toplayan ActiveX denetimidir. Her sayfanın kendi denetim alanı vardır; bu sayede çok alanlı formları kişisel bilgiler, iş bilgileri, notlar gibi mantıklı bölümlere ayırabilirsiniz. Sekmeler arasındaki geçiş kullanıcı tıklamasıyla ya da kodla yapılır.
Sayfa eklemek, silmek, yeniden adlandırmak ya da taşımak için sekme başlığına sağ tıklayın ve Yeni Sayfa (New Page), Sil (Delete), Yeniden Adlandır (Rename) ya da Taşı (Move) komutunu kullanın. Bir sayfanın içine denetim koymak için önce o sekmeyi seçin, sonra araç kutusundan denetimi sayfa alanına bırakın. Sayfaya konan denetimler o sayfaya aittir; başka bir sekmeye geçildiğinde görünmez olurlar.
MultiPage ile TabStrip karıştırılmamalıdır: TabStrip yalnızca sekme şeridi sunar ve denetimler formda ortak durur; MultiPage'de ise her sekmenin kendine ait denetim kümesi vardır.
Pages.Add parametreleri:
İlk sekme olan Kişisel Bilgiler için dizin 0 olur ve ifade MultiPage1.Pages(0).Caption biçimindedir. Son sekme olan Notlar için dizin 4 değerini alır; bu sekmeye geçmek için MultiPage1.Value = 4 ataması yeterlidir. Sekme sayısı n ise geçerli dizinler 0 ile n eksi 1 arasındadır.
Form açıldığında Initialize olayı sekme başlıklarını ayarlar ve üçüncü sayfa olan Notlar'ı çalışma anında ekler. Kaydet düğmesine basıldığında ilk iki sekmedeki ad, departman ve şehir bilgileri listenin ilk boş satırına yazılır; Notlar sekmesindeki metin kutusunun içeriği kaydedilmez. Ardından form temizlenir ve ilk sekmeye dönülür. Formu açmak için standart modülde frmPersonel.Show komutunu kullanabilirsiniz; UserForm gösterildiği için bu örnek burada çalıştırılmamıştır.
Form açıldığında kod yalnızca ikinci sekmeyi kapatır; ilk ve üçüncü sekmeler kullanılabilir durumdadır. txtAd alanına metin yazıldığında ikinci sekme etkinleşir; her sekme değişiminde Change olayı form başlığındaki adım numarasını günceller. İleri düğmesi sekmeleri sırayla açar ve sıradaki sekme etkin değilse geçişi engelleyerek uyarı verir. Bu örnek MsgBox ve UserForm kullandığı için çalıştırılmamıştır; formu standart modülden frmBasvuru.Show komutuyla açabilirsiniz.
MultiPage nedir ve forma nasıl eklenir
MultiPage yalnızca UserForm üzerinde kullanılır; çalışma sayfasına eklenen bir denetim değildir. Visual Basic Düzenleyicisi'nde (VBE) bir UserForm açın, Görünüm > Araç Kutusu (View > Toolbox) ile araç kutusunu görüntüleyin ve MultiPage simgesini form üzerine sürükleyin. Varsayılan olarak adı MultiPage1 olan ve iki sayfa (Page1, Page2) içeren bir denetim oluşur.Sayfa eklemek, silmek, yeniden adlandırmak ya da taşımak için sekme başlığına sağ tıklayın ve Yeni Sayfa (New Page), Sil (Delete), Yeniden Adlandır (Rename) ya da Taşı (Move) komutunu kullanın. Bir sayfanın içine denetim koymak için önce o sekmeyi seçin, sonra araç kutusundan denetimi sayfa alanına bırakın. Sayfaya konan denetimler o sayfaya aittir; başka bir sekmeye geçildiğinde görünmez olurlar.
MultiPage ile TabStrip karıştırılmamalıdır: TabStrip yalnızca sekme şeridi sunar ve denetimler formda ortak durur; MultiPage'de ise her sekmenin kendine ait denetim kümesi vardır.
Temel kullanım ve söz dizimi
Sayfalara iki yoldan erişilir: Pages koleksiyonunun dizini (0'dan başlar) ya da sayfanın adı. Etkin sayfa Value özelliğiyle okunur veya değiştirilir; bu değer de 0'dan başlayan sayfa dizinidir. Yeni sayfa Pages.Add yöntemiyle eklenir.
VBA
4 satır
MultiPage1.Value = 1
MultiPage1.Pages(0).Caption = "Kişisel Bilgiler"
Set pg = MultiPage1.Pages.Add(Name, Caption, Index)
MultiPage1.Pages.Remove 2
- Name: yeni sayfanın nesne adı; isteğe bağlıdır, verilmezse Excel otomatik ad üretir.
- Caption: sekmede görünen başlık; isteğe bağlıdır, varsayılanı otomatik üretilen addır.
- Index: sayfanın ekleneceği sıra (0 tabanlı); isteğe bağlıdır, verilmezse sayfa sona eklenir.
Önemli özellikler
- Value: etkin sayfanın dizini; 0 ilk sayfadır. Geçerli aralık 0 ile Pages.Count eksi 1 arasındadır.
- Pages: sayfaları içeren koleksiyon; Count, Add, Remove, Clear ve Item üyeleri vardır.
- Style: görünüm biçimi. fmTabStyleTabs (0) klasik sekme, fmTabStyleButtons (1) düğme görünümlü sekme, fmTabStyleNone (2) sekme şeridi hiç gösterilmez; sayfa geçişini yalnızca kodla yaptığınız sihirbaz tarzı formlarda kullanışlıdır.
- TabOrientation: sekmelerin konumu. fmTabOrientationTop (0) üst, fmTabOrientationBottom (1) alt, fmTabOrientationLeft (2) sol, fmTabOrientationRight (3) sağ.
- MultiRow: True ise sığmayan sekmeler birden çok satıra dizilir; False ise kaydırma düğmeleri çıkar.
- TabFixedWidth ve TabFixedHeight: sekme genişliğini ve yüksekliğini sabitler; 0 değeri otomatik boyut anlamına gelir.
- Enabled ve Visible: denetimin tamamını etkinleştirir veya gizler.
- Caption: sekme başlığı.
- Name: sayfanın kodda kullanılan adı.
- Index: sayfanın sıra numarası.
- Enabled: False ise sekme soluk görünür ve seçilemez.
- Visible: False ise sekme şeritte gösterilmez.
- Controls: sayfadaki denetimler koleksiyonu.
- ControlTipText: sekmenin üzerine gelindiğinde görünen ipucu.
- ScrollBars ve Zoom: sayfa içi kaydırma çubukları ve yakınlaştırma.
Önemli yöntemler ve olaylar
Olaylar UserForm'un kod modülünde, MultiPage'in adıyla (örneğin MultiPage1_Change) yazılır. VBE'de kod penceresinin sol üst listesinden MultiPage1 denetimini, sağ listesinden olayı seçerek yordam iskeletini otomatik oluşturabilirsiniz.- Change: etkin sayfa değiştiğinde çalışır; hem kullanıcı tıklaması hem de koddan yapılan Value ataması tetikler. Adım göstergesi güncellemek ya da sayfa geçişinde doğrulama yapmak için en uygun olaydır.
- Click: denetime tıklandığında çalışır.
- Enter ve Exit: denetime odak girdiğinde ve çıktığında çalışır.
- AddControl ve RemoveControl: bir sayfaya denetim eklendiğinde ya da çıkarıldığında çalışır.
- Pages.Add ve Pages.Remove: çalışma anında sekme eklemek ve silmek için kullanılan yöntemlerdir.
- Controls.Add: bir sayfaya kodla denetim ekler; ProgID (örneğin Forms.TextBox.1) ve isteğe bağlı ad parametresi alır.
1. Sekme dizinlerini ve erişim ifadelerini sayfaya yazma
MultiPage sayfaları 0'dan başlayarak numaralanır. Aşağıdaki makro, sayfadaki sekme başlıklarının her biri için karşılık gelen Value dizinini ve Pages ile erişim ifadesini yazar; böylece dizin mantığını sayfada görebilirsiniz. Kodu standart modüle yapıştırın ve Sekme Dizini sayfası etkinken çalıştırın.
VBA
15 satır
Option Explicit
Sub SekmeIndeksleriniYaz()
Dim ws As Worksheet
Dim r As Long
Set ws = ActiveSheet
' 2. satırdaki ilk sekme dizin 0'a karşılık gelir
For r = 2 To 6
ws.Cells(r, 2).Value = r - 2
ws.Cells(r, 3).Value = "MultiPage1.Pages(" & (r - 2) & ").Caption"
ws.Cells(r, 4).Value = "MultiPage1.Value = " & (r - 2)
Next r
End Sub
MultiPage
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Sekme Başlığı | Value Dizini | Erişim İfadesi | Sayfaya Geçiş |
| 2 | Kişisel Bilgiler | 0 | MultiPage1.Pages(0).Caption | MultiPage1.Value = 0 |
| 3 | İş Bilgileri | 1 | MultiPage1.Pages(1).Caption | MultiPage1.Value = 1 |
| 4 | İletişim | 2 | MultiPage1.Pages(2).Caption | MultiPage1.Value = 2 |
| 5 | Eğitim | 3 | MultiPage1.Pages(3).Caption | MultiPage1.Value = 3 |
| 6 | Notlar | 4 | MultiPage1.Pages(4).Caption | MultiPage1.Value = 4 |
Sekme DiziniExcelDepo v1.0.0
2. Sekmeleri kodla düzenleme ve verileri sayfaya kaydetme
frmPersonel adlı bir UserForm oluşturun ve üzerine MultiPage1 denetimini ekleyin. İlk sayfaya txtAd ve txtSehir adlı iki TextBox, ikinci sayfaya txtDepartman adlı bir TextBox koyun; sayfaların dışına cmdKaydet adlı bir CommandButton yerleştirin. Aşağıdaki kodu bu UserForm'un kod modülüne (forma çift tıklayarak) yapıştırın. Form, Personel sayfasındaki listenin altına yeni kayıt ekler.
VBA
46 satır
Option Explicit
Private Sub UserForm_Initialize()
Dim pg As MSForms.Page
Dim tb As MSForms.TextBox
With Me.MultiPage1
.Style = fmTabStyleTabs
.TabOrientation = fmTabOrientationTop
.Pages(0).Caption = "Kişisel Bilgiler"
.Pages(1).Caption = "İş Bilgileri"
' Üçüncü sayfayı kodla ekle
Set pg = .Pages.Add("pgNot", "Notlar")
' Yeni sayfaya çok satırlı bir metin kutusu ekle
Set tb = pg.Controls.Add("Forms.TextBox.1", "txtNot", True)
tb.Left = 12
tb.Top = 12
tb.Width = 200
tb.Height = 60
tb.MultiLine = True
.Value = 0 ' ilk sekme açık başlasın
End With
End Sub
Private Sub cmdKaydet_Click()
Dim ws As Worksheet
Dim yeniSatir As Long
Set ws = ThisWorkbook.Worksheets("Personel")
yeniSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
' Farklı sayfalardaki denetimlere doğrudan adıyla erişilir
ws.Cells(yeniSatir, 1).Value = Me.txtAd.Value
ws.Cells(yeniSatir, 2).Value = Me.txtDepartman.Value
ws.Cells(yeniSatir, 3).Value = Me.txtSehir.Value
' Formu temizle ve ilk sekmeye dön
Me.txtAd.Value = ""
Me.txtDepartman.Value = ""
Me.txtSehir.Value = ""
Me.MultiPage1.Value = 0
Me.txtAd.SetFocus
End Sub
MultiPage
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ad Soyad | Departman | Şehir |
| 2 | Ayşe Yılmaz | Muhasebe | Ankara |
| 3 | Mehmet Demir | Satış | İzmir |
| 4 | Zeynep Kaya | İnsan Kaynakları | Bursa |
PersonelExcelDepo v1.0.0
3. Adım adım ilerleyen sekmeli başvuru formu
frmBasvuru adlı bir UserForm'a üç sayfalı MultiPage1, ilk sayfaya txtAd adlı TextBox, sayfaların dışına cmdIleri adlı bir CommandButton ekleyin. Kod, ad girilmeden ikinci sekmeyi kapalı tutar, sekme değiştikçe form başlığına adım numarasını yazar ve İleri düğmesiyle sıradaki sekmeye geçer. Kodu UserForm'un kod modülüne yapıştırın.
VBA
34 satır
Option Explicit
Private Sub UserForm_Initialize()
Me.MultiPage1.Value = 0
' Ad girilene kadar ikinci sekme kapalı kalsın
Me.MultiPage1.Pages(1).Enabled = False
Call AdimBasliginiGuncelle
End Sub
Private Sub txtAd_Change()
' Ad doluysa ikinci sekmeyi etkinleştir
Me.MultiPage1.Pages(1).Enabled = (Len(Trim(Me.txtAd.Value)) > 0)
End Sub
Private Sub MultiPage1_Change()
Call AdimBasliginiGuncelle
End Sub
Private Sub cmdIleri_Click()
With Me.MultiPage1
' Son sayfadaysak ilerleme; sıradaki sayfa kapalıysa da geçme
If .Value < .Pages.Count - 1 Then
If .Pages(.Value + 1).Enabled Then
.Value = .Value + 1
Else
MsgBox "Önce ad soyad alanını doldurun.", vbExclamation
End If
End If
End With
End Sub
Private Sub AdimBasliginiGuncelle()
Me.Caption = "Adım " & (Me.MultiPage1.Value + 1) & " / " & Me.MultiPage1.Pages.Count
End Sub
MultiPage
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ad Soyad | Birim | Başvuru Tarihi |
| 2 | Elif Aydın | Pazarlama | 04.03.2024 |
| 3 | Can Öztürk | Lojistik | 11.03.2024 |
| 4 | Selin Şahin | Finans | 18.03.2024 |
BaşvurularExcelDepo v1.0.0
Kullanırken dikkat edin
- Dizin 0'dan başlar: Hem Value özelliği hem de Pages koleksiyonu 0 tabanlıdır. İlk sekme için 1 yazmak ikinci sekmeye gider; Pages.Count değerine eşit bir dizin ise hata verir. Son sekme her zaman Pages.Count eksi 1 dizinindedir.
- Sayfa silinince dizinler kayar: Pages.Remove ile bir sayfa silindiğinde sonraki sayfaların dizinleri bir azalır. Birden çok sayfa silecekseniz sondan başa doğru ilerleyin ya da dizin yerine sayfa adını kullanın.
- Sekmeler arası gezinirken denetim başvurusu: Bir sayfadaki denetime formun kodundan Me ile adıyla ulaşılır; ancak çalışma anında Controls.Add ile eklenen denetimlere derleme sırasında Me.txtNot biçiminde erişemezsiniz. Bu denetimlere Pages(...).Controls("ad") üzerinden başvurun.
- Value atamasının Change olayını tetiklemesi: Kodla Value değerini değiştirdiğinizde Change olayı da çalışır. Olayın içinde yine Value ataması yaparsanız istenmeyen yinelemeli çağrılar oluşabilir; gerekirse bir Boolean bayrakla kontrol edin.
- Style özelliği None iken: Style özelliğini fmTabStyleNone yaparsanız kullanıcı sekmeleri göremez ve sayfalar arasında yalnızca sizin koyduğunuz düğmelerle gezinebilir. Bu durumda Value atamasını yapan İleri ve Geri düğmelerini eklemeyi unutmayın.
- Birden çok sekme ve form boyutu: Çok sayıda sekme formun genişliğine sığmazsa MultiRow özelliğini True yapın ya da TabFixedWidth ile sekme genişliğini küçültün. Sayfa içeriği sayfa alanından büyükse sayfanın ScrollBars özelliğiyle kaydırma çubuğu ekleyebilirsiniz.
- Kodun yeri: MultiPage olayları çalışma sayfası ya da ThisWorkbook modülüne değil, denetimin bulunduğu UserForm'un kod modülüne yazılır. Formu açan Show komutu ise standart modülde olmalıdır.
- İlgili konular: UserForm, TabStrip, Frame, TextBox, ComboBox, ListBox, CommandButton, Initialize olayı, Controls koleksiyonu, Show ve Unload yöntemleri, Me anahtar sözcüğü.