Got any Excel/VBA Questions? Free Excel Help.
Advanced Excel Find Download Working Example
The standard excel find feature is great for locating matching cells. However, it cannot be use 'as is' to locate, say 3, matching cells on the same row within a table. What we will do, to make it different to the normal find, is allow the user to specify more than one item to locate. For example, if you have a large table of data (say A1:H1000), you may wish to find a specific row in that table where 3, or more items (if modified), occur on the one row. The number of items can be greater or smaller than 3, but for this example we will use 3.
To create this custom find you will need.
A) 1 UserForm.
B) 3 ComboBoxes. Named ComboBox1, ComboBox2 and ComboBox3. Place these vertically on the left side of UserForm with ComboBox1 at the top and ComboBox3 and the bottom. Set the Enabled Property of ComboBox2 and ComboBox3 to False.
C) 5 Labels. Named Label1 (positioned above Combobox1), Label2 (positioned above Combobox2), Label3 (positioned above Combobox3), Label4 positioned above Label1 and Label 4 anywhere for now. Change the Caption Property of Label4 to read "Select up to 3 fields". Change the Caption Property of Label5 to read "Matching Rows. Double click to go there".
D) 2 CommandButtons. CommandButton1 and CommandButton2. Change the Caption Property of CommandButton1 to "Find" and the Caption Property of CommandButton2 to "Close". Postion both of these to the top right of the UserForm.
E) 1 ListBox. Named ListBox1. Postion this below the 2 CommandButtons and place label5 above it. Make ListBox1 the same width as Label5.
That is all we need for creating the form now it's time to add the all important code. Double click the UserForm and add all the code shown below:
Option Explicit 'Module Level Variables Dim rRange As Range Dim strFind1 As String Dim strFind2 As String Dim strFind3 As String Private Sub ComboBox1_Change() 'Pass chosen value to String variable strFind1 strFind1 = ComboBox1 'Enable ComboBox2 only if value is chosen ComboBox2.Enabled = Not strFind1 = vbNullString End Sub Private Sub ComboBox2_Change() 'Pass chosen value to String variable strFind1 strFind2 = ComboBox2 'Enable ComboBox3 only if value is chosen ComboBox3.Enabled = Not strFind2 = vbNullString End Sub Private Sub ComboBox3_Change() 'Pass chosen value to String variable strFind1 strFind3 = ComboBox3 End Sub Private Sub CommandButton1_Click() 'Procedure level variables Dim lCount As Long Dim lOccur As Long Dim rCell As Range Dim rCell2 As Range Dim rCell3 As Range Dim bFound As Boolean 'At least one value, from ComboBox1 must be chosen If strFind1 & strFind2 & strFind3 = vbNullString Then MsgBox "No items to find chosen", vbCritical Exit Sub 'Go no further ElseIf strFind1 = vbNullString Then MsgBox "A value from " & Label1.Caption _ & " must be chosen", vbCritical Exit Sub 'Go no further End If 'Clear any old entries On Error Resume Next ListBox1.Clear On Error GoTo 0 'If String variable are empty pass the wildcard character If strFind2 = vbNullString Then strFind2 = "*" If strFind3 = vbNullString Then strFind3 = "*" 'Set range variable to first cell in table. Set rCell = rRange.Cells(1, 1) 'Pass the number of times strFind1 occurs lOccur = WorksheetFunction.CountIf(rRange.Columns(1), strFind1) 'Loop only as many times as strFind1 occurs For lCount = 1 To lOccur 'Set the range variable to the found cell. This is then also _ used to Start the next Find from (After:=rCell) Set rCell = rRange.Columns(1).Find(What:=strFind1, After:=rCell, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False) 'Check each find to see if strFind2 and strFind3 occur _ on the same row. If rCell(1, 2) Like strFind2 And rCell(1, 3) Like strFind3 Then bFound = True 'Used to not show message box for no value found. 'Add the address of the found cell and the cell on the _ same row but 2 columns to the right. ListBox1.AddItem rCell.Address & ":" & rCell(1, 3).Address End If Next lCount If bFound = False Then 'No match MsgBox "Sorry, no matches", vbOKOnly End If End Sub Private Sub CommandButton2_Click() 'Close UserForm Unload Me End Sub Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Check for range addresses If ListBox1.ListCount = 0 Then Exit Sub 'GoTo doubled clicked address Application.Goto Range(ListBox1.Text), True End Sub Private Sub UserForm_Initialize() 'Procedure level module Dim lRows As Long 'Set Module level range variable to CurrentRegion _ of the Selection Set rRange = Selection.CurrentRegion If rRange.Rows.Count < 2 Then ' Only 1 row MsgBox "Please select any cell in your table first", vbCritical Unload Me 'Close Userform Exit Sub Else With rRange 'Set Label Captions to the Table headings Label1.Caption = .Cells(1, 1) Label2.Caption = .Cells(1, 2) Label3.Caption = .Cells(1, 3) 'Set RowSource of ComboBoxes to the appropriate columns _ inside the table ComboBox1.RowSource = .Columns(1).Offset(1, 0).Address ComboBox2.RowSource = .Columns(2).Offset(1, 0).Address ComboBox3.RowSource = .Columns(3).Offset(1, 0).Address End With End If End Sub Private Sub UserForm_Terminate() 'Destroy Module level variables Set rRange = Nothing strFind1 = vbNullString strFind2 = vbNullString strFind3 = vbNullString End Sub
Now go to Insert>Module and add this code
Sub ShowForm() On Error Resume Next UserForm1.Show On Error GoTo 0 End Sub
See also:
Add Worksheets to Excel via VBA |
Free Training Course: Lesson 1 - Excel Fundamentals
See also: Index to Excel VBA Code; Index to Excel Freebies; Lesson 1 - Excel Fundamentals; Index to how to… providing a range of solutions
Click here to visit our Free 24/7 Excel/VBA Help Forum where there are thousands of posts you can get information from, or you can join the Forum and post your own questions.
A verified rating of the best online casinos for real money with withdrawal of winnings only for players from Australia. Top casinos by onlinecasinos-australia.com will always be in demand among gambling fans. This is the essence of gambling. Start making deposits and enjoy the gameplay.