String-Metin Değişkeni

S

VBA|Seviye|Temel

Excel makrolarında (yani VBA dilinde) alfabetik veya sayısal karakterlerden oluşan değerlerin taşınması için çift tırnak içinde belirtilmek koşuluyla String tipinden yararlanılır.  Burada sayısal bir değer String tipinde taşınacak olursa, örneğin 3>2 gibi matematiksel bir önerme yapılamaz; o değişken sadece metin olarak taşınır.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "ishakkutlu.com"
y = "3.5"

Range("A1").Value = x
Range("A2").Value = y

End Sub

Yukarıdaki resimde A2 hücresine yazılan “3.5” String değişkeni, Excel’in hücre formatının özelliğinden dolayı otomatik olarak 3,5 değerine dönüştürülmüştür. Bu durum y değişkeninin “3.5” değerini String olarak taşıdığı gerçeğini değiştirmez. Bu ayrım VBA ile programlama yaparken yazılımı yapan kişiyi kolaylıkla tuzağa düşürebilecek çok önemli bir ayrımdır. Konuyla ilgili olarak, x ve y Double tipinde deklare edilen değişkenler olmak üzere aşağıdaki örnekten devam edebiliriz.

Private Sub CommandButton1_Click()
Dim x As Double, y As Double

x = 2.7
y = 3.5

MsgBox x + y

End Sub

Yukarıdaki işlemin sonucu x+y=6,2 olacaktır.

Ancak x ve y değişkenlerini Double tipinde değil de String tipinde deklare edersek, x+y=2.73.5 şeklinde bir değer elde edilir. x ve y değişkenleri String olarak deklare edildiği için bunların eşiti olan değerler de “” işaretleri içinde belirtilir.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "2.7"
y = "3.5"

MsgBox x + y

End Sub

Yukarıdaki resimde de görüldüğü gibi sonuç 6,2 değil, 2.7 ile 3.5 değerini yan yana getirilip bileştirilmesi olan 2.73.5 String değeri oldu.  Esasen String iki değişkenin “+” işareti ile toplanması, toplama işlemini değil, iki değişkeninin birleşiminde kullanılan “&” ifadesi anlamına gelir.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "ishak"
y = "kutlu.com"

MsgBox x & y

End Sub

Yukarıdaki prosedürde MsgBox x & y ifadesi yerine MsgBox x + y ifadesi de kullanılabilirdi. Her ne kadar String değişkenlerin birleştirilmesi anlamında “+” ve “&” işaretleri aynı görevi yerine getirse de birden çok String değişkeninin birleştirilmesinde “+” işareti yerine “&” işaretinin tercih edildiğini belirtmekte yarar var.

Özetle String değişkenlerde 1+2=3 değil, 1+2=12 eder. Çünkü String değişken olarak deklare edilmiş bir değişkene sayısal bir değer atanması mümkün olmakla birlikte, String değişkene atanan sayının matematiksel özellikleri aktarılmaz ve String değişkene atanan sayısal bir değerin, “a, b, c” gibi görsel bir işaretten başka bir anlamı olmaz.

Konunun önemine istinaden String değişkeni için ayrı bir makale hazırlanmıştır. String değişkenine ilişkin daha fazla bilgi için “String -Metin Değişkeni” isimli söz konusu makaleyi inceleyebilirsiniz.

1.  Verileri Birleştirmek

String ifadelerin birleştirilmesinde “+” veya “&” operatörü kullanılır. Ancak “&” operatörünü kullanmanız önerilir.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String, Str3 As String

Str1 = "ishak"
Str2 = "kutlu"
Str3 = ".com"

MsgBox Str1 & Str2 & Str3, vbOKOnly, "ishakkutlu.com"
MsgBox Str1 & " " & Str2, vbOKOnly, "ishakkutlu.com"

End Sub

Excel hücrelerinde bulunan verilerin birleştirilmesinde de aynı yöntem kullanılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String, Str3 As String

Str1 = Range("A1").Value
Str2 = Range("A2").Value
Str3 = Range("A3").Value

MsgBox Str1 & Str2 & Str3, vbOKOnly, "ishakkutlu.com"

End Sub

Not: String deklarasyonunu yapmadan ve değişkenleri kullanmadan hücrelerde bulunan verileri birleştirmek için mesaj kutusu içinde sadece Range(“A1”).Value & Range(“A2”).Value & Range(“A3”).Value komutunu kullanmanız yeterli olacaktır.

2.  vbNewLine ve Tab Metodu-Alt Satıra Geçmek ve Metne Girinti Vermek

Bir String değişkeni alt alta yazdırmak için vbNewLine komutundan yararlanılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String, Str3 As String

Str1 = "ishak"
Str2 = "kutlu"
Str3 = ".com"

MsgBox Str1 & vbNewLine & Str2 & vbNewLine & Str3, vbOKOnly, "ishakkutlu.com"
Range("A1").Value = Str1 & vbNewLine & Str2 & vbNewLine & Str3

End Sub

Alt satır komutu (vbNewLine), String bir ifadeyi sadece mesaj kutularına yazarken değil, herhangi bir yere yazarken de yukarıda görüldüğü gibi metinler alt alta gelecek şekilde düzenler.

Not: vbNewLine yerine Chr(13),  Chr(10) veya Chr(13) & Chr(10) karakter setlerinden herhangi birini de kullanabilirsiniz.

Eğer bir metne Tab ile sekme, içe girinti vermek istenirse Chr(9) metodu kullanılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String, Str3 As String

Str1 = "ishakkutlu.com"
MsgBox Str1 & " (Tab yok!)" & vbNewLine & Chr(9) & Str1 & " (1 Tab var!)" & vbNewLine & Chr(9) & Chr(9) & Str1 & " (2 Tab var!)", vbOKOnly, "ishakkutlu.com"

End Sub

3.  Left Metodu-Bir Verinin Soldan Sağa Karakterleri

String bir ifadenin soldan sağa doğru belirli bir karakter sayısına kadar olan kısmını verir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox Left(Str1, 3), vbOKOnly, "ishakkutlu.com"

End Sub

4.  Right Metodu-Bir Verinin Sağdan Sola Karakterleri

String bir ifadenin sağdan sola doğru belirli bir karakter sayısına kadar olan kısmını verir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox Right(Str1, 7), vbOKOnly, "ishakkutlu.com"

End Sub

5.  Mid Metodu-Bir Veriyi Karakterlerine Ayırmak

String bir ifadenin belirli bir karakter sayısından sonra, soldan sağa doğru belirli bir karakter sayısına kadar olan kısmını verir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox Mid(Str1, 6, 9), vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki örnek “ishakkutlu.com” ifadesinin 6. karakterinden (yani ikinci “k” harfinden) sonra gelen (6. Karakter dahil) ilk 9 karakterin elde edilmesini temsil etmektedir.

6.  Len Metodu-Bir Verinin Karakter Sayısı

String bir ifadenin (boşluklar dahil) toplam karakter sayısını verir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox Len(Str1), vbOKOnly, "ishakkutlu.com"

End Sub

7.  InStr Metodu-Bir Verinin Karakterlerinin Konumu

String bir ifadenin içinde yer alan belirli bir karakterin soldan sağa doğru olan konumunu/sırasını verir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStr(Str1, "kut"), vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki örnek “ishakkutlu.com” ifadesi içinde 6. karakterden itibaren “kut” ifadesinin bulunduğunu temsil etmektedir.

Eğer Instr metodu, String bir ifadenin içinde aradığı ögeyi bulamaz ise 0 değerini döndürür.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStr(Str1, "kuts"), vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki örnek “ishakkutlu.com” ifadesi içinde “kuts” ifadesinin bulunamadığını temsil etmekte olup Instr metodunun sıfır değerini döndürdüğü durumu yansıtmaktadır.

Instr komutu ile String bir ifade içinde hedef karakteri, belirli bir konumdan itibaren aşağıdaki gibi aratabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStr(1, Str1, "u"), vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki örnekte Instr komutu, 1. karakterden itibaren ilk “u” karakterinin konumunu vermektedir.

Aşağıdaki örnekte ise Instr komutu, 8. karakterden itibaren ilk “u” karakterinin konumunu vermektedir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStr(8, Str1, "u"), vbOKOnly, "ishakkutlu.com"

End Sub

Instr komutu ile aramayı soldan sağa değil de sağdan sola doğru yaptırmak için InstrRev komutundan yararlanılır.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStrRev(Str1, "u"), vbOKOnly, "ishakkutlu.com"

End Sub

InstrRev komutunun döndürdüğü 10 değeri, “.” karakterinin hemen solundaki “u” karakterinin soldan sağa doğru olan konumunu verir. InstrRev komutu, aramayı sağdan sola doğru yapmasına rağmen sonucu, Instr komutunda olduğu gibi soldan sağa doğru hesaplar.

Instr komutunda olduğu gibi InstrRev komutuyla da String bir ifade içindeki hedef karakteri, belirli bir konumdan itibaren sağdan sola doğru aşağıdaki gibi aratabilirsiniz. Ancak Instr komutunda olduğu gibi InstrRev komutu da sonucu soldan sağa doğru hesaplar.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
MsgBox InStrRev(Str1, "u", 9), vbOKOnly, "ishakkutlu.com"

End Sub

InStrRev(Str1, “u”, 9) komutu içindeki 9 ifadesi “l” harfini temsil etmekte olup aramayı sağdan sola doğru yaptığı için bulduğu ilk “u” harfi, “k” harfinin hemen sağındakidir. Ancak sonuca ilişkin hesaplamayı sağdan sola doğru yapar.

8.  UCase, LCase, Proper Metodu-Büyük Harf, Küçük Harf, İlk Harfler Büyük

Bir metnin ilk harflerini büyük, diğerlerini küçük harfle ifade etmek için proper metodu; tüm harflerini büyük harfle ifade etmek için UCase (UpperCase) metodu; tüm harflerini küçük harfle ifade etmek için LCase (LowerCase) metodu kullanılır.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "iShak kUtLu"
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
MsgBox WorksheetFunction.Proper(Str1), vbOKOnly, "ishakkutlu.com"
MsgBox UCase(Str1), vbOKOnly, "ishakkutlu.com"
MsgBox LCase(Str1), vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki methotlara alternatif olarak StrConv(Str1, vbProperCase), StrConv(Str1, vbUpperCase), StrConv(Str1, vbLowerCase) methotları da kullanılabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "iShak kUtLu"
MsgBox "Normal metin: " & Str1, vbOKOnly, "ishakkutlu.com"
MsgBox "İlk harfleri büyük olan metin: " & StrConv(Str1, vbProperCase), vbOKOnly, "ishakkutlu.com"
MsgBox "Tüm harfleri büyük olan metin: " & StrConv(Str1, vbUpperCase), vbOKOnly, "ishakkutlu.com"
MsgBox "Tüm harfleri küçük olan metin: " & StrConv(Str1, vbLowerCase), vbOKOnly, "ishakkutlu.com"

End Sub

Türkçe-İngilizce karakter çakışmasından dolayı dönüşümler sırasında “i” harfi “I” harfine, “I” harfi ise “i” harfine hatalı bir şekilde çevrilmektedir. Bu sorunu çözmek için aşağıdaki örnekte kullanıldığı şekliyle Replace komutundan yararlanılabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "İstanbul, izmir, Iğdır"
MsgBox "Normal metin: " & Str1, vbOKOnly, "ishakkutlu.com"
MsgBox "İlk harfleri büyük olan metin: " & StrConv((Replace(Replace(Str1, " ı", " I"), " i", " İ")), vbProperCase), vbOKOnly, "ishakkutlu.com"
MsgBox "Tüm harfleri büyük olan metin: " & StrConv((Replace(Replace(Str1, "ı", "I"), "i", "İ")), vbUpperCase), vbOKOnly, "ishakkutlu.com"
MsgBox "Tüm harfleri küçük olan metin: " & StrConv((Replace(Replace(Str1, "I", "ı"), "İ", "i")), vbLowerCase), vbOKOnly, "ishakkutlu.com"

End Sub

İlk harflerin büyük harf olacağı durum için dönüştürme komutundan önce, “ ı” ifadesi varsa “ I” ifadesi ile (ı ve I harfinden önce boşluk var), “ i” ifadesi varsa da “ İ” ifadesi ile (i ve İ harfinden önce boşluk var) değiştirilmektedir. Sonrasında ise vbProperCase komutu, dönüşümü (Replace edilen I ve İ harfleri hariç) tüm harfler için gerçekleştirmektedir.

Tüm harflerin büyük harf olacağı durum için dönüştürme komutundan önce, “ı” harfi varsa “I” harfi ile (ı ve I harfinden önce boşluk yok), “i” harfi varsa da “İ” harfi ile (i ve İ harfinden önce boşluk yok) değiştirilmektedir. Sonrasında ise vbUpperCase komutu, dönüşümü (Replace edilen I ve İ harfleri hariç) tüm harfler için gerçekleştirmektedir.

Tüm harflerin küçük harf olacağı durum için dönüştürme komutundan önce, “I” harfi varsa “ı” harfi ile (I ve ı harfinden önce boşluk yok), “İ” harfi varsa da “i” harfi ile (İ ve i harfinden önce boşluk yok) değiştirilmektedir. Sonrasında ise vbLowerCase komutu, dönüşümü (Replace edilen ı ve i harfleri hariç) tüm harfler için gerçekleştirmektedir.

Bir önceki yöntemde kullanılan WorksheetFunction.Proper(Str1) metodunda (bilgisayarın yerel ayarları Türkçe olduğu için) dönüşümde bir sorun olmadığından herhangi bir ilave komut eklemeye de gerek yoktur. Ancak bir önceki yöntemde kullanılan UCase(Str1) ve LCase(Str1) metotlarında da “ı-I veya i-İ” harflerinde Türkçe-İngilizce karakterlerinin çakışması olduğundan Replace komutu ile yukarıda yapılan düzeltme yapılmalıdır.

9.  Metinsel Verileri Karşılaştırmak

String ifadeler karşılaştırılırken büyük/küçük harf duyarlılığı konusu dikkate alınmalıdır. Basit bir String karşılaştırma örneği olması amacıyla aşağıdaki örnek prosedürü inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String

Str1 = "Ankara"
Str2 = "ANKARA"

If Str1 = Str2 Then
    MsgBox Str1 & " ve " & Str2 & " aynıdır.", vbOKOnly, "ishakkutlu.com"
Else
    MsgBox Str1 & " ve " & Str2 & " farklıdır.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

Not: Str1 ve Str2 arasındaki eşitlik/aynılık koşulu Str1 = Str2 şeklinde,  eşitsizlik/farklılık koşulu ise Str1 <> Str2 şeklinde yapılır.

Resimde de görüldüğü gibi yukarıdaki String karşılaştırma yöntemi büyük/küçük harf duyarlılığına sahiptir. String ifadeler için büyük/küçük harf duyarlılığına sahip alternatif karşılaştırma yöntemi için aşağıdaki kodları inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String

Str1 = "Ankara"
Str2 = "ANKARA"

If StrComp(Str1, Str2, vbTextCompare) Then 'Büyük/küçük harf duyarlılığı var
    MsgBox Str1 & " ve " & Str2 & " aynıdır.", vbOKOnly, "ishakkutlu.com"
Else
    MsgBox Str1 & " ve " & Str2 & " farklıdır.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

String ifadeler için büyük/küçük harf duyarlılığı olmayan karşılaştırma yöntemi için aşağıdaki kodları inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String, Str2 As String

Str1 = "Ankara"
Str2 = "ANKARA"

If StrComp(Str1, Str2, vbBinaryCompare) Then 'Büyük/küçük harf duyarlılığı yok
    MsgBox Str1 & " ve " & Str2 & " aynıdır.", vbOKOnly, "ishakkutlu.com"
Else
    MsgBox Str1 & " ve " & Str2 & " farklıdır.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

Not: Sayfanın en üstünde yer alan Option Explicit ifadesinin hemen altında Option Compare Text ifadesinin eklenmesi durumunda StrComp(Str1, Str2) komutu ile büyük/küçük harf duyarlılığına sahip karşılaştırmalar yapabilirsiniz. Benzer şekilde Sayfanın en üstünde yer alan Option Explicit ifadesinin hemen altında Option Compare Binary ifadesinin eklenmesi durumunda StrComp(Str1, Str2) komutu ile büyük/küçük harfe duyarlı olmayan karşılaştırmalar yapabilirsiniz.

10.  Verilerin Önünde, Arkasında veya Arasında Bulunan Boşlukları Kaldırmak

String bir ifadenin sağındaki ve solundaki boşluklar Trim komutu ile kaldırılabilir. String bir ifadenin sadece sağındaki boşlukları kaldırmak için RTrim, sadece solundaki boşlukları kaldırmak için LTrim komutu kullanılabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "   İshak Kutlu  "

MsgBox LTrim(Str1), vbOKOnly, "ishakkutlu.com"
'Sonuç: "İshak Kutlu  "

MsgBox RTrim(Str1), vbOKOnly, "ishakkutlu.com"
'Sonuç: "   İshak Kutlu"

MsgBox Trim(Str1), vbOKOnly, "ishakkutlu.com"
'Sonuç: "İshak Kutlu"

End Sub

Ancak Trim komutu iki kelime arasında birden fazla boşluk varsa bunları tek boşluk olacak şekilde düzeltmez.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "   İshak       Kutlu  "
MsgBox Trim(Str1), vbOKOnly, "ishakkutlu.com"
'Sonuç: "İshak       Kutlu"

End Sub

İki kelime arasında birden fazla boşluk varsa ve sadece bir boşluk olması isteniyorsa aşağıdaki algoritma incelenebilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "   İshak       Kutlu  "

Do While InStr(Str1, "  ") <> 0
    Str1 = Replace(Str1, "  ", " ")
Loop

MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: " İshak Kutlu "

End Sub

Yukarıdaki prosedürde yer alan Do While-Loop bir döngüdür. Basitçe açıklamak gerekirse InStr(Str1, ”  “) <> 0 ifadesi, Str1 içinde iki boşluk (“  ”) arar ve bulursa (yukarıdaki Instr konusunda da bahsedildiği gibi) kesinlikle sıfırdan büyük bir değer döndürür; bulamaz ise sıfır değerini döndürür. InStr(Str1, ”  “) <> 0 koşulu sağlandığı sürece Do While döngüsü devam eder. Do While döngüsü içinde yer alan Str1 = Replace(Str1, ”  “, ” “) ifadesi ise Str1 içinde yer alan çift boşlukları (“  ”) tek boşluk (“ ”) ile değiştirir. Böylece Str1 içinde tek boşluk kalana kadar Do While döngüsü devam edeceği ve Replace komutu da her döngüde iki boşluğu bir boşluğa düşüreceği için boşluk sayısı ardışık olarak (8, 7, 6, 5 vb. şekilde) 1’e kadar düşer. Bu yöntemde Str1 ifadesinin sağında ve solunda da boşluk varsa, bunları 1 boşluğa kadar düşüreceğini, ancak tamamen kaldırmayacağını göz önünde bulundurmak gerekir.

RTrim ve LTrim komutuna alternatif olarak aşağıdaki prosedürleri de inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "   İshak       Kutlu  "

'Aradaki boşlukları teke düşür
Do While InStr(Str1, "  ") <> 0
    Str1 = Replace(Str1, "  ", " ")
Loop

'Soldaki boşlukları kaldır
Do While Left(Str1, 1) = " "
    Str1 = Right(Str1, Len(Str1) - 1)
Loop

'Sağdaki boşlukları kaldır
Do While Right(Str1, 1) = " "
    Str1 = Left(Str1, Len(Str1) - 1)
Loop

MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "İshak Kutlu"

End Sub

Do While döngüsünden yukarıda kısaca bahsedilmişti. Yukarıda soldaki boşlukları kaldıran Do While döngüsünün hemen sağındaki Left(Str1, 1) = ” ” ifadesi, Str1=“    İshak Kutlu” gibi solda boşlukların bulunduğu temsili bir senaryoda, Do While döngüsünün devam edeceği koşulu belirler. Diğer bir ifadeyle Str1 ifadesinin solunda boşluk olduğu sürece Do While döngüsü sonsuza kadar devam eder.

Not: Do While döngüsünün içine Left(Str1, 1) = ” ” koşulunu geçersiz kılacak bir kod eklemezseniz, döngü sonsuza kadar devam edeceği için Excel dosyanızı Görev Yöneticisi aracılığıyla kapatmanız gerekeceğini de belirtmekte yarar var.

Ancak Do While döngüsü içinde yer alan Str1 = Right(Str1, Len(Str1) – 1) ifadesi döngünün koşulunu geçersiz kılacak algoritmadır. Çünkü “    İshak Kutlu” ifadesinin solunda 4 boşluk olup toplam 15 karakterden oluşmaktadır ve karakter sayısı olan Len(Str1), her defasında 1 azaltılarak sağdan Len(Str1)-1 kadar karaktere eşitlenir. İlk döngü tamamlandığında 3 boşluk, ikinci döngü tamamlandığında 2 boşluk vb. süreç soldaki boşluk sıfır olana kadar devam edecektir. Solda boşluk tükendiğinde ise Do While döngüsünün koşulu olan Left(Str1, 1) = ” ” ifadesi de doğrulanamayacağı için döngü sonlanacaktır.

Benzer mantık süreci sağdaki boşlukları kaldıran Do While döngüsü için de geçerlidir.

11.  StrReverse Metodu-Verilerin Tersten Yazılışı

StrReverse methodu ile aşağıda örneklendiği gibi bir String ifadeyi tersten oluşturabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkutlu.com"
Str1 = StrReverse(Str1)

MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "moc.ultukkahsi"

End Sub

12.  Replace Metodu-Karakterleri Bul ve Değiştir

Bir String ifadenin içindeki karakterler, kısmen veya tamamen başka karakter(ler) ile Replace metodu ile değiştirilebilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = " i s h a k k u t l u . c o m "
Str1 = Replace(Str1, " ", "")

MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlu.com"

End Sub

Yukarıdaki yöntem ile Replace komutunun Str1 içinde bulduğu tüm tek boşluk karakterleri kaldırıldı. Ancak Replace komutunun bulduğu karakter sayısı birden fazla ise bunlardan sadece ilkini, ilk ikisini, ilk üçünü vb. değiştirmesi sağlanabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Count:=1)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlU.com"

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Count:=2)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlu.com"

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Count:=100)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlu.com"

End Sub

Replace komutunun belirli bir karakter sayısından sonra başlamasını, başladığı karakter sayısından önceki karakterleri ise kaldırması sağlanabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Start:=2)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "shakkutlu.com"

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Start:=6)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "kutlu.com"

Str1 = "ishakkUtlU.com"
Str1 = Replace(Str1, "U", "u", Start:=100)
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: ""

End Sub

Replace komutunun büyük/küçük harf duyarlılığa göre çalışmasını sağlayabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "iShakkutlu.com"
Str1 = Replace(Str1, "s", "s", Compare:=vbBinaryCompare) 'Büyük/küçük harfe duyarlı değil
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "iShakkutlu.com"

Str1 = "iShakkutlu.com"
Str1 = Replace(Str1, "s", "s", Compare:=vbTextCompare) 'Büyük/küçük harfe duyarlı
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlu.com"

End Sub

Replace komutunu aşağıdaki gibi iç içe yuvalandırarak çoklu şekilde kullanabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String

Str1 = "istanbul"
Str1 = (Replace(Replace(Str1, "ı", "I", Count:=1), "i", "İ", Count:=1))
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "İstanbul"

Str1 = "izmir"
Str1 = (Replace(Replace(Str1, "ı", "I", Count:=1), "i", "İ", Count:=1))
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "İzmir"

Str1 = "ığdır"
Str1 = (Replace(Replace(Str1, "ı", "I", Count:=1), "i", "İ", Count:=1))
MsgBox Str1, vbOKOnly, "ishakkutlu.com"
'Sonuç: "Iğdır"

End Sub

13.  Split Metodu-Bir Veri Kümesini Ayırmak

Split metodu ile String ifadeler boşluklar, virgüller vb. karakterlerden yararlanılarak ayrıştırılabilir.

Private Sub CommandButton1_Click()
Dim Str1 As String
Dim Sonuc() As String

Str1 = "Ankara Eskişehir İzmir Antalya Konya İstanbul Kars Edirne Malatya Hatay"
MsgBox Str1, vbOKOnly, "ishakkutlu.com"

Sonuc() = Split(Str1)

MsgBox Sonuc(0), vbOKOnly, "ishakkutlu.com"
MsgBox Sonuc(1), vbOKOnly, "ishakkutlu.com"
MsgBox Sonuc(2), vbOKOnly, "ishakkutlu.com"

End Sub

Deklarasyonu Sonuc() şeklinde yapılan String değişken (ki esasında bir array-dizi) içerisinde birden fazla String ifade taşıyabilir. Taşıdığı ilk String değer 1’den değil sıfırdan başlar. Split(Str1) ifadesi Str1 değişkeninin taşıdığı 10 kelimelik tek ifadeyi 10 ayrı kelimeye böler. Normal bir String değişken ise 10 ayrı kelimeyi taşıyamayacağı için birden fazla String ifadeyi taşıyabilen ve deklarasyonu Sonuc() şeklinde yapılan dizi tipi değişkenden yararlanılır.

Yukarıdaki Str1 değişkeninden 10 ayrı kelime elde edildiği ve Sonuc() değişkeni de sıfırdan başladığı için 0’dan 9’a bir For-Next döngüsü ile tüm kelimeler elde edilebilir ve bir mesaj kutusunda görüntülenebilir.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer, StrMsg As String
Dim Sonuc() As String

Str1 = "Ankara Eskişehir İzmir Antalya Konya İstanbul Kars Edirne Malatya Hatay"
'MsgBox Str1, vbOKOnly, "ishakkutlu.com"

Sonuc() = Split(Str1)

For i = 0 To 9
    StrMsg = StrMsg & Sonuc(i) & vbNewLine
Next i

MsgBox StrMsg, vbOKOnly, "ishakkutlu.com"

End Sub

Kelime sayısını önceden bilmiyorsak döngünün bitişini de bilemeyiz. Eksik bir döngü durumunda eksik değer elde ederiz, fazla bir döngü durumunda ise Debug hatası alırız.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer, StrMsg As String
Dim Sonuc() As String, KelimeSay As Integer

Str1 = "Ankara Eskişehir İzmir Antalya Konya İstanbul Kars Edirne Malatya Hatay"
'MsgBox Str1, vbOKOnly, "ishakkutlu.com"

Sonuc() = Split(Str1)
KelimeSay = UBound(Sonuc()) + 1
MsgBox KelimeSay, vbOKOnly, "ishakkutlu.com"

For i = 0 To KelimeSay
    StrMsg = StrMsg & Sonuc(i) & vbNewLine
Next i

MsgBox StrMsg, vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıda belirtildiği gibi Sonuc() değişkenin son değeri, kendisi sıfırdan başladığı için kelime sayısından 1 eksik olacaktır. UBound komutu, Sonuc() gibi çoklu değer taşıyabilen bir değişkenin son indeks numarasını (örneğe göre 9 sayısını) verir.  O halde kelime sayısı UBound(Sonuc()) + 1 olacaktır. LBound komutu ise Sonuc() gibi çoklu değer taşıyabilen bir değişkenin ilk indeks numarasını (örneğe göre 0 sayısını) verir. Döngüde i=0 yerine i= LBound(Sonuc()) komutu da kullanılabilir. Ancak yukarıdaki For-Next döngüsünde döngü sonu olarak kelime sayısını temsil eden KelimeSay değişkeni, yani 10 değeri kullanıldığı için hata oluşacaktır.

Karşılaşılacak hata kodu ve metni:

Run-time error ’9’:

Subscript out of range

Yukarıdaki hata mesajında Debug butonuna tıklanırsa, hatanın oluştuğu satıra gidilir.

Eğer fare ile Sonuc(i) yazan ifadede, i harfinin üzerine gelinirse, i=10 gibi bir ifade görülür. Dolayısıyla Sonuc(10) gibi bir değer olmadığı, en son Sonuc(9) değeri olduğu için yukarıdaki hata ile karşılaşıldı. Döngüde yer alan KelimeSay değişkeni, KelimeSay-1 olarak düzeltilirse sorun giderilmiş olur.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer, StrMsg As String
Dim Sonuc() As String, KelimeSay As Integer

Str1 = "Ankara Eskişehir İzmir Antalya Konya İstanbul Kars Edirne Malatya Hatay"
'MsgBox Str1, vbOKOnly, "ishakkutlu.com"

Sonuc() = Split(Str1)
KelimeSay = UBound(Sonuc()) + 1
MsgBox KelimeSay, vbOKOnly, "ishakkutlu.com"

For i = 0 To KelimeSay - 1
    StrMsg = StrMsg & Sonuc(i) & vbNewLine
Next i

MsgBox StrMsg, vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıdaki örneklerde kelimeler arasındaki boşluklardan hareket edilerek ilgili metin ayrı kelimeleri bölündü. Metin içinde yer alan virgüllere göre aynı işlem aşağıdaki şekilde yapılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer, StrMsg As String
Dim Sonuc() As String

Str1 = "Ankara, Eskişehir, İzmir, Antalya, Konya, İstanbul, Kars, Edirne, Malatya, Hatay" 'Burası değişti (1)
Sonuc() = Split(Str1, ",") 'Burası değişti (2)

For i = LBound(Sonuc()) To UBound(Sonuc()) 'Burası değişti(3); buradaki değişikliğin konuyla ilgisi yok
    StrMsg = StrMsg & Sonuc(i) & vbNewLine
Next i

MsgBox StrMsg, vbOKOnly, "ishakkutlu.com"

End Sub

Verileri Excel dosyasında satırlara yazdırmak için aşağıdaki algoritmadan yararlanabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer
Dim Sonuc() As String, j As Integer

Str1 = "Ankara, Eskişehir, İzmir, Antalya, Konya, İstanbul, Kars, Edirne, Malatya, Hatay"
Sonuc() = Split(Str1, ",")

j = 0
For i = LBound(Sonuc()) To UBound(Sonuc())
    j = j + 1
    Range("A" & j).Value = Sonuc(i)
Next i

End Sub

Değeri döngü dışında sıfırdan başlayan j gibi bir değişkenin döngü içinde değerinin ardışık olarak 1 artması, i ifadesinin sıfırdan başlamasından kaynaklanmaktadır. Çünkü Range(“A” & 0) gibi bir satır olmayacağı için hata oluşur. Bu yüzden i değeri sıfır olduğunda j değeri ise (j=j+1 olduğu için) 1 olur; i=1 iken j=2, i=2 iken j=3 vb. devam eder. Böylece ayrıştırılan her kelime alt alta satırlara yazdırılmış olur.

Ancak Ankara kelimesinden sonra gelen kelimelerin solunda bir boşluk vardır. Bu durum kelimelerin ayrıştırılmadan önce aralarında boşluk olmasından kaynaklanmaktadır. Bu sorunu çözmek için yukarıdaki algoritmaya aşağıdaki gibi bir satırlık ilave yapılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer
Dim Sonuc() As String, j As Integer

Str1 = "Ankara, Eskişehir, İzmir, Antalya, Konya, İstanbul, Kars, Edirne, Malatya, Hatay"

Sonuc() = Split(Str1, ",")

j = 0
For i = LBound(Sonuc()) To UBound(Sonuc())
    j = j + 1
    Range("A" & j).Value = Sonuc(i)
    Range("A" & j).Value = LTrim(Range("A" & j).Value)
Next i

End Sub

Yukarıdaki örneklerde 10 kelimelik bir metin 10 ayrı kelimeye bölünmüştü. Eğer 10 kelimelik bir metin 4 ayrı parçaya bölünmek istenirse aşağıdaki şekilde yapılır.

Private Sub CommandButton1_Click()
Dim Str1 As String, i As Integer
Dim Sonuc() As String, j As Integer

Str1 = "Ankara, Eskişehir, İzmir, Antalya, Konya, İstanbul, Kars, Edirne, Malatya, Hatay"
Sonuc() = Split(Str1, ",", 4)

j = 0
For i = LBound(Sonuc()) To UBound(Sonuc())
    j = j + 1
    Range("A" & j).Value = Sonuc(i)
    Range("A" & j).Value = LTrim(Range("A" & j).Value)
Next i

End Sub

14.  Bir Verideki Sayısal ve Alfabetik Karakterleri Ayırmak

Eğer String bir ifade içinde yer alan sayısal ve sayısal olmayan (alfabetik) karakterleri ayrıştırmak istiyorsanız aşağıdaki algoritmadan yararlanabilirsiniz.

Private Sub CommandButton1_Click()
Dim Str1 As String, NumberStr As String, OnlyStr As String, i As Integer

Str1 = "is12ha3kk4utl5u.c6om7"
MsgBox Str1, vbOKOnly, "ishakkutlu.com"

For i = 1 To Len(Str1)
    If IsNumeric(Mid(Str1, i, 1)) = True Then
        NumberStr = NumberStr & Mid(Str1, i, 1)
    Else
        OnlyStr = OnlyStr & Mid(Str1, i, 1)
    End If
Next i

MsgBox NumberStr, vbOKOnly, "ishakkutlu.com"
'Sonuç: "123456"

MsgBox OnlyStr, vbOKOnly, "ishakkutlu.com"
'Sonuç: "ishakkutlu.com"

End Sub

 

 

İshak Kutlu, VBA Notları

4 Yorum

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube