
Excel VBA ByRef Argümanı Nedir?
Aşağıdaki örneği ele alalım. ByRef kullanarak değişkene başvuran bir fonksiyonu çağırdığınız bir alt rutin oluşturur. VBA ByRef argümanını kullanarak, değeri bir tam sayı olarak adlandırabilir ve 2 artırabiliriz, bunun sonucunda çıktı, kodun altında görüldüğü gibi, Hemen sekmesinde yazdırılır.


ByRef, genellikle fonksiyonlara veya alt rutinlere argümanlar geçirmek için kullanılır. VBA ByRef argümanı geçirildiğinde, fonksiyon veya alt rutin içindeki parametrede yapılan değişiklikler, o rutinin kapsamı dışında da devam eder. Bu, daha esnek ve dinamik veri manipülasyonuna olanak tanır ve değişkenler üzerinde gelişmiş kontrol sağlar.
Önemli Noktalar
- ByRef, VBA'da bir parametre geçirme mekanizmasıdır. Bir argüman ByRef geçirildiğinde, bir fonksiyon veya alt rutin içindeki parametrede yapılan değişiklikler, çağıran koddaki orijinal değişkeni etkiler.
- ByRef, bellekteki değişkenlerin veya veri yapılarının doğrudan değiştirilmesine olanak tanır.
- Değişkenler üzerinde esneklik ve kontrol sağlayarak dinamik veri manipülasyonuna olanak tanır.
- ByRef, genellikle dizilerle birlikte verileri etkin bir şekilde güncellemek ve düzenlemek için kullanılır.
- Özellikle büyük veri yapıları için gereksiz veri kopyalamanın önüne geçerek kod verimliliğini artırabilir.
- ByRef, yinelemeli fonksiyonlar veya özel hata işleme rutinleri gibi bazı gelişmiş tekniklerin uygulanması için olmazsa olmazdır.
VBA ByRef Argümanı kullanılarak nasıl geçilir?
VBA ByRef Argümanını geçirmek için aşağıdaki adımları gerçekleştiriyoruz:
Adım 1: Araç çubuğundaki “ Geliştirici sekmesine ” gidin ve “Visual Basic” seçeneğine tıklayın. Şimdi, işlevler ve alt prosedürler eklemek için VBA Editörü açılır. Ardından, yeni bir modül veya boş sayfa oluşturmak için “Ekle” ve “Modül” düğmelerine tıklayın.


Adım 2: Dize değerlerini değiştirmek için bir alt rutin tanımlayın.

Adım 3: 'name' değişkenini String veri türü olarak tanımlayın.

Adım 4: 'name' dize değişkeni için değeri başlatın.

Adım 5: Excel VBA'da değişiklikleri Hemen sekmesinde görüntülemek için ByRef alt rutinini çağırmadan önce adı yazdırın.

Adım 6: VBA ByRef Argümanını bir Dize değişkeni olarak kullanarak alt rutini çağırın.

Adım 7: Adım 5'te çağrılan alt rutini tanımlayın.

Adım 8: 'str' değerini tanımlayın.

Kod:
Sub StringByRef()
Dim name As String
name = “John”
Debug.Print “Before calling the subroutine: ” & name
ModifyNameByRef name
Debug.Print “After calling the subroutine: ” & name
End Sub
Sub ModifyNameByRef(ByRef str As String)
str = “Jane”
End Sub
Adım 9: Kodu Excel VBA'da F5'e veya 'çalıştır' düğmesine basarak çalıştırın. Çıktı aşağıda gösterilmiştir:

Örnekler
ByRef'in fonksiyonlarda nasıl kullanılacağını gösteren bazı örneklere bakalım.
Örnek 1
Bir fonksiyonda VBA ByRef argümanını kullanarak bir boolean değeri döndürmemiz gereken bir örneği ele alalım.
Adım 1: VBA ByRef Boolean'ını geçirmek için bir alt prosedür başlatın.

Adım 2: VBA'da 'n'yi Tamsayı veri türü olarak ve 'res'i Boolean veri türü olarak bildirin .

Adım 3: InputBox() fonksiyonunun yardımıyla kullanıcıdan 'n' değerini alın.

Adım 4: Boolean fonksiyonu döndüren ve VBA ByRef bağımsız değişkenini kabul eden tam sayı ve Boolean değişkenlerini çağırın.

Adım 5: Debug.Print kullanarak res değerini yazdırın.

Adım 6: Verilen sayının çift olup olmadığını kontrol eden BooleanExample fonksiyonunu tanımlayın.

Adım 7: Kullanıcının verdiği sayının çift olup olmadığını kontrol etmek için bir If-Else koşulu başlatın. Bu, VBA Mod Operatörü kullanılarak yapılır.

Kod:
Sub AnotherByRefExample()
Dim n As Integer
Dim res As Boolean
n = InputBox(“Sayıyı girin”)
Debug.Print “Değer: ” & n
BooleanExample n, res
Debug.Print “Çift mi?: ” & res
Alt Son
Fonksiyon BooleanExample(ByRef num As Integer, ByRef value As Boolean)
Eğer num Mod 2 = 0 ise O zaman
değer = True
Değilse: değer = False
Son Eğer
Son FonksiyonSub AnotherByRefExample()
Dim n As Integer
Dim res As Boolean
n = InputBox(“Enter number”)
Debug.Print “Value is: ” & n
BooleanExample n, res
Debug.Print “Is it Even?: ” & res
End Sub
Function BooleanExample(ByRef num As Integer, ByRef value As Boolean)
If num Mod 2 = 0 Then
value = True
Else: value = False
End If
End Function
Adım 8: Adım 5'e geçin. Kodu çalıştırın, cevap Excel VBA'daki Hemen sekmesinde yazdırılacaktır.


Sonuç olarak,

Örnek 2
VBA ByRef Dizisi'ni geçirmemiz ve dizideki tüm elemanlara çarpma işlemi yapmamız gereken bir örneği ele alalım.
Adım 1: ByRef VBA Dizisini gerçekleştirmek için bir alt prosedür başlatın .

Adım 2: Değişken number()'ı bir Integer veri türü olarak bildirin. Excel VBA'da değişkenden sonraki parantezler bir diziyi belirtir.

Adım 3: Dizi boyutunu VBA'da bildirin ve bu dizi için dizinin boyut kapasitesine kadar (bu durumda 3) değerler atayın.

Adım 4: İşlemleri gerçekleştirmeden önce değişkenleri yazdırın. Dizideki öğeleri yazdırmak için kullanıcı tanımlı bir alt rutin oluşturun.

Adım 5: Her değeri 2 ile çarpan alt rutini çağırın. (Adım 6'ya gidin)

Hem 4. Adımdaki hem de 5. Adımdaki alt rutinler, ana alt rutin tanımlandıktan sonra tanımlanır.
Adım 6: Alt rutini çağırdıktan sonra değerleri yazdırın.

Adım 7: Adım 5'te çağrılan alt rutini tanımlayın.

Adım 8: FOR döngüsünde tüm dizi elemanlarını dolaşacak olan 'I' adında yinelemeli bir değişken bildirin.

Adım 9: Dizinin en soldaki elemanından (LBound() kullanılarak tanımlanmıştır) ve en sağdaki elemanından (UBound() fonksiyonu kullanılarak bulunmuştur) başlayan bir FOR döngüsü başlatın.

Adım 10: Tüm elemanları 2 ile çarpın.

Adım 11: Adım 4 ve 6'da çağrılan dizi elemanlarını yazdırmak için kullanılan alt rutini tanımlayın.

Burada alt rutini VBA ByRef Dizisi ile çağırıyoruz.
Adım 12: Dizi içinde döngü yapacak yinelemeli bir değişken bildirin.

Adım 13: Dizinin en soldaki elemanından (LBound() kullanılarak tanımlanmıştır) ve en sağdaki elemanından ( UBound() fonksiyonu kullanılarak bulunmuştur) başlayan bir FOR döngüsü başlatın.

Adım 14: Debug.Print kullanarak tüm elemanları indeksle birlikte yazdırın.

Kod:
Sub ArrayByRef()
Dim numbers() As Integer
ReDim numbers(1 To 3)
numbers(1) = 10
numbers(2) = 20
numbers(3) = 30
Debug.Print “Before calling the subroutine:”
DisplayArray numbers
DoubleArrayValues numbers
Debug.Print “After calling the subroutine:”
DisplayArray numbers
End Sub
Sub DoubleArrayValues(ByRef arr() As Integer)
Dim i As Integer
For i = LBound(arr) To UBound(arr)
arr(i) = arr(i) * 2
Next i
End Sub
Sub DisplayArray(ByRef arr() As Integer)
Dim i As Integer
For i = LBound(arr) To UBound(arr)
Debug.Print “Element ” & i & “: ” & arr(i)
Next i
End Sub
Adım 15: Yukarıdaki kodu yazdırın. Çıktı Immediate sekmesinde yazdırılır.

Dikkat Edilmesi Gereken Önemli Noktalar
- Orijinal değişkeni değiştirirken veya güncellenmiş bilgiyi alırken ByRef'i kullanın.
- ByRef parametresinin hem fonksiyon/altprogram bildiriminde hem de çağrıda ByRef anahtar sözcüğü ile doğru şekilde bildirildiğinden emin olun.
- ByRef'e geçirilen değişkenin kapsamını, fonksiyon/alt rutin içinde erişilebilir olduğundan emin olmak için göz önünde bulundurun.
- Sabitler veya ifadeler gibi salt okunur değişkenlerle ByRef kullanmayın.
- ByRef'in her zaman en iyi seçim olacağını varsaymayın; ByVal'ın veya diğer yaklaşımların sizin özel senaryonuz için daha uygun olup olmadığını değerlendirin.
- Değişkenleri doğrudan ByRef ile değiştirmenin olası yan etkilerini göz ardı etmeyin; kodunuzun diğer bölümleri üzerindeki etkisini göz önünde bulundurun.