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.

(Ladda ner exempelfil här)

sök värde vba-kod

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-Learning 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.

Kopiera inte koden nedan. Använd istället koden som finns i exempelfilen för att säkert kopiera alla tecken korrekt.

’ 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 singallerar 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

Du gillar kanske också...

Börja prenumerera på Excelbrevet

Ta del av tips & tricks i Excel och Office en gång i månaden helt kostnadsfritt.

Grattis du kommer nu att få Excelbrevet varje månad helt gratis!