Range Nesnesi-4 (Hücrelerdeki Verilerin Aranması ve Değiştirilmesi-Find, Replace, FindNext Metotları)

R

VBA|Seviye|Temel

1.  Find Metodunu Tanımak

Bir çalışma sayfasında hücrelerde bulunan verilerin içinde belirli bir veriyi aratmak için Find metodu en sık kullanılan yöntemlerden biridir. Find metodunun en basit haliyle kullanımı aşağıda yer almaktadır.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A:A").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A kolonunun tümünde yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürün aşağıdaki gibi bir veri seti için çalıştırılacağı varsayılmıştır.

Prosedür çalıştırıldıktan sonra sonuç aşağıdaki gibi olacaktır.

Reset butonu, verilerde manuel olarak değişiklik yapıldığında veri setini önceki haline geri döndürmek için ilave edilmiştir.

Private Sub CommandButton2_Click()
Dim Ws As Worksheet

'Reset
Set Ws = ThisWorkbook.Worksheets(1)
ThisWorkbook.Worksheets(2).Columns("A:F").Copy Ws.Columns("A:F") 'Ham verileri sayfa2 den al.

End Sub

Sayfa2’nin ekran görüntüsü aşağıdadır.

2.  Find Metodu ile Bir Sütunda Arama Yapmak

Yukarıdaki prosedürde yer alan “Ws.Range(“A:A”)” ifadesi aramanın A sütununda yapılacağını temsil eder. Dilerseniz “Ws.Range(“A:A”)” ifadesi yerine, aşağıda gösterildiği gibi “Ws.Columns(“A”)” ifadesini de kullanabilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Columns("A").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A kolonunun tümünde yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürün sonucu bir önceki prosedürün sonucu ile aynı olacaktır. Ayrıca aramanın yapılacağı kolonda, satır aralığını aşağıdaki şekilde belirleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
                        'Değişiklik
                        'sadece
                        'alttaki
                        'satırda
                        'yapıldı.
Set MyFinder = Ws.Range("A5:A10").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A kolonunun 5 ile 10. satırları arasında yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Ws.Range(“A:A”) (veya Ws.Columns(“A”))  ifadesi Ws.Range(“A5:A10”) olarak değiştirilmek suretiyle arama yapılacak alan daraltılmış oldu.

Sonuç aşağıdaki gibi olacaktır.

3.  Find Metodu ile Bir Satırda Arama Yapmak

Find metodu ile bir satırda arama yapmak için aşağıdaki yöntemi kullanabilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Rows("3").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; ; örneğe göre arama 3 no.lu satırın  tümünde yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürde arama 3 no.lu satırda yapılmaktadır. Diğer bir ifadeyle arama, A3 ile en son kolona karşılık gelen (başlığın ismi XXXX olduğu varsayımında) XXXX3 kolonu arasında kalan 3 no.lu satırda yapılmaktadır. Prosedürün sonucuna ilişkin ekran görüntüsü aşağıdadır.

Find metodu ile bir satırda yapılacak aramanın sınırlarını, aşağıda gösterildiği gibi Range yöntemini kullanarak belirleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A3:F3").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; ; örneğe göre arama A3 ile F3 arasındakli satırlarda yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürün sonucu bir önceki prosedürün sonucu ile aynıdır.

4.  Find Metodu ile Sütunlarda ve Satırlarda Arama Yapmak

Arama yapılacak alanı belirli bir satırla veya kolonla sınırlı tutmak zorunda değilsiniz. Dilerseniz arama yapılacak alana, aşağıdaki prosedürde gösterildiği gibi satırların yanı sıra kolonları da dahil edebilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

'Alttaki satırda da değişiklik yapıldı.
'Volvo yerine Benzin ifadesi aratılacak.
StrArama = "Benzin" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
                        'Değişiklik
                        'alttaki
                        'satırda
                        'yapıldı.
Set MyFinder = Ws.Range("A5:C10").Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A ve C kolonları arasındaki kolonların 5 ile 10. satırları arasında yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Veri setinde aramanın yapılacağı alan aşağıdaki ekran görüntüsünde işaretlenmiştir.

Prosedürün çalıştırılması sonrası sonuç aşağıdaki gibi olacaktır.

5.  Find Metodu ile Arama Yapılacak Alanın Yönetimi

Bir sütundaki arama yapılacak alanı dilerseniz aşağıda gösterildiği gibi daha esnek bir şekilde de yönetebilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
                        'Değişiklik
                        'alttaki
                        'satırda
                        'yapıldı.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A kolonunun 2. satırı ile son satırı arasında yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürde Ws.Range(“A” & 2 & “:A” & Rows.Count) ifadesinde yer alan 2 yerine, IlkSatir=2 gibi Long veya Integer tipi bir değişken kullanarak,  söz konusu ifadeyi Ws.Range(“A” & IlkSatir & “:A” & Rows.Count) şeklinde  yazabilirsiniz. Rows.Count ifadesi ise daha önce belirtildiği gibi sayfada bulunan son satırı (ki 1 milyondan fazladır) temsil eder. Özetle yukarıdaki prosedürde arama A2 ile A’nın (Excel’in izin verdiği) son satırı arasında yapılır. Yukarıdaki prosedürün çalıştırılması sonrası sonuç aşağıdaki gibi olacaktır.

Aramanın bir sütunda veya satırda yapılması fark etmeksizin, arama alanını aşağıda gösterildiği gibi daha verimli bir şekilde yönetebilirsiniz.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Volvo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
                        'Değişiklik
                        'alttaki
                        'satırda
                        'yapıldı.
Set MyFinder = Ws.Range(Ws.Cells(2, 4), Ws.Cells(2, Columns.Count)).Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama D (4.) kolondan başlamak üzere, 2. satırın tümünde yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulundu!", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürde yer alan (ki konuyu açmama sebep olan özellik) “Ws.Range(Ws.Cells(2, 4), Ws.Cells(2, Columns.Count))” ifadesini açıklamak için “Ws.Range(Ws.Cells(2, 4), Ws.Cells(2, 7))” olarak değiştirelim. Son ifade üzerinden konuşulacak olursa, Excel’de Cells(2, 4), yani D2 hücresini ve Cells(2, 7), yani G2 hücresini işaretleyin. Her iki koordinatın da satır numarasının 2 olduğuna dikkat edin. İşaretlediğiniz birinci hücreden ikinci hücreye doğru 2 no.lu satır boyunca hücreleri fare ile seçiniz. Arama yapılacak alan D kolonunun 2. satırından G kolonunun 2. satırına kadar olan (D2, E2, F2 ve G2 olmak üzere 4 hücreden oluşan) tek satırlık alandır. Örneği “Ws.Range(Ws.Cells(2, 4), Ws.Cells(3, 7))” olarak değiştirelim. Bu örneğe göre arama yapılacak alan D kolonunun 2. satırından G kolonunun 3. satırına kadar olan (D2, E2, F2, G2, D3, E3, F3 ve G3 olmak üzere 8 hücreden oluşan) iki satırlık alandır.

Yukarıdaki prosedürde arama, 4 no.lu (D) kolondan başlamak üzere, 2 no.lu satırın tümünde yapılacağı için söz konusu alanda aratılan “Volvo” değeri bulunamayacaktır. Yukarıdaki yöntem ile (özellikle karmaşık ve büyük projeler üretmeye başladığınızda ihtiyaç duyabileceğiniz) arama alanının yönetimini kolaylıkla yapabileceğinizi vurgulamakta yarar var.

6.  Find Metodu ile Aranan İfadenin Satır ve Sütun Numarasını Bulmak

Find metodu ile bulunan hücrenin satır ve sütun numaraları aşağıdaki şekilde elde edilebilir.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama) 'Aramanın yapıldığı bölüm; örneğe göre arama A kolonunun 2. satırı ile son satırı arasında yapılacak
'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Prosedürün çalıştırılması sonrası sonuç aşağıdaki gibi olacaktır.

Dikkat edilirse 14 no.lu satırda da Audi ifadesi bulunmakla birlikte, kullandığımız Find metodu 5 no.lu satırı bulmuştur. Konuya ilişkin farklı senaryolar takip eden başlıklar altında ele alınacaktır.

7.  Find Metodunun Genişletilmesi

Yukarıda Find metodu en sade haliyle tanıtılmıştır.  Söz gelimi yukarıdaki örneklerde arama işlemi, arama alanında daima yukarıdan aşağıya doğru yapılmaktadır. Peki aramayı aşağıdan yukarıya doğru yapmak mümkün mü? Aramada, satırlara veya sütunlara öncelik verilebilir mi? Büyük-küçük harf duyarlılığına göre arama yapılabilir mi? Hücre değeri yerine, hücre formülünün veya hücreye eklenmiş yorumların içinde arama yapılabilir mi? Arama yapılacak ifadenin (örneğin aratılan ifade “Volvo” iken), hücrelerde bulunan verilerde (hücre değerinin “Volvo” olması gibi) tam olarak eşleşmesi kriteri yerine, (hücre değerinin “Volvolar” olması gibi) kısmen eşleşmesi kriteri kullanılabilir mi?

Find metodunun en sık kullanılan operatörlerinin ilave edildiği örnek prosedür aşağıdadır.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByRows, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürün sonucu bir önceki prosedürün sonucu ile aynıdır. Değişikik “Set MyFinder” satırında yapılmıştır. Bu bölüm daha önce de belirtildiği gibi aramanın yapıldığı esas satırdır. ” StrArama,” ifadesinin hemen sağındaki “ _” (alt tire) işareti komut satırının bitmediğini, alt satırdan devam ettiğini ifade eder. “SearchDirection” ifadesi ile başlayan satırda yer alan operatörlerin değerlerini değiştirerek yapılacak aramayı özelleştirebiliriz. Ayrıca yukarıdaki prosedürde “SearchDirection” satırında yer alan ayarlar varsayılan ayarlardır.

Söz konusu operatörlerin alabileceği değerler aşağıdaki tabloda gösterilmiştir.

“SearchDirection:=xlNext” komutu, aramanın kolonlar için yukarıdan aşağıya, satırlar için soldan sağa doğru yapılacağını ifade eder.

“SearchDirection:= xlPrevious” komutu, aramanın kolonlar için aşağıdan yukarıya, satırlar için sağdan sola doğru yapılacağını ifade eder.

“MatchCase:=False” komutu, aramada büyük-küçük harf duyarlılığının olmayacağını ifade eder.

“MatchCase:=True” komutu, aramada büyük-küçük harf duyarlılığının olacağını ifade eder.

“SearchOrder:=xlByRows” komutu, aramaya önce satırlardan başlanacağını ifade eder.

“SearchOrder:= xlByColumns” komutu, aramaya önce sütunlardan başlanacağını ifade eder.

“LookIn:=xlValues” komutu, aramanın hücre değerlerinde yapılacağını ifade eder.

“LookIn:= xlFormulas” komutu, aramanın hücre formüllerinde yapılacağını ifade eder.

“LookIn:= xlComments” komutu, aramanın hücre yorumlarında yapılacağını ifade eder.

“LookAt:=xlWhole” komutu, aramanın tam eşleşme kriterine göre yapılacağını ifade eder.

“LookAt:= xlPart” komutu, aramanın kısmi eşleşme kriterine göre yapılacağını ifade eder.

8.  Find Metodu ile Aşağıdan Yukarıya veya Sağdan Sola Doğru Arama Yapmak

Bir kolonda arama önceliğinin aşağıdan yukarıya doğru olması için “SearchDirection” operatöründe “xlNext” yerine “xlPrevious” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlPrevious, MatchCase:=False, SearchOrder:=xlByRows, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Benzer şekilde bir satırda arama önceliğinin sağdan sola doğru olması için aşağıda gösterildiği gibi “SearchDirection” operatöründe “xlNext” yerine “xlPrevious” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range(Ws.Cells(5, 1), Ws.Cells(5, Columns.Count)).Find(What:=StrArama, _
                SearchDirection:=xlPrevious, MatchCase:=False, SearchOrder:=xlByRows, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

9.  Find Metodu ile Büyük-Küçük Harf Duyarlığına Göre Arama Yapmak

Bir aramayı büyük-küçük harf duyarlılığına göre gerçekleştirmek için “MatchCase” operatöründe “False” yerine “True” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Bmw" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=True, SearchOrder:=xlByRows, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürde “MatchCase:” operatörünün değerini “False” yaparsanız, yani büyük-küçük harf duyarlılığı olmadan arama yaptırırsanız “Bmw” ifadesini bulacaktır.

10.  Find Metodu ile Arama Önceliğini Satırlara veya Sütunlara Vermek

Arama önceliğini satırlara göre gerçekleştirmek için “SearchOrder” operatöründe “xlByRows” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Benzin" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":D" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByRows, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Arama önceliğini sütunlara göre gerçekleştirmek için “SearchOrder” operatöründe “xlByColumns” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Benzin" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":D" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByColumns, LookIn:=xlValues, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

11.  Find Metodu ile Hücre Değeri, Formülü veya Yorumu İçinde Arama Yapmak

Yukarıdaki örneklerin tümünde ”LookIn” operatörünün değeri “xlValues” olduğu, yani arama içeriği hücre değeri olarak belirtilmiş olduğundan, aşağıdaki prosedürlerde sadece “xlFormulas” ve “xlComments” değerleri kullanılacaktır.

Arama içeriğini formüllere göre gerçekleştirmek için “LookIn” operatöründe “xlFormulas” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "=A7" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByColumns, LookIn:=xlFormulas, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Arama içeriğini yorumlara göre gerçekleştirmek için “LookIn” operatöründe “xlComments” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "ishakkutlu.com" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByColumns, LookIn:=xlComments, LookAt:=xlWhole) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

12.  Find Metodu ile Kısmi Eşleşme Kriterine Göre Arama Yapmak

Yukarıdaki örneklerin tümünde ”LookAt” operatörünün değeri “xlWhole” olduğu, yani arama kriteri tam eşleşme olarak belirtilmiş olduğundan, aşağıdaki prosedürde sadece “xlPart” değeri kullanılacaktır.

Aramayı tam eşleşme kriteri yerine kısmen eşleşme kriterine göre gerçekleştirmek için “LookAt” operatöründe “xlPart” değerini kullanmanız yeterli olur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, MyFinder As Range, StrArama As String
Dim SatirNo As Long, SutunNo As Long

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Toyo" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
Set MyFinder = Ws.Range("A" & 2 & ":A" & Rows.Count).Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByColumns, LookIn:=xlValues, LookAt:=xlPart) 'Aramanın yapıldığı bölümün özelleştirilmesi

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    SatirNo = MyFinder.Row
    SutunNo = MyFinder.Column
    MsgBox """" & StrArama & """" & " isimli veriye ilişkin bulunan hücrenin satır numarası " & SatirNo & ", sütun numarası ise " & SutunNo & " olarak tespit edilmiştir.", vbOKOnly + vbInformation, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

13.  Replace Metodunun Kullanımı

Replace metodu birçok yönden Find metoduna benzer. Ancak Replace metodu belirli bir değeri bulunca durmaz; arama alanında eşleşmenin sağlandığı tüm hücrelerin değerlerini metotta belirtilen değer ile değiştirir.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet, StrArama As String, StrDegistir As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi" 'Aranacak değerin bulunduğu satır; alttaki satırda What:= ifadesinin karşısında yer alacak.
StrDegistir = "Ferrari" 'Aranacak değerin yerine geçecek olan satır; alttaki satırda Replacement:= ifadesinin karşısında yer alacak.
Ws.Range("A" & 2 & ":A" & Rows.Count).Replace What:=StrArama, Replacement:=StrDegistir, _
                MatchCase:=False, SearchOrder:=xlByColumns, LookAt:=xlWhole
                
End Sub

Yukarıdaki prosedürde yer alan Replace metoduna ilişkin (MatchCase, SearchOrder vb.) operatörlerin tümü Find metodunda açıklanan özelliklere sahiptir. Söz konusu Replace prosedürünün sonucu aşağıdaki resimde gösterilmiştir.

14.  FindNext Metodunun Kullanımı

Find metodu, daha önce de bahsedildiği gibi aradığı değeri ilk bulduğunda durur; arama alanına dahil bir sonraki hücrede arama kriterine uyan başka bir değerin olup olmadığını sorgulamaz. FindNext metodu ise arama kriterine uyan değeri bulduğunda, bir sonraki hücrede de sorgulama yapar. Ancak üçüncü  (ve sonraki) sorgulamayı yapmaz. Bu sebeple Find, FindNext metotları ile birlikte bir döngü kullanılarak, arama alanı tamamlanıncaya kadar sonraki hücrelerde arama kriterine uyan başka bir değerin olup olmadığını sorgulayan aşağıdaki gibi bir algoritma oluşturulur.

Private Sub CommandButton1_Click()
Dim Ws As Worksheet
Dim MyFinder As Range, MyRng As Range, StrArama As String
Dim IlkAdres As String, SonrakiAdres As String

Set Ws = ThisWorkbook.Worksheets(1)

StrArama = "Audi"
Set MyRng = Ws.Range("A" & 2 & ":A" & Rows.Count)
Set MyFinder = MyRng.Find(What:=StrArama, _
                SearchDirection:=xlNext, MatchCase:=False, SearchOrder:=xlByColumns, LookIn:=xlValues, LookAt:=xlWhole)

'Arama sonucunun sorgulandığı bölüm
If Not MyFinder Is Nothing Then 'Arama sonucu boş değilse, yani aranan ifade bulunduysa koşulu
    IlkAdres = MyFinder.Address
    'MsgBox Replace(IlkAdres, "$", ""), vbOKOnly, "ishakkutlu.com"
    Do
        SonrakiAdres = MyFinder.Address
        MsgBox Replace(SonrakiAdres, "$", ""), vbOKOnly, "ishakkutlu.com"
        Set MyFinder = MyRng.FindNext(MyFinder)
        SonrakiAdres = MyFinder.Address
    Loop While IlkAdres <> SonrakiAdres
    
    MsgBox "Arama tamamlandı!", vbOKOnly, "ishakkutlu.com"
Else 'Arama sonucu boş ise, yani aranan ifade bulunamadıysa koşulu
    MsgBox """" & StrArama & """" & " verisi bulunamadı!", vbOKOnly + vbExclamation, "ishakkutlu.com"
End If

End Sub

Yukarıdaki prosedürde ilk bölüm (arama sonucunun sorgulandığı bölüme kadar olan kısım) Find metodu ile oldukça benzerdir. Eğer ilk bölümde aratılan ifade bulunduysa, sonraki hücrelerde de aramaya devam etmek için ilave sorgulamalara ilişkin kodlar, aranan ifadenin bulunması koşulunun içine konumlandırılmıştır. IlkAdres bulunan ilk değerin hücre adresini, SonrakiAdres ise (döngü içindeki ilk satırdaki-üstteki ilk değeri IlkAdres’e eşit olmak üzere) ilk bulunan hücreden sonra tespit edilen hücre adresini temsil etmektedir. Do-Loop While bir döngü olup döngünün devam etmesi koşulu IlkAdres’in SonAdres’e eşit olmamasıdır. Do-Loop While döngüsünde arama alanının sonuna gelindiğinde; arama, arama alanının tekrar başından devam edeceği, dolayısıyla SonrakiAdress, IlkAdres’e eşit olacağı için döngü sonlanmış olacaktır.

 

 

İshak Kutlu, VBA Notları

Yorum Yap

İ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