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.
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.
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.
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.
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.
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.
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Klavye | 12 | 350,00 | 4.200,00 |
| 3 | Fare | 25 | 180,00 | 4.500,00 |
| 4 | Monitör | 4 | 4.250,00 | 17.000,00 |
| 5 | Kulaklık | 18 | 520,00 | 9.360,00 |
Sipariş TutarıExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ay | Satış | Hedef | Durum |
| 2 | Ocak | 125.000 | 120.000 | Hedef aşıldı |
| 3 | Şubat | 98.000 | 110.000 | Hedefin altında |
| 4 | Mart | 134.500 | 130.000 | Hedef aşıldı |
| 5 | Nisan | 102.000 | 125.000 | Hedefin altında |
| 6 | Mayıs | 141.000 | 135.000 | Hedef aşıldı |
| 7 | Haziran | 118.000 | 140.000 | Hedefin altında |
Aylık RaporExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Stok | Durum |
| 2 | Defter | 25 | Yeterli |
| 3 | Kalem | 8 | Kritik |
| 4 | Dosya | 40 | Yeterli |
| 5 | Zımba | 3 | Kritik |
| 6 | Silgi | 15 | Yeterli |
| 7 | Kritik ürün sayısı | 2 |
Stok KontrolExcelDepo v1.0.0
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.