Program
Birkaçdan fazla VBA makrosu yazdıysanız, muhtemelen bir hücrede belirli bir metnin olup olmadığını kontrol etmeniz gereken o ana gelmişsinizdir. VBA’de InStr, her yerde kullanmaya başladığınız işlevlerden biridir. Bir metnin başka bir metin içinde nerede göründüğünü söyler. Bir metnin hücrede olup olmadığını kontrol etmek, metin içindeki değerleri ayrıştırmak ya da metin kalıplarına bağlı koşullu mantığı yönlendirmek için kullanabilirsiniz.
Bu rehberde, InStr sözdizimini, birkaç örneği, karşılaştırma kiplerinin nasıl çalıştığını (insanların gerekenden fazla takıldığı kısım) ve gerçekten tekrar kullanacağınız bazı kalıpları anlatacağım.
VBA’ya geçmeden önce sağlam bir temel oluşturmak için Excel Temelleri yetkinlik yolumuza başlamanızı veya biraz deneyiminiz varsa, işlevlerin veri analizinde verimliliği nasıl artırdığını öğrenmek için Gelişmiş Excel İşlevleri kursumuzu almanızı öneririm.
VBA InStr İşlevi Nedir?
InStr, bir dizenin içinde başka bir dizenin ilk geçtiği konumu döndüren bir VBA işlevidir.
Sonuçlar şu şekilde davranır:
- Eşleşme bulunursa bir sayı döndürür (eşleşmenin başladığı konum)
- Hiçbir şey bulamazsa
0döndürür
Örneğin, “cat” bir dizede 5. konumda geçiyorsa, 5 alırsınız. Orada değilse 0 alırsınız.
VBA InStr Sözdizimi
Tam InStr sözdizimi şöyledir:
InStr([start], string1, string2, [compare])
Burada:
-
start(isteğe bağlı): VBA’ya aramaya nereden başlayacağını söyler. Atlanırsa VBA 1. konumdan başlar. -
string1(zorunlu): İçinde arama yaptığınız tam metin. -
string2(zorunlu): Bulmaya çalıştığınız metin. -
compare(isteğe bağlı): Karşılaştırmanın nasıl yapılacağını tanımlar (büyük/küçük harf duyarlı olup olmadığı). Bunu boş bırakırsanız, VBA varsayılan karşılaştırma kipini kullanır, genellikle büyük/küçük harf duyarlıdır.
Daha basit bir sürüm için start ve compare bağımsız değişkenlerini yok sayabilirsiniz (InStr(string1, string2)). Ancak compare bağımsız değişkenini kullanmaya karar verirseniz, start bağımsız değişkenini de sağlamanız gerekir.
VBA InStr Nasıl Çalışır
InStr’ı soldan sağa, karakter karakter bir cümleyi okumak gibi düşünün.
İşlev string1 ile başlar, onu tarar ve string2’nin ilk eşleştiği yeri arar. Eşleşmeyi bulduğu anda durur ve başladığı konumu döndürür.
“Eşleşme” konumu önemlidir çünkü VBA saymaya 0’dan değil 1’den başlar. Yani bir dizenin ilk karakteri 1. konum, ikincisi 2. ve bu şekilde devam eder.
VBA InStr Dönüş Değerlerinin Açıklaması
InStr işlevinin sonucunu yorumlamak basittir. Şunlardan birini alırsınız:
-
Pozitif sayı: Eşleşme bulunursa, sayı eşleşmenin nerede başladığını gösterir.
-
0: Dizede hiçbir yerde eşleşme yoksa
Ancak, giriş dizeleriniz Null ise işlev Null döndürür. Bunu basit makrolar için yok sayabilirsiniz ama farkın bir koşulu sessizce bozabileceğini bilmeye değer.
Temel VBA InStr Örnekleri
Şimdi VBA InStr işlevinin nasıl kullanılacağına dair birkaç örnek göstereyim.
Bir cümlede bir kelimeyi bulma
“Deliver before noon” notunun içinde “before” kelimesi olup olmadığını kontrol etmek için.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Yukarıdaki VBA’nın sonucu 9’dur; çünkü “before” 9. karakterde başlar.
Bir karakterin var olup olmadığını kontrol etme
Belirli bir dizede “0” karakterinin olup olmadığını kontrol etmek için şu VBA’yı kullanın:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
Bu durumda 0’dan büyük herhangi bir sonuç, karakterin bulunduğu anlamına gelir.
Bir dizenin başından itibaren arama yapma
Bir dizenin başından arama yapmak için başlangıç konumunu belirtmenize gerek yoktur; böylece 1’den başlar. Aksi belirtmediğiniz sürece varsayılan her zaman budur.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
VBA InStr’ı If İfadelerinde Nasıl Kullanılır
Gerçek bir elektronik tabloda çalışırken yalnızca bir sayı aramazsınız; bir karar vermeye çalışırsınız. InStr’ı kullanmanın en yaygın yolu, verileri filtrelemek için bir If ifadesinin içinde kullanmaktır.
Bu eğitim boyunca, sütunları ID, CustomerName, Email, City ve OrderNotes olan bir örnek veri kümesi olan Orders’ı kullanacağız.
If InStr(...) > 0 Then
InStr hiçbir şey bulamadığında 0 döndürdüğü için, sonuç 0’dan büyük bir sayı döndürdüğünde var olup olmadığını kontrol ederiz.
Aşağıdaki örnekte, OrderNotes sütununa (5. sütun) bakar. “Fragile” kelimesini bulursa 6. sütuna “Handle Carefully” yazar.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Anahtar kelimeler için koşullu kontroller ve metin filtreleme
InStr işlevini, özellikle ifade biraz değişiyorsa, dizelerde anahtar kelimeleri kontrol etmek için de kullanabilirsiniz. Örneğin, aşağıdaki kod notta “Call” geçip geçmediğini kontrol eder ("Call on arrival" veya "Call before delivery" gibi). Ardından işaretler ve 6. sütuna “Cal Customer” etiketini ekler.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
VBA InStr’da Büyük/Küçük Harf Duyarlılığı ve Karşılaştırma Kipleri
Varsayılan olarak InStr büyük/küçük harf duyarlıdır (vbBinaryCompare olarak adlandırılır). Diyelim “chicago” arıyorsunuz ama veride “Chicago” yazıyor; InStr 0 döndürecektir.
Bunu düzeltmek için compare bağımsız değişkenini kullanırsınız; burada:
-
vbBinaryCompare(Varsayılan): büyük/küçük harf duyarlı (“A” “a” ile aynı değildir.) -
vbTextCompare: büyük/küçük harf duyarsız; “A” “a” ile aynıdır.
Aşağıdaki örnekte, “fragile” (küçük harf) ifadesini “Fragile items” içinde aradığı için InStr 0 döndürür.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Buna karşın vbTextCompare kullanmak, aynı aramada büyük/küçük harfi yok sayarak 1 döndürür.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
Başlangıç Konumu ile VBA InStr
Bazen aramaya dizenin başından başlamak istemezsiniz. start bağımsız değişkeni VBA’ya aramaya nereden başlayacağını söyler.
Aşağıdaki örnekte start bağımsız değişkeni 10 olarak ayarlanmıştır; bu nedenle VBA birinci yerine 10. karakterden itibaren aramaya başlar. Daha sonra dizenin ilerleyen kısmında "delivery" ifadesini bulur.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Yukarıdaki örneğin sonucu, "delivery" ifadesinin başladığı konum olan 31’dir.
Bu yöntem, bir şeyin ikinci geçişini istediğinizde ya da tekrar eden kalıplarla çalışırken bilinen bir ön eki yok saymak istediğinizde kullanışlıdır.
VBA InStr ve InStrRev Karşılaştırması
Öğrendiğiniz üzere InStr soldan sağa arar. Ancak InStrRev sağdan sola arar.
Örneğin, e-postadaki son noktayı bulmak için InStrRev kullandık. Sonuç, “com”dan önceki noktanın konumu olan 18’dir.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev’i, bir şeyin son geçişine ihtiyaç duyduğunuzda veya dosya adları, e-postalar ya da yollarla çalışırken daha kullanışlı bulacaksınız.
Yaygın VBA InStr Kullanım Alanları
Artık VBA InStr işlevinin nasıl çalıştığına dair örneklere baktığımıza göre, yaygın kullanım alanlarına göz atalım.
Bir hücrenin anahtar kelime içerip içermediğini kontrol edin
Diyelim müşteri siparişlerinden oluşan bir veri kümeniz var ve belirli bir işlem gerektiren siparişleri işaretlemeniz gerekiyor. Kod, OrderNotes sütununa bakar ve “noon” içeren her şeyi işaretler.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
E-posta biçimine benzer metni doğrulayın
InStr işlevini geçerli e-posta biçimlerini hızlıca kontrol etmek için de kullanabilirsiniz. Örneğin, aşağıdaki kod e-postada @ olup olmadığını kontrol eder ve 6. sütunda “Valid Email Format” döndürür.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Virgül veya kısa çizgi gibi ayırıcıları tespit etme
InStr işlevini metinde kısa çizgi, virgül veya eğik çizgi olup olmadığını kontrol etmek için kullanabilirsiniz. Aşağıdaki örnekte, kod OrderNotes (E sütunu) içinde döngü yapar, metinde virgül olup olmadığını kontrol eder, ardından F sütununa bir sonuç yazar.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
VBA InStr ile Yapılan Yaygın Hatalar
Deneyimli bir geliştirici olsanız bile, InStr işleviyle kodunuzun beklenmedik şekilde davranmasına neden olan bazı sorunlarla karşılaşabilirsiniz. Aşağıdakiler, benim karşılaştığım yaygın sorunlardır ve nasıl çözebileceğiniz:
-
InStr’ın 1 tabanlı olduğunu unutmak: Konumların 0 değil 1’den başladığını her zaman hatırlayın. Python veya JavaScript’ten geliyorsanız bu ilk başta garip gelebilir.
-
InStr’ı Doğru/Yanlış gibi ele almak: Unutmayın,
InStrTrueveyaFalsedöndürmez. Bir şey bulmak istiyorsanız, sonucun> 0olup olmadığını kontrol etmelisiniz. -
Büyük/küçük harf duyarlılığını yok saymak: Bildiğiniz gibi
InStrvarsayılan olarak büyük/küçük harf duyarlıdır. Harf duyarlılığı önemli değilse,comparebağımsız değişkenindevbTextComparekullanarak bunu belirtin. -
string1 ve string2’yi karıştırmak: İlk bağımsız değişkenin arama yapılan yer olduğunu, ikincisinin aranan şey olduğunu unutmayın. Şu şekilde arama yaparsanız
InStr(SearchTerm, FullText), her zaman0alırsınız.
VBA InStr ve Diğer VBA Dize İşlevleri
InStr genellikle bir metin içinde bir dizenin nerede olduğunu gösterdiği için, onu diğer dize işlevleriyle karşılaştıralım.
InStr ve Like
Like işleci, desen eşleştirme için kullanılır. Örneğin, aşağıdaki kod “Fragile”ı kontrol eder ancak “öncesinde veya sonrasında herhangi bir şey” anlamına gelen * desenini kullanır.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
InStr’ı yalnızca bir metnin var olup olmadığını bilmeniz gerekiyorsa, Like’ı ise karmaşık desenlerde metni kontrol etmeniz gerekiyorsa kullanın.
InStr ve Replace
InStr’ı bir hücredeki tüm değeri değiştirmek için kullanabilseniz de, Replace işlevi hücre içindeki belirli metni değiştirir.
Aşağıdaki örnekte Replace işlevi metin içinde “Fragile”ı doğrudan “Handle Carefully” ile değiştirir.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr ve Mid
Mid işlevi bir dizeden metin çıkarmak için kullanılır. Bu nedenle, konumu elde ettikten sonra metni çıkarmak için Mid’i sıklıkla InStr ile birlikte kullanırsınız.
Aşağıdaki kod veri kümesindeki e-postalardan alan adını çıkarır. InStr işlevi e-postada "@" işaretinin nerede göründüğünü bulur, ardından Mid ondan sonra çıkarmaya başlar. Kod, alan adını H sütununa yazarak biter.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr ve Split
Split işlevi, bir ayırıcı belirterek metni parçalara bölmek için kullanılır.
Aşağıdaki örnekte kod, A sütunundaki her satırı okur, virgül olup olmadığını kontrol eder ve ardından metni iki parçaya böler. Name → B sütununa ve City → C sütununa yazar.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Only split if a comma exists
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
VBA InStr Kullanımı için En İyi Uygulamalar
VBA’de hatalar almamak için, bana zaman kazandıran şu en iyi uygulamaları öneririm:
-
Büyük/küçük harf önemli değilse vbTextCompare kullanın: Çoğu gerçek veri büyük/küçük harf açısından tutarlı değildir; varsayılan karşılaştırma
bağımsız değişkeninegüvenirseniz eşleşmeleri kaçırabilirsiniz. -
Net mantık için “If” ile birleştirin:
InStrtek başına size sadece bir sayı verdiğinden, her zaman bir değer döndürecek bir mantık eklemeye çalışın. -
> 0 olup olmadığını kontrol edin; gerçek konumlara yalnızca gerçekten konuma ihtiyacınız varsa bakın.
-
Ayrıştırmayı okunabilir tutun. Çok fazla işlevi tek satırda üst üste yığmayın.
Sonuç
InStr basittir, ancak her yerde kullanırsınız. Bir dizenin başka bir dize içinde nerede olduğunu verir ve bu tek sayı, VBA’de bir şeyin var olup olmadığı, nereden çıkarım yapılacağı ve bir makronun sırada ne yapacağı gibi birçok kararı yönlendirir. Tek başına sadece bir aramadır. Mid, Replace veya hatta Split gibi işlevlerle birleştirildiğinde, gerçekten işi bitiren bir iş akışının parçası olur.
Gelişmiş analitiği ustalıkla öğrenmek için Excel’de Veri Analizi kursumuzu alın. Ayrıca, veri dönüşümü ve M dilini öğrenmek için Excel’de Orta Düzey Power Query kursumuzu da alın.
SSS
InStr gerçekte ne döndürür?
Eşleşmenin başladığı konumu döndürür. Hiçbir şey bulunamazsa 0 döndürür.
InStr büyük/küçük harf duyarlı mı?
Evet, InStr varsayılan olarak büyük/küçük harf duyarlıdır. ”Fragile” ve ”fragile” farklı kabul edilir. Büyük/küçük harfe duyarlı olmayan bir karşılaştırma istemiyorsanız vbTextCompare kullanın.
InStr’ın 1 tabanlı olması ne anlama geliyor?
Bir dizenin ilk karakteri 1. konumdur, 0 değil. Bu, sonucu diğer işlevlerde kullandığınızda önemlidir.
Değerlerden biri Null olursa ne olur?
Sonuç da 0 değil, Null olacaktır.
InStr ile InStrRev arasındaki fark nedir?
InStr soldan sağa arar, InStrRev ise sağdan sola başlar. Son geçiş önemli olduğunda ikincisini kullanın.
