Herhangi bir programlama dilinde prosedürler ve işlevler gibi kavramlar vardır. Ayrıca Excel için yerleşik programlama dili VBA'ye de dahil edildiler.
Bu noktada oluşturduğumuz tüm prosedürler Public türündedir, yani bunlara herhangi bir modülden erişilebilir.
Sub example() 'Şununla aynı: Public Sub example()
Prosedürün yalnızca belirli bir modülde kullanılabilir olmasını sağlamak için Private anahtar sözcüğü kullanılır:
Private Sub example()
Bir prosedürü başka bir prosedür içerisinden yürütmek için sadece adını girin.
İşte bunun çok basit bir örneği:
Private Sub warning()
MsgBox "Caution !!!" '"UYARI!"
End Sub
Sub macro_test()
If Range("A1") = "" Then
warning '=> "warning" prosedürünü yürütün
End If
'vesaire...
End Sub
Bağımsız değişkenler, bir prosedürdeki değerlerin bir alt prosedürde kullanılmasını mümkün kılar (varsayılan olarak değişkenlerin yalnızca bildirildikleri prosedürden elde edilebileceğini unutmayın).
Private Sub warning(var_text As String)
MsgBox "Caution : " & var_text & " !"
End Sub
Sub macro_test()
If Range("A1") = "" Then
warning "empty cell" '"boş hücre"
ElseIf Not IsNumeric(Range("A1")) Then
warning "non-numerical value" '"sayısal olmayan değer"
End If
End Sub
"warning" prosedürüne bir argüman eklenmiştir; bu durumda bu, "String" (şerit) türünde bir "var_text" değişkenidir:
Private Sub warning(var_text As String)
Bu rutin bir argüman alır, dolayısıyla onu yürütmek için "warning"den sonra bir değer koymamız gerekir:
warning "empty cell"
Birkaç argüman yazmak istediğimizde, bunlar virgülle ayrılmalıdır.
Varsayılan olarak, prosedürün argümanları varsa, bunların sağlanması gerekir ve sağlanmazlarsa prosedür yürütülmez.
Optional anahtar sözcüğü kullanılarak zorunlu bir bağımsız değişkenden sonra isteğe bağlı bir bağımsız değişken eklenebilir. Örnek:
Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
Bu prosedür artık burada olduğu gibi isteğe bağlı bir argümanla veya bu argüman olmadan yürütülebilir:
'Örnek 1: soyadını görüntüleyin: dialog_boxes last_name1 'Örnek 2: soyadını ve adını görüntülüyoruz: dialog_boxes last_name1, first_name1 'Örnek 3: soyadını ve yaşını görüntüleyin: dialog_boxes last_name1, , age1 'Örnek 4: soyadını, adını ve yaşını görüntüle: dialog_boxes last_name1, first_name1, age1
Bağımsız değişkenler doğru sırayla girilmelidir.
Bir prosedürde isteğe bağlı bir argümanın mevcut olup olmadığını test etmek için IsMissing fonksiyonunu kullanırız. Bu işlev yalnızca bazı işlev türleriyle (Variant türü) uyumludur ve isteğe bağlı bağımsız değişkenlerin türü bildirilmediğinden (bildirilmemiş tür = Variantt) bu kritik öneme sahiptir.
Yukarıda tartışılan iki kod parçacığını kullanan bir örneği burada bulabilirsiniz:
Sub macro_test()
Dim last_name1 As String, first_name1 As String, age1 As Integer
last_name1 = Range("A1")
first_name1 = Range("B1")
age1 = Range("C1")
'Örnek 1: soyadını görüntüleyin:
dialog_boxes last_name1
'Örnek 2: soyadını ve adını görüntülüyoruz:
dialog_boxes last_name1, first_name1
'Örnek 3: soyadını ve yaşını görüntüleyin:
dialog_boxes last_name1, , age1
'Örnek 4: soyadını, adını ve yaşını görüntüle:
dialog_boxes last_name1, first_name1, age1
End Sub
Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
If IsMissing(age) Then 'Yaş değişkeni eksikse...
If IsMissing(first_name) Then 'First_name değişkeni eksikse, o zaman
'yalnızca soyadı görüntülenecek
MsgBox last_name
Else 'Aksi takdirde soyadı ve adı görüntülenecektir
MsgBox last_name & " " & first_name
End If
Else 'Yaş değişkeni mevcutsa...
If IsMissing(first_name) Then 'First_name değişkeni eksikse, o zaman
'soyadı ve yaşı görüntülenecek
MsgBox last_name & ", " & age & " years old"
Else 'Aksi takdirde soyadı, adı ve yaşı görüntülenecektir
MsgBox last_name & " " & first_name & ", " & age & " years old"
End If
End If
End Sub
Görmek aşağıdaki resim (örnek 1):
Varsayılan olarak argümanlar ByRef türündedir; bu, eğer bir değişken argüman olarak iletilirse ona bir referansın da iletileceği anlamına gelir. Başka bir deyişle, eğer bir değişken başka bir alt prosedür tarafından değiştirilmişse, o alt prosedürü çağıran dış prosedürde de değişecektir.
Örnek:
Sub macro_test()
Dim var_number As Integer
var_number = 30
calcul_square var_number
MsgBox var_number
End Sub
Private Sub calcul_square(ByRef var_value As Integer) 'ByRef isteğe bağlıdır
'(varsayılan değerdir)
var_value = var_value * var_value
End Sub
Açıkça belirtmek gerekirse, makro çalıştırılmaya başlanırsa ne olacağına dair bir örnek aşağıda verilmiştir:
var_number = 30 '"var_number" değişkeninin başlangıç değeri 30'dur calcul_square var_number 'Alt prosedür argüman olarak "var_number" ile çalıştırılır Private Sub calcul_square(ByRef var_value As Integer) '"var_value" değişkeni bir dereceye kadar "var_number" değişkenine hızlı erişim sağlar, 'bu, "var_value" değişkeni değiştirilirse "var_number" değişkeninin de değişeceği anlamına gelir '(ve aynı ada sahip olmaları gerekmez) var_value = var_value * var_value '"var_value" değişkeninin değeri değiştirilir (ve dolayısıyla "var_number" da aynı anda değişir) End Sub 'Alt prosedürün sonu MsgBox var_number '"var_number" değişkeni değiştirildi, böylece iletişim kutusunda artık 900 görüntülenecek
İkinci yöntem ise ByVal kullanmaktır.
Bir referans (etiket) ileten ByRef'den farklı olarak, ByVal bir değer iletir; bu, argüman olarak iletilen değerin değiştirilmediği anlamına gelir.
Aşağıda önceki kodun ve ByVal'ın nasıl çalıştığını görebilirsiniz:
var_number = 30 '"var_number" değişkeninin başlangıç değeri 30'dur calcul_square var_number 'Alt prosedür argüman olarak "var_number" ile çalıştırılır Private Sub calcul_square(ByVal var_value As Integer) '"var_value" değişkeni, "var_number" değişkeninin değerini kopyalar (2 değişken birbiriyle ilişkili değildir) var_value = var_value * var_value '"var_value" değişkeninin değeri değişti End Sub 'Alt prosedürün sonu (bu örnekte alt prosedürün hiçbir şey üzerinde etkisi yoktur) MsgBox var_number '"var_number" değişkeni değiştirilmedi ve bu nedenle iletişim kutusunda 30 görüntülenecek
Hatırlamanız gerekenler: Değişkenin değiştirilmemesi gerektiğinde ByVal kullanın.
Bir prosedür ile fonksiyon arasındaki temel fark, fonksiyonun bir değer döndürmesidir.
İşte basit bir örnek:
Function square(var_number)
square = var_number ^ 2 '"Kare" işlevi "karekök" değerini döndürür
End Function
Sub macro_test()
Dim result As Double
result = square(9.876) 'Sonuç değişkenine fonksiyon tarafından hesaplanan değer atanır.
MsgBox result 'Sonuç görüntülenir (bu durumda 9,876'nın karesi)
End Sub
İşlev, Excel'deki diğer işlevler gibi bir çalışma sayfasında kullanılabilir.
Örneğin A1 hücresine girilen değerin karesini almak için: