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: