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

Du gillar kanske också...

Börja prenumerera idag!

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.