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.
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.
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
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.).
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.
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.
Metode FindNext dan FindPrevious memungkinkan Anda untuk melakukan pencarian ganda.
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
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.