Fungsi
Find adalah salah satu fitur yang paling banyak digunakan di VBA. Fungsi ini memungkinkan pengguna mencari lokasi infomasi yang berada di area tertentu. Anda dapat menggunakan metode ini untuk melakukan pencarian di
sheet, atau bagian dari
spreadsheet Microsoft Excel. Artikel ini akan menjelaskan cara mencari nilai di kolom Excel menggunakan fungsi Find di
VBA.
Mencari Data Menggunakan Find
Cara kerja fungsi
Find sangat mirip dengan fungsi pencarian dasar. Jika Anda sedang melakukan pencarian dasar dari semua data di sebuah
workbook, Anda dapat melakukannya dengan menekan tombol
[CTRL] +
F pada keyboard. Hal ini akan membuka kotak pencarian. Cukup ketik kata kunci atau nilai yang ingin dicari, kemudian tekan tombol
Enter.
Excel akan menandai semua kolom yang sesuai dengan pencarian Anda.
Mencari Data Menggunakan Metode Find di VBA
Berikut ini adalah cara menggunakan fungsi
Find di VBC. Perlu dicatat bahwa kata kunci pencarian yang digunakan dalam contoh berikut adalah
Value:
Cells.Find(What:="Value", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False,
SearchFormat:=False).Activate
Memahami Metode Find
Berikut ini adalah rincian singkat dari semua parameter yang digunakan pada metode
Find.
MyRange.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, SearchFormat)
MyRange: Ekspresi ini menunjukkan area atau
Range objek, yang merujuk pada kolom mana yang ingin Anda cari, serta memiliki parameter
What atau nilai dan kata kunci yang ingin dicari.
Bagian ini adalah semua
sheet (Sheets(1).Cells.Find(...)), untuk kolom(Sheets(1).Columns(3).Find(...)), untuk baris (Sheets(1).Rows(7).Find(....)), atau area kolom tertentu (Sheets(1).Range("D12:F56").Find(....)).
What: Parameter ini diperlukan, karena berfungsi untuk menentukan secara spesifik nilai mana yang ingin Anda cari pada sebuah area. Parameter ini dapat berisi semua jenis data yang didukung oleh Excel.
After: Parameter ini hanya sebagai tambahan, karena berguna untuk menandai kolom mana yang dijadikan sebagai area awal pencarian (perlu dicatat bahwa kolom harus bernilai unik). Jika parameter After tidak diisi, maka pencarian akan dimulai dari area sudut kiri-atas.
LookIn: Parameter ini bersifat opsional. Parameter ini berfungsi untuk menentukan lokasi dari area pencarian. Variasi lain dari parameter LookIn adalah
xlValues,
xlFormulas, dan xlComments.
LookAt: Parameter ini juga bersifat opsional. Parameter LookAt mengindikasikan apakah hasil pencarian harus sama persis dengan nilai yang dimasukkan, atau hasilnya boleh memiliki nilai sebagaian.
Misalnya, jika seseorang mencari nilai "10" pada sebuah matriks yang terdiri atas: 6210, 4105, 540, 163, 154, 132, 10, maka ada beragam metode yang dapat Anda gunakan. Untuk memberi tahu VBC bahwa Anda hanya ingin menemukan angka 10, Anda dapat menggunakan parameter
LookAt:=XlWhole. Sebaliknya, jika Anda ingin mencari nilai yang memiliki angka 10 (pada kasus ini, 6210 atau 4105), Anda dapat menggunakan
LookAt:=XlPart.
SearchOrder: Parameter ini bersifat opsional. Pencarian dapat diurutkan berdasarkan dua konstanta: xlByRows (berdasarkan baris), atau xlByColumns (berdasarkan kolom).
SearchDirection: Parameter ini bersifat opsional. Parameter ini mengindikasikan pencarian langsung dalam sebagian area tertentu. Parameter ini memiliki dua konstanta, yaitu
xlNext, yang digunakan untuk mencari nilai di sebuah area secara berurutan, dan
xlPrevious, yang digunakan untuk mencari nilai dari area sebelumnya.
MatchCase: Parameter ini bersifat opsional. Dua nilai yang dpat digunakan dalam parameter ini adalah
True dan
False. Untuk pencarian
case-sensitive harus menggunakan nilai
True.
SearchFormat: Parameter ini bersiftar opsional. Parameter ini dapat bernilai
True atau
False, tergantung apakah format nilai sudah ditentukan atau tidak (misalnya: nilai mata uang, angka, bingkai, isi, perataan, dll.).
Nilai Kembali dari Metode Find
Metode Find akan kembali pada objek dalam Range atau area, yang merepresentasikan kolom pertama tempat data ditemukan. Metode ini akan kembali pada
Nothing jika tidak ada hasil yang ditemukan. Argumen parameter LookIn, LookAt, SearchOrder, dan MatchCase direkam setiap saat Anda menggunakan metode ini. Jika Anda tidak menentukan nilai untuk argumen tersebut secara spesifik saat menggunakan metode ini lagi, nilai yang sebelumnya telah direkam akan digunakan lagi.
Contoh dari Metode Pencarian di VBA
Option Explicit
Sub Cherche()
'déclaration des variables :
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
'********* à adapter ***********
'affectation de valeurs aux variables :
'on cherche le mot "Trouve"
Valeur_Cherchee = "Trouve"
'dans la première colonne de la feuille active
Set PlageDeRecherche = ActiveSheet.Columns(1)
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
'traitement de l'erreur possible : Si on ne trouve rien :
If Trouve Is Nothing Then
'ici, traitement pour le cas où la valeur n'est pas trouvée
AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
Else
'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
End If
MsgBox AdresseTrouvee
'vidage des variables
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
End Sub
N.B. Jika kita membuat pencarian untuk 1024 angka menggunakan kata "Find", kita perlu menegaskan Valeur_Cherchee sebagai integral. Varian
What memungkinkan Anda mencari berbagai jenis data.
Mencarian Ganda di VBA
Metode
FindNext dan
FindPrevious memungkinkan Anda untuk melakukan pencarian ganda.
Menggunakan Varian Find_Next
Pada contoh kode berikut ini akan terlihat kata "mot" di area
A1:A20:
Sub Principale()
Dim Plage As Range
Dim Lignes(), i As Long
Dim Texte As String
Dim Flag As Boolean
Set Plage = Sheets("Feuil1").Range("A1:A20") 'plage de recherche
Texte = "mot" 'expression cherchée
Flag = Find_Next(Plage, Texte, Lignes()) 'appel de la fonction
If Flag Then 'si fonction retourne Vrai = expression trouvée dans la plage
For i = LBound(Lignes) To UBound(Lignes) 'restitution des lignes correspondantes
Debug.Print Lignes(i)
Next i
Else
MsgBox "L'expression : " & Texte & " n'a pas été trouvée dans la plage : " & Plage.Address
End If
End Sub
'Sources : Michel_m
'http://www.commentcamarche.net/forum/affich-31432413-importation-de-donnees-sans-doublons#9
Function Find_Next(Rng As Range, Texte As String, Tbl()) As Boolean
Dim Nbre As Integer, Lig As Long, Cptr As Long, Adresse As String
Nbre = Application.CountIf(Rng, Texte)
If Nbre > 0 Then
ReDim Tbl(Nbre - 1)
Lig = 1
For Cptr = 0 To Nbre - 1
Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr) = Lig
Next
Else
GoTo Absent
End If
Find_Next = True
Exit Function
Absent:
Find_Next = False
End Function
N.B. For an entire column, simply replace:
Set Plage = Sheets("Feuil1").Range("A1:A20")
By:
Set Plage = Sheets("Feuil1").Columns(1)
N.B. To return the addresses of the cells rather than the line number in the Find_Next function, replace:
Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr) = Lig
By:
Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
Adresse = Cells(Lig, Rng.Column).Address
Tbl(Cptr) = Adresse
FindAll
Ini adalah fungsi yang mengembalikan hasil Find dan FindNext sebagai hasil dari deretan beberapa nilai. Fungsi ini akan menemukan semua contoh
string (sText As String) dan mengembalikan sebuah deretan yang berisi garis angka.
Parameter dari fungsi ini adalah sebagai berikut:
ByVal sText As String merepresentasikan nilai dari target.
ByRef oSht As Worksheet merepresentasikan
sheet target.
ByRef sRange As String merepresentasikan
range atau area.
ByRef arMatches() As String merepresentasikan
array atau deretan yang akan menyimpan nilai-nilai yang dikembalikan.
Kodenya adalah:
Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
' --------------------------------------------------------------------------------------------------------------
' FindAll - To find all instances of the1 given string and return the row numbers.
' If there are not any matches the function will return false
' --------------------------------------------------------------------------------------------------------------
On Error GoTo Err_Trap
Dim rFnd As Range ' Range Object
Dim iArr As Integer ' Counter for Array
Dim rFirstAddress ' Address of the First Find
' -----------------
' Clear the Array
' -----------------
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)
If Not rFnd Is Nothing Then
rFirstAddress = rFnd.Address
Do Until rFnd Is Nothing
iArr = iArr + 1
ReDim Preserve arMatches(iArr)
arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
Set rFnd = oSht.Range(sRange).FindNext(rFnd)
If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
Loop
FindAll = True
Else
' ----------------------
' No Value is Found
' ----------------------
FindAll = False
End If
' -----------------------
' Error Handling
' -----------------------
Err_Trap:
If Err <> 0 Then
MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
Err.Clear
FindAll = False
Exit Function
End If
End Function
Image: © Microsoft.