Sök om värde finns med VBA-kod
VBA – Finns ett värde eller inte?
I detta Exceltips tar upp hur vi kan ta reda på om ett värde finns in en lista eller inte.
Enklaste sättet att leta i en lista är att använda sig av funktionen PASSA [MATCH]. Eftersom det är VBA och programmering i Excel vi nu ska skriva är det den engelska benämningen (MATCH) som gäller. Problemet med Match() är att den genererar ett fel om det vi letar efter inte finns i listan. Detta fel kan vi undvika med skrivningen ”On Error Resume Next”. Saknas personen fortsätter koden som om inget hänt tills den stöter på ”On Error GoTo 0”, som innebär att fel skall sluta ignoreras.
Vi rekommenderar dessa Excelkurser:
www.infocell.se – lärarledda kvalitetskurser i Excel
www.officekurs.se – oslagbar e-kurser i Excel & Office-paketet
Tricket att arbeta med funktioner som kan ge fel är att först ange ett svar från funktionen som indikerar fel. Personligen brukar jag returnera ”-1” som radnummer när jag letar efter något som inte finns. Därefter ignorerar jag fel och söker med Match(). Om det sökta värdet finns så får funktionen ett annat svarsvärde. Annars kvarstår -1 som svar.
' Nedanstående funktion letar efter ett värde i ett område Public Function Lib_FindRowOfValueInRange(rng As Range, varValue As Variant) As Long ' Vi antar först att värdet inte finns, vilket vi singalerar genom att låta funktionen ' returnerar radnummer -1, vilket ju inte finns. Lib_FindRowOfValueInRange = -1 ' Om det sökta värdet inte finns så kommer ett fel att uppstå om vi söker efter det med funktionen Passa(), eng. Match(). ' Vi ber därför Excel att ignorera raden om den ger ett fel On Error Resume Next ' Ignorera rader nedan om de leder till fel Lib_FindRowOfValueInRange = WorksheetFunction.Match(varValue, rng, 0) On Error GoTo 0 ' Sluta ignorera fel End Function
Koden ovan kan anropas med:
Public Sub LetaEfterPerson() Dim sNamn As String Dim lRow As Long sNamn = InputBox("Ange personens namn", "Sök person") ' Har namn angivits? If sNamn <> "" Then lRow = Lib_FindRowOfValueInRange(Blad1.Range("A2:A8"), sNamn) If lRow > 0 Then ' Radnumret avser positionen i listan "A2:A8". Träff på A2 ger resultatet 1 då rad 1 inte ingår 'i sökningen. Därför ökas radnummer med 1. lRow = lRow + 1 Call MsgBox("Personen finns på rad: " & lRow, vbInformation, "Person hittad") Else Call MsgBox("Personen går ej att hitta!", vbInformation, "Person saknas") End If End If End Sub
Notera att radnumret räknas upp med 1 då radnumret anger det sökta värdets position i det angivna området. Då området ignorerar rad 1 så är alla svar en rad för låg. Ladda ner exempelfilen (längst upp) med koden och testa nu själv.
Associerad kurs: Excel VBA och makron i Stockholm City
Se även vår e-kurs i VBA på www.officekurs.se