
ByRef Excel VBA'da argüman türü uyuşmazlığı?
Örneğin, aşağıdaki kodu ele alalım. Bu kodda, "test" prosedürü referansla geçirilen bir dize parametresi alır, ancak "main" alt bölümünde, "test" prosedürüne argüman olarak bir tamsayı değişkeni "num" geçirilir. "num" bir dize olmadığından, VBA ByRef Argüman Türü Uyuşmazlığı hatası oluşur.

Kod çalıştırıldığında aşağıdaki hatayı alırsınız:

Bu hatayı düzeltmek için, geçirilen argümanın veri türünün, prosedür veya fonksiyon parametresinin veri türüyle eşleştiğinden emin olmalısınız. Bu durumda, "num" değişkeninin veri türünü bir dizeye değiştirebilir ve kodu çalıştırabilirsiniz.


ByRef ne anlama geliyor?
VBA'da (Visual Basic for Applications) ByRef, "başvuru yoluyla" anlamına gelir. Bir parametre bir alt yordama veya fonksiyona başvuru yoluyla geçirildiğinde, değerinin bir kopyası yerine bellekteki orijinal değişkene bir başvuru alır.
Bu, alt rutin veya fonksiyon içindeki parametrede yapılan herhangi bir değişikliğin, bunun dışındaki orijinal değişkeni de etkileyeceği anlamına gelir. Öte yandan, bir parametre değere göre geçirildiğinde, değişkenin değerinin bir kopyası alt rutine veya fonksiyona geçirilir ve alt rutin veya fonksiyon içindeki parametrede yapılan herhangi bir değişiklik, alt rutin veya fonksiyon dışındaki orijinal değişkeni etkilemez.
Varsayılan olarak, VBA parametreleri referansla geçirir, bu nedenle "ByRef" anahtar sözcüğü öyle değildir. Ancak, parametre listesindeki "ByRef" anahtar sözcüğünü kullanarak bir parametrenin referansla geçirileceğini açıkça bildirebilirsiniz.
İşte referansla bir parametre kabul eden bir alt rutin örneği:

Bu örnekte, “ str ” parametresi “ ByRef ” anahtar sözcüğü kullanılarak referansla geçirilir .
Alt program bir dize değişkenini argüman olarak kullanarak çağrıldığında, dize yeni değişkene başlatılır ve yeni dize yazdırılır.
Bunu kullanan başka bir alt rutini tanımlayarak çıktıyı hemen yanındaki sekmeye yazdırır.

Çıktı şu şekilde olacaktır:

VBA ByRef Argüman türü Uyuşmazlığı için En Önemli 3 Neden
VBA ByRef argüman türü uyumsuzluğu hatasının başlıca nedenlerine bir göz atalım:
#1 – Veri Türü Uyuşmazlığı: “ByRef argüman türü uyuşmazlığı” hatasının en yaygın nedeni, alt yordama veya fonksiyona geçirilen argüman ile beklenen parametre türü arasındaki VBA değişkeni veri türü uyuşmazlığıdır.
Örneğin, bir alt rutin bir dize parametresi bekliyor, ancak ona bir tam sayı geçiriliyor. Bu durumda, bir VBA ByRef argüman türü uyumsuzluğu tam sayısı olduğu anlamına gelir ve bu da “ByRef argüman türü uyumsuzluğu” hatasının oluşmasına neden olur.
#2 – Boş Değerler: “ByRef argüman türü uyumsuzluğu” hatasının bir diğer yaygın nedeni, alt yordama veya fonksiyona argüman olarak boş değerlerin geçirilmesidir.
Tarihler veya sayısal değerler gibi bazı veri türleri boş değerleri işleyemez ve bunları argüman olarak geçirmeye çalışmak “ByRef argüman türü uyuşmazlığı” hatasına yol açabilir.
#3 – Yanlış Fonksiyon Çağrısı: “ByRef argüman türü uyumsuzluğu” hatası bazen yanlış fonksiyon veya alt rutin çağrıları nedeniyle oluşur. Örneğin, bir fonksiyon çok az veya çok fazla argümanla çağrılırsa veya argümanlar yanlış sıradaysa, “ByRef argüman türü uyumsuzluğu” hatası oluşabilir.
Fonksiyonun veya alt yordamın doğru sayıda argümanla ve doğru sırada çağrıldığından emin olmak önemlidir.
“ByRef argüman türü uyumsuzluğu” hatasının belirli nedenini belirleyerek sorunu düzeltebilir ve tekrar oluşmasını önleyebilirsiniz. Şimdi bu hatanın neden oluştuğuna dair bazı örneklere bakalım.
Hata Nedeni 1 – Farklı Değişken Adları
VBA'da "ByRef argüman türü uyumsuzluğu" hatası aldığınızı varsayalım. Bu durumda, bu genellikle bir alt yordama veya işleve geçirdiğiniz argümanın veri türünün, alt yordam veya işlev başlığında bildirilen parametrenin veri türüyle eşleşmediği anlamına gelir.
Ancak, veri türleri eşleşse bile ancak değişken adları farklı olsa bile bu hatayı almak mümkündür. Örneğin, bir değişkeni alt yordama veya işlev başlığında kullanılandan farklı bir ad kullanarak bir alt yordama veya işleve geçirdiğinizde bu durum meydana gelebilir.
Aşağıdaki kodu inceleyin:

Bu kodda, MultiplyNumberByThree() alt yordamı, girilen sayının üç katını döndüren tamsayı veri türündeki bir 'x' değişkenine başvurur.
Ancak, PrintProduct() alt rutinine geçtiğimizde yanlış 'num' değişkeninin referans alındığını görebiliriz.
VBA ByRef argüman türü uyumsuzluğu dizisini yazdıracaktır:

Bu hata, bir alt rutinde veya fonksiyonda kullanılan değişkenin fonksiyon başlığında bildirilen parametre adıyla eşleşmesi sağlanarak düzeltilebilir. Dolayısıyla, yukarıdaki örnek için doğru kod şu olacaktır:

Kod:
Sub MultiplyNumberByThree(ByRef x As Integer)
x = x * 3
Debug.Print x
End Sub
Sub PrintProduct()
Dim no As Integer
no = 10
MultiplyNumberByThree no
End Sub
Burada, 'num' altprogramda tanımlandığı gibi 'no' olarak değiştirildi ve hata ortadan kaldırıldı. Şimdi çıktı, Immediate sekmesinde şu şekilde yazdırılacak:

Hata Nedeni 2 – Farklı Değişken Veri Türleri
Bir alt program veya fonksiyonda tanımlanan parametreden farklı bir veri türündeki değişken geçirirseniz VBA'da “ByRef argüman türü uyuşmazlığı” hatasıyla karşılaşırsınız.
Örneğin, aşağıdaki kodu ele alalım:

Bu kodda, MultiplyNumberByThree() alt yordamı bir tamsayı argümanı bekler. Yine de, PrintProduct() alt yordamında, bir Integer türü argümanı yerine bir String argümanı olan bir 'no' değişkeni elde ederiz.
Sonuç olarak aşağıda gösterildiği gibi bir “ByRef argüman türü uyumsuzluğu” ile karşılaşacağız:

Bu hatayı düzeltmek için, alt yordama veya fonksiyona geçirilen değişkenin veri türünün, alt yordam veya fonksiyon başlığında bildirilen parametrenin veri türüyle eşleştiğinden emin olmalısınız. Dolayısıyla, yukarıdaki örnekte doğru kod şöyle olacaktır:

Burada, PrintProduct()'daki değişkenin veri türü, MultiplyNumberByThree() alt rutini için gereken değişken veri türü argümanıyla eşleşen Integer olarak değiştirilir ve bu da hatanın oluşmasını önler. Çıktıyı Immediate sekmesinde yazdırır.

Kod:
Sub MultiplyNumberByThree(ByRef x As Integer)
x = x * 3
Debug.Print x
End Sub
Sub PrintProduct()
Dim no As Integer
no = 10
MultiplyNumberByThree no
End Sub
Hata Nedeni 3 – Bir Makroda Değişken Veri Türleri Eksik
Bir değişkenin VBA'daki bir makroda bildirildiğini ancak başka bir makroda bildirilmediğini veya farklı bir veri türüne sahip olduğunu varsayalım. Daha sonra, değişkeni iki makro arasında geçirirken, "ByRef argüman türü uyumsuzluğu" hatasıyla karşılaşabilirsiniz.
Örneğin, aşağıdaki kodu ele alalım:

Yukarıdaki koddaki MultiplyNumberByThree() alt yordamı argüman olarak bir tam sayı bekler. Ancak, ExampleFunction() alt yordamında herhangi bir bildirim sağlamadık, sadece değişkene bir değer atadık. Bu nedenle, ByRef hatasını tetikleyecektir.

Bu hatayı düzeltmek için, değişkenin her iki makroda da aynı veri türüyle bildirildiğinden emin olmalısınız. Değişken bildirimini zorunlu hale getirmek için en üste " Option Explicit " kelimesini ekleyin.

Bu kodda, her iki değişken de her iki makroda aynı veri türüyle tanımlandığından, “ByRef argüman türü uyuşmazlığı” hatası oluşmayacaktır.
Çıktıyı yazdıracak olan:

Kod:
Sub ExampleFunction()
Dim x As Integer
x = 20
MultiplyNumberByThree x
MsgBox x
End Sub
Sub MultiplyNumberByThree(ByRef x As Integer)
x = x * 3
Debug.Print x
End Sub
Excel VBA'da ByRef Argüman Türü Uyuşmazlığı Nasıl Düzeltilir?
Excel VBA'da "ByRef argüman türü uyuşmazlığı" hatasını düzeltmek için, öncelikle bir alt yordama veya fonksiyona geçirdiğiniz argümanın veri türlerinin, alt yordam veya fonksiyon başlığında bildirilen parametrenin veri türüyle eşleşip eşleşmediğini kontrol etmelisiniz.
Bunu önlemek için alınabilecek önlemler aşağıda belirtilmiştir:
- Argümanın ve parametrenin veri türlerinin eşleştiğini kontrol edin.
Örneğin, parametre bir Integer olarak bildirilmişse, argüman olarak bir Integer geçirdiğinizden emin olun. - Alt rutinde veya fonksiyon çağrısında kullanılan değişken adının, alt rutinde veya fonksiyon başlığında bildirilen parametre adıyla eşleştiğini kontrol edin.
- Değişkenlerin kullanıldığı her makroda değişkenleri uygun veri türüyle bildirin. Değişkenlerin makrolar arasında doğru şekilde iletilmesini sağlamaya yardımcı olur.
- Tüm değişkenlerin kullanımdan önce tanımlandığından emin olmak için Option Explicit'i kullanın .
- Değişken çıktı için kullanılmıyorsa ByRef yerine değişkenin değerini geçirin.
Değişken çıktı için kullanılacaksa, ByRef'i geçirmeden önce değişkenin doğru şekilde tanımlandığından ve başlatıldığından emin olun.
Aşağıdaki adımları izleyerek Excel VBA kodunuzda oluşan “ByRef argüman türü uyuşmazlığı” hatasını tespit edip düzeltebilirsiniz .
Dikkat Edilmesi Gereken Önemli Noktalar
- Veri türleri: Alt yordama veya fonksiyona geçirilen argümanın veri türünün, alt yordam veya fonksiyon başlığında bildirilen parametrenin veri türüyle eşleştiğinden emin olun.
- Değişken adları: Alt rutinde veya fonksiyon çağrısında kullanılan değişken adının, alt rutinde veya fonksiyon başlığında belirtilen parametre adıyla eşleştiğinden emin olun.
- Değişken bildirimi: Değişkenlerin kullanıldığı her makroda değişkenleri uygun veri türüyle bildirin.
ByRef ve ByVal: ByRef ve ByVal değişkenlerini geçirme arasındaki farkı anlayın. ByRef, değişkenin bellek adresinin alt yordama veya fonksiyona geçirildiği anlamına gelirken, ByVal değişkenin değerinin geçirildiği anlamına gelir. - Değişken başlatma: ByRef'e geçirilmeden önce değişkenin doğru şekilde tanımlandığından ve başlatıldığından emin olun.
- Hata yönetimi: Kodunuzdaki hataları yakalamak ve işlemek için “Hata Durumunda Devam Et” veya “Hata Durumunda Git” gibi hata yönetimi tekniklerini kullanın.
VBA'da Split fonksiyonunu kullanırken, bölmeye çalıştığınız değişkenin veri türü Split fonksiyonunun beklediği veri türüyle uyumsuzsa “Tür uyuşmazlığı” hatası oluşabilir.
Hata 3464 “Veri Türü Uyuşmazlığı”, VBA'da uyumsuz veri türlerinin iki değerini atarken veya karşılaştırırken oluşan standart bir hatadır. Bu hata, VBA kodunda çeşitli durumlarda ortaya çıkabilir, ancak genellikle veritabanlarında veya elektronik tablolarda depolanan verilerle çalışırken ortaya çıkar.
"Derleme Hatası: Tür Uyuşmazlığı", koddaki iki değerin veri türleri arasında bir uyumsuzluk olduğunda oluşan bir VBA hatasıdır. Bu hata, çalışma zamanında değil derleme zamanında oluşur, yani hata, VBA kodu yürütülürken değil derlenirken algılanır.