TOP

VBA-Ders 9. Prosedürler ve işlevler

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.

  • İşlev, sonuç döndüren bir rutindir. İşlev çağrısı bir ifadedir ve diğer ifadelerde veya bir atama ifadesinin sağ tarafında kullanılabilir (VBA'de "Function" olarak gösterilir);
  • Bir prosedür, bir işlev olmayan herhangi bir rutindir. VBA'de "Sub" olarak işaretlendi ("alt program" sözcüğünden).

  • Prosedürler (Public - Private)

    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ün ortasından çalıştırma

    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
    

    Argümanlar

    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.

    İsteğe bağlı bağımsız değişkenler

    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):

    ByRef - ByVal

    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.

    Fonksiyonlar

    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: