Özellik ikonu

Call

İndirme izni yok

Genel Bakış

Call (Çağır), VBA'da başka bir Sub ya da Function yordamını çalıştırmaya yarayan deyimdir. Kontrol çağrılan yordama geçer, yordam bitince çağıran koddaki bir sonraki satırdan devam edilir. Kullanımı isteğe bağlıdır; yordam adı tek başına yazılarak da aynı çağrı yapılabilir.

Söz dizimi​

Call deyiminin iki geçerli yazımı vardır. Birincisinde Call sözcüğü kullanılır ve argümanlar parantez içine alınır, ikincisinde Call kullanılmaz ve parantez yazılmaz:
VBA 2 satır
Call yordamAdi(arg1, arg2)
yordamAdi arg1, arg2
  • Call: Deyimin anahtar sözcüğü; isteğe bağlıdır. Kullanılırsa argüman listesi mutlaka parantez içinde yazılmalıdır.
  • yordamAdi: Çağrılacak Sub ya da Function yordamının adı; zorunludur. Bu ad kod içinde sabit yazılır, metin değişkeniyle verilemez.
  • argüman listesi: Yordama aktarılacak değerler; isteğe bağlıdır. Birden çok argüman virgülle ayrılır. Adlandırılmış argümanlar da kullanılabilir, örneğin ad:=değer biçiminde.
Argümanı olmayan yordamlar Call Rapor ya da Call Rapor() biçiminde çağrılabilir.

Parantez kuralları ve dönüş değeri​

Call kullandığınızda argüman listesi parantezsiz yazılırsa derleme hatası alırsınız. Call kullanmadığınızda ise birden çok argümanı parantez içine almak da hata verir.
  • Call ile: Call Ad(a, b) biçimi gerekir.
  • Call olmadan: Ad a, b biçimi gerekir.
  • Function çağrısı: Call ile bir Function çağırırsanız işlevin döndürdüğü değer atılır. İşlevin yaptığı işlem (hücreye yazma gibi) yine gerçekleşir. Değeri kullanmak istiyorsanız sonuc = Ad(a) biçimini kullanın.
  • Tek argüman tuzağı: Call olmadan Ad (x) yazarsanız parantez bir ifade sayılır ve x değeri ByVal gibi aktarılır. Yordam, değişkenin kendisini değiştiremez.

Argüman aktarma ve kapsam​

Argümanlar, yordam tanımında başka belirtilmediyse ByRef (başvuruyla) aktarılır; yani çağrılan yordam değişkenin özgün değerini değiştirebilir. Değerin korunmasını istiyorsanız yordam tanımında ByVal yazın. Nesne türünde parametrelerde (Worksheet, Range gibi) ByVal kullanmak, tür uyuşmazlığı hatalarını da azaltır.
Aynı projedeki başka bir standart modülde bulunan Public yordamı doğrudan adıyla ya da Call Modul1.Ad biçiminde çağırabilirsiniz. Adı çalışma anında metin olarak belirlenen bir makroyu çağırmak için Call yerine Application.Run yöntemi kullanılır.

1. Sub yordamını argümanlarla çağırma​

Sayfada ürün, adet ve birim fiyat bulunur; Tutar sütununu makro doldurur. Kodu bir standart modüle yapıştırın. Ana makro, her satır için TutarYaz yordamını Call ile çağırır.
VBA 14 satır
Option Explicit

Sub Ana()
    Dim r As Long
    For r = 2 To 5
        ' Call kullanıldığı için argümanlar parantez içinde
        Call TutarYaz(ActiveSheet, r)
    Next r
End Sub

Sub TutarYaz(ByVal ws As Worksheet, ByVal satir As Long)
    ' Adet x Birim Fiyat değerini D sütununa yazar
    ws.Cells(satir, 4).Value = ws.Cells(satir, 2).Value * ws.Cells(satir, 3).Value
End Sub
Call
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünAdetBirim FiyatTutar
2Klavye12350,004.200,00
3Fare25180,004.500,00
4Monitör44.250,0017.000,00
5Kulaklık18520,009.360,00
Sipariş TutarıExcelDepo v1.0.0
Makro çalışınca TutarYaz yordamı her satır için bir kez çağrılır. Klavye satırının tutarı 4.200,00, Monitör satırının tutarı 17.000,00 olarak yazılır. Yordam adını Call olmadan yazmak isteseydiniz parantezleri kaldırıp TutarYaz ActiveSheet, r biçimini kullanırdınız.

2. Call ile ve Call olmadan çağrı​

Sayfada aylık satış ve hedef değerleri bulunur; Durum sütununu makro doldurur. Kodu bir standart modüle yapıştırın. İlk beş ay Call ile, son ay Call olmadan çağrılır; iki yazım aynı sonucu verir.
VBA 20 satır
Option Explicit

Sub RaporDurumu()
    Dim r As Long
    For r = 2 To 6
        ' Call ile: argümanlar parantez içinde
        Call DurumYaz(ActiveSheet.Cells(r, 4), ActiveSheet.Cells(r, 2).Value, ActiveSheet.Cells(r, 3).Value)
    Next r

    ' Call olmadan: parantez yok
    DurumYaz ActiveSheet.Cells(7, 4), ActiveSheet.Cells(7, 2).Value, ActiveSheet.Cells(7, 3).Value
End Sub

Sub DurumYaz(ByVal hucre As Range, ByVal satis As Double, ByVal hedef As Double)
    If satis >= hedef Then
        hucre.Value = "Hedef aşıldı"
    Else
        hucre.Value = "Hedefin altında"
    End If
End Sub
Call
Formülünü incelemek için bir hücre seçin.
ABCD
1AySatışHedefDurum
2Ocak125.000120.000Hedef aşıldı
3Şubat98.000110.000Hedefin altında
4Mart134.500130.000Hedef aşıldı
5Nisan102.000125.000Hedefin altında
6Mayıs141.000135.000Hedef aşıldı
7Haziran118.000140.000Hedefin altında
Aylık RaporExcelDepo v1.0.0
Ocak satırı için Durum sütununa Hedef aşıldı, Şubat satırı için Hedefin altında yazılır. Haziran satırı Call olmadan çağrıldığı halde sonucu aynı biçimde Hedefin altında olarak oluşur. Burada Range türündeki parametre ByVal tanımlandığında yordama hücre başvurusunun bir kopyası geçirilir. Bu kopya aynı hücreyi gösterdiği için yordam o hücreye yazabilir.

3. Function çağırıp dönüş değerini atma​

Sayfada ürünlerin stok miktarları bulunur; Durum sütununu ve alttaki sayacı makro doldurur. Kodu bir standart modüle yapıştırın. DurumIsle işlevi hem hücrelere yazar hem de kritik ürün sayısını döndürür. Önce Call ile çağrılır ve dönüş değeri atılır, ardından aynı işlev değeri kullanmak için atama biçiminde çağrılır.
VBA 24 satır
Option Explicit

Function DurumIsle(ByVal ws As Worksheet) As Long
    Dim r As Long, kritik As Long
    For r = 2 To 6
        If ws.Cells(r, 2).Value < 10 Then
            ws.Cells(r, 3).Value = "Kritik"
            kritik = kritik + 1
        Else
            ws.Cells(r, 3).Value = "Yeterli"
        End If
    Next r
    DurumIsle = kritik
End Function

Sub StokKontrol()
    Dim n As Long
    ' Call ile çağrı: dönüş değeri atılır, yalnızca yazma işlemi önemlidir
    Call DurumIsle(ActiveSheet)

    ' Dönüş değeri gerekiyorsa atama biçimi kullanılır
    n = DurumIsle(ActiveSheet)
    ActiveSheet.Range("B7").Value = n
End Sub
Call
Formülünü incelemek için bir hücre seçin.
ABC
1ÜrünStokDurum
2Defter25Yeterli
3Kalem8Kritik
4Dosya40Yeterli
5Zımba3Kritik
6Silgi15Yeterli
7Kritik ürün sayısı2
Stok KontrolExcelDepo v1.0.0
Kalem satırı için Durum sütununa Kritik, Dosya satırı için Yeterli yazılır. Alttaki sayaç hücresi ise işlevin döndürdüğü kritik ürün sayısını, yani 2 değerini gösterir. Call ile yapılan ilk çağrıda dönüş değeri hiçbir yere aktarılmaz; yine de işlevin içindeki hücre yazma işlemleri gerçekleşir.

Kullanırken dikkat edin​

  • Parantez hatası: Call kullanırken argümanları parantezsiz yazarsanız, Call kullanmazken de birden çok argümanı parantez içine alırsanız derleme hatası (Expected: end of statement gibi) alırsınız. İki biçimi karıştırmamaya dikkat edin.
  • Fazladan parantez ve ByRef: Call olmadan tek argümanı parantez içine yazmak, argümanı ifade haline getirir ve değer kopyası gönderilir. Yordam değişkeni değiştirse bile çağıran koddaki değer değişmez. Bu davranış çoğu zaman fark edilmeyen bir hata kaynağıdır.
  • Call zorunlu değildir: Modern VBA kodunda Call çoğunlukla kullanılmaz; deyim işlevsel olarak yordam adını tek başına yazmakla aynıdır. Call, eski kodlarla uyumluluk ya da çağrıyı gözle kolay seçilir kılmak için tercih edilir. Ekip içinde tek bir biçimi seçip tutarlı kullanın.
  • Dönüş değeri atılır: Call ile bir Function çağırdığınızda sonuç kaybolur. İşlevin yalnızca sonucu için çağrıldığı durumlarda bu, anlamsız bir çağrıya dönüşür; sonucu bir değişkene atayın ya da doğrudan ifade içinde kullanın.
  • Adı metin olarak verme: Call deyimine yordam adı metin değişkeniyle verilemez. Adı çalışma anında belirlenen makrolar için Application.Run yöntemini kullanın. Yordam bulunamazsa derleme ya da çalışma zamanı hatası oluşur.
  • İlgili konular:
    • Sub: Değer döndürmeyen yordam tanımı.
    • Function: Değer döndüren yordam tanımı.
    • Application.Run: Adı metin olarak verilen makroyu çalıştırma.
    • ByVal ve ByRef: Argümanın değer ya da başvuru olarak aktarılması.
    • Exit Sub ve Exit Function: Yordamı erken bitirme.
    • Optional: İsteğe bağlı parametre tanımlama.
Ö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
12
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst