Özellik ikonu

Module

İndirme izni yok

Genel Bakış

Module (Modül), VBA kodunun (Sub, Function ve bildirimler) saklandığı kapsayıcıdır; her çalışma kitabının VBA projesi bir ya da daha fazla modülden oluşur. Kodu mantıklı gruplara bölmenizi, değişkenlerin ve yordamların görünürlüğünü (kapsamını) denetlemenizi ve aynı kodu farklı yerlerden çağırmanızı sağlar. Makro kaydettiğinizde Excel de kodu otomatik olarak bir standart modüle yazar.

Modül nedir ve nerede bulunur​

Modüller Visual Basic Düzenleyicisi'nde (VBE) görünür. Düzenleyiciyi açmak için Alt+F11 tuşlarını ya da Geliştirici > Visual Basic (Developer > Visual Basic) komutunu kullanın. Sol taraftaki Proje Penceresi'nde (Project Explorer) her çalışma kitabı için Microsoft Excel Nesneleri, Formlar ve Modüller klasörleri yer alır.

Bir modül iki bölümden oluşur:
  • Bildirim bölümü (Declarations): dosyanın en üstüdür; Option deyimleri, modül düzeyindeki değişkenler ve sabitler burada yazılır.
  • Yordamlar: bildirim bölümünün altında yer alan Sub, Function ve Property yordamlarıdır.
Bildirim bölümündeki satırlar ilk yordamdan önce yazılmalıdır; yordamın içine ya da altına yazılan Option deyimi derleme hatası verir.

Modül türleri​

VBA'da beş tür modülle karşılaşırsınız:
  • Standart modül (Module): Ekle > Modül (Insert > Module) ile eklenir. Genel amaçlı makrolar, kullanıcı tanımlı işlevler ve ortak değişkenler burada tutulur. Bu sayfanın asıl konusu budur.
  • Sınıf modülü (Class Module): Ekle > Sınıf Modülü (Insert > Class Module) ile eklenir; kendi nesne türlerinizi tanımlamak için kullanılır.
  • Sayfa modülü: her çalışma sayfasına ait koddur; Worksheet_Change gibi sayfa olayları burada yazılır.
  • ThisWorkbook modülü: çalışma kitabı olayları (Workbook_Open gibi) burada yazılır.
  • UserForm modülü: bir kullanıcı formunun ve üzerindeki denetimlerin olay kodlarını içerir.
Standart modül yeni eklendiğinde Modül1, Modül2 gibi bir ad alır. Adı değiştirmek için modülü seçip F4 ile Özellikler Penceresi'ni (Properties Window) açın ve (Name) satırına yeni adı yazın; örneğin modHesap. Anlamlı adlar, kodu bulmayı ve modül adıyla çağırmayı kolaylaştırır.

Kapsam, Option deyimleri ve çağırma​

Bir modüldeki yordam ve değişkenlerin kim tarafından görülebileceğini Public ve Private anahtar sözcükleri belirler:
  • Public: projedeki tüm modüllerden erişilir. Yordamlarda hiçbir şey yazmazsanız varsayılan budur; Public makrolar Alt+F8 makro listesinde görünür.
  • Private: yalnız aynı modülün içinden erişilir ve makro listesinde görünmez. Yardımcı yordamlar için uygundur.
  • Dim (bildirim bölümünde): Private ile aynı etkiyi verir; değişken modüldeki tüm yordamlarca paylaşılır ve değeri yordamlar arasında korunur.
Modül düzeyinde sık kullanılan Option deyimleri:
  • Option Explicit: her değişkenin Dim ile bildirilmesini zorunlu kılar; yazım hatalarını derleme aşamasında yakalar.
  • Option Compare Text: bu modüldeki metin karşılaştırmalarını büyük ve küçük harf ayrımı yapmadan gerçekleştirir. Varsayılan Option Compare Binary ayrım yapar.
  • Option Private Module: modüldeki Public yordamları projenin dışına ve makro listesine kapatır.
  • Option Base 1: dizilerin varsayılan alt sınırını 1 yapar.
Başka modüldeki bir yordamı çağırırken adın başına modül adını ekleyebilirsiniz. Aynı adı taşıyan yordamlar farklı modüllerde varsa bu yazım belirsizliği önler:

VBA 2 satır
Call modHesap.TutarlariHesapla
modHesap.TutarlariHesapla
İki modülde aynı ada sahip Public yordam olması hata değildir, ancak modül adı olmadan çağrıda hangisinin çalışacağı belirsiz kalır; bu nedenle modül adıyla çağırın.

1. Private sabit ve yardımcı işlev kullanan standart modül​

Sipariş listesinde adet ve birim fiyat var. KDV oranı modülün en üstünde Private Const olarak tutulur; hesabı Private Function yapar ve Public Sub sonucu D sütununa yazar. Kodu Ekle > Modül ile eklediğiniz standart modüle yapıştırın.
VBA 21 satır
Option Explicit

' Modül düzeyinde sabit: yalnız bu modülden görünür
Private Const KDV_ORANI As Double = 0.2

' Yardımcı işlev: makro listesinde görünmez
Private Function KdvliTutar(adet As Double, fiyat As Double) As Double
    KdvliTutar = adet * fiyat * (1 + KDV_ORANI)
End Function

' Ana makro: Alt+F8 listesinde görünür
Public Sub TutarlariHesapla()
    Dim ws As Worksheet
    Dim son As Long, i As Long
    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 2 To son
        ws.Cells(i, 4).Value = KdvliTutar(CDbl(ws.Cells(i, 2).Value), CDbl(ws.Cells(i, 3).Value))
        ws.Cells(i, 4).NumberFormat = "#,##0.00"
    Next i
End Sub
Module
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünAdetBirim FiyatKDV'li Tutar
2Defter1025,50306,00
3Kalem504,75285,00
4Silgi203,0072,00
5Ataç1001,20144,00
6Dosya1512,90232,20
Sipariş ListesiExcelDepo v1.0.0
Makro her satır için KdvliTutar işlevini çağırır ve sonucu D sütununa yazar; Defter satırının KDV'li tutarı 306,00, Kalem satırınınki 285,00 olur. KDV_ORANI sabiti Private olduğundan başka modüller onu göremez; oranı değiştirmek için yalnız modülün en üstündeki satırı düzenlemeniz yeterlidir.

2. Option Compare Text ile harf duyarsız karşılaştırma​

A ve B sütunlarındaki iki liste karşılaştırılır. Modülün başındaki Option Compare Text satırı, bu modüldeki = karşılaştırmasını büyük ve küçük harf ayrımı yapmayan hale getirir. Kodu standart bir modüle yapıştırın.
VBA 17 satır
Option Compare Text
Option Explicit

' Bu modüldeki metin karşılaştırmaları harf duyarsızdır
Public Sub KarsilastirYaz()
    Dim ws As Worksheet
    Dim son As Long, i As Long
    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 2 To son
        If ws.Cells(i, 1).Value = ws.Cells(i, 2).Value Then
            ws.Cells(i, 3).Value = "Eşit"
        Else
            ws.Cells(i, 3).Value = "Farklı"
        End If
    Next i
End Sub
Module
Formülünü incelemek için bir hücre seçin.
ABC
1Kayıt 1Kayıt 2Sonuç
2DefterDEFTEREşit
3KalemkalemEşit
4SilgiSilgiEşit
5CetvelMakasFarklı
6DosyadOSYAEşit
KarşılaştırmaExcelDepo v1.0.0
Defter ile DEFTER harf farkına rağmen eşleştiği için C2 hücresinde Eşit, Kalem ile kalem için C3 hücresinde Eşit yazar. Cetvel ile Makas gerçekten farklı olduğundan C5 hücresi Farklı değerini alır. Option Compare Text satırını silip makroyu yeniden çalıştırırsanız harf farkı olan satırlar Farklı çıkar.

3. Modül düzeyi değişkenle yordamlar arası değer taşıma​

Aylık satışların kümülatif toplamı hesaplanır. Toplam, bildirim bölümünde tanımlanan Private değişkende tutulur; Sub yordamları aynı değişkeni paylaşır. Kodu standart bir modüle yapıştırın.
VBA 22 satır
Option Explicit

' Modül düzeyinde değişken: modüldeki tüm yordamlar paylaşır
Private mToplam As Long

' Değişkene ekleme yapan yardımcı yordam
Private Sub Ekle(tutar As Long)
    mToplam = mToplam + tutar
End Sub

Public Sub KumulatifYaz()
    Dim ws As Worksheet
    Dim son As Long, i As Long
    Set ws = ActiveSheet
    son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    mToplam = 0                      ' her çalıştırmada sıfırla
    For i = 2 To son
        Ekle CLng(ws.Cells(i, 2).Value)
        ws.Cells(i, 3).Value = mToplam
        ws.Cells(i, 3).NumberFormat = "#,##0"
    Next i
End Sub
Module
Formülünü incelemek için bir hücre seçin.
ABC
1AySatışKümülatif
2Ocak12.50012.500
3Şubat9.80022.300
4Mart15.20037.500
5Nisan11.30048.800
6Mayıs14.70063.500
Aylık SatışExcelDepo v1.0.0
Ekle yordamı her çağrıldığında mToplam değişkeni artar ve değeri çağrılar arasında korunur; bu yüzden C2 hücresinde 12.500, C3 hücresinde 22.300, son satırda ise 63.500 görünür. Aynı değişkeni yordamın içinde Dim ile tanımlasaydınız her çağrıda sıfırlanırdı. Değişken yalnız modül açık olduğu sürece değerini korur; kod sıfırlanırsa (End ya da derleme hatası) değer kaybolur, bu yüzden makro başında mToplam değişkenine 0 atanmıştır.

Kullanırken dikkat edin​

  • Kodu doğru modüle yazın: Olay yordamları (Worksheet_Change, Workbook_Open) yalnızca ilgili sayfa ya da ThisWorkbook modülünde çalışır; standart modüle yazarsanız olay tetiklenmez. Genel makroları ise standart modüle yazın.
  • Option Explicit alışkanlığı edinin: VBE'de Araçlar > Seçenekler > Değişkenleri Bildirmeyi Gerektir (Tools > Options > Require Variable Declaration) seçeneğini işaretlerseniz yeni her modülün başına Option Explicit otomatik eklenir. Yazım hatalarından kaynaklanan gizli hataları önler.
  • Option deyimleri yordamdan önce gelir: Option Explicit, Option Compare Text gibi deyimler modülün en üstünde, ilk Sub ya da Function satırından önce yazılmalıdır. Aksi halde Geçersiz yordam içi (Invalid inside procedure) hatası alırsınız. Bu deyimler yalnız bulunduğu modülü etkiler.
  • Private yordamlar makro listesinde görünmez: Private Sub ya da Option Private Module içindeki yordamlar Alt+F8 listesinde çıkmaz ve düğmeye atanamayabilir. Düğmeden çalıştıracağınız makroları Public bırakın, yardımcıları Private yapın.
  • Modül adı ile yordam adı çakışmasın: Bir modüle verdiğiniz ad, içindeki yordamla ya da değişkenle aynı olmamalıdır; belirsiz başvuru hatalarına yol açar. Modül adlarında boşluk ve Türkçe karakter kullanmamak da güvenlidir.
  • Modülleri dışa aktarma ve yedekleme: Modülü sağ tıklayıp Dosyayı Dışa Aktar (Export File) dersiniz; standart modüller .bas, sınıf modülleri .cls, formlar .frm uzantısıyla kaydedilir. Kodu başka bir kitaba taşımak için Dosya Al (Import File) kullanılır. Makro içerdiği için kitabı .xlsm olarak kaydetmeyi unutmayın; .xlsx biçimi modülleri saklamaz.
  • İlgili konular:
    • Sub ve Function yordamları
    • Public, Private ve Dim bildirimleri
    • Option Explicit ve Option Compare deyimleri
    • Class Module (Sınıf Modülü)
    • ThisWorkbook ve Worksheet nesneleri ile olay yordamları
    • UserForm nesnesi
    • Geliştirici sekmesi, Visual Basic Düzenleyicisi ve makro güvenliği ayarları
Ö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
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst