Avatar billede folj Forsker
15. august 2019 - 09:32 Der er 4 kommentarer og
2 løsninger

Excel VBA: få svar fra function

Hej eksperter !

Jeg har en egen funktion, som jeg gerne vil have til at give et svar hvis ikke den fandt det den søgte.

Den gennemløber en kolonne (defineret som ColNr) for at lede efter en dato (defineret som InDate). Koden kommer her:
Function FindDateRowInCol(InDate As Date, ColNr As Integer)
'  find dato i en kolonne, og returner rækkenummer
Dim i As Integer
Dim LastRow As Integer

  LastRow = Range("EndRow").Row

  For i = 1 To LastRow
    If ActiveSheet.Cells(i, ColNr).Value = InDate Then
      FindDateRowInCol = i ' returns rownumber
    Exit For
    End If
  Next i
End Function

Mit problem går på at når den støder på at dato ikke findes, så vil jeg gerne have den til at svare at der ikke blev fundet den søgte dato i kolonnen.

Jeg forsøgte at skyde en if-sætning ind i min for-løkke,
 
If Not Int(FindDateRowInCol) Then
        MsgBox "Datoen " & InDate & " blev ikke fundet i kolonne " & ColNr
    End If
men så svarer den utallige gange det samme. Antageligt for hvert loop.

Nogen forslag til hvordan jeg skal bygge den for kun at få det ene svar jeg ønsker, hvis datoen ikke blev fundet.
Avatar billede Slettet bruger
15. august 2019 - 09:48 #1
jeg ville prøve at ændre din "exit for" til en "exit function" og smide din msg-box som den sidste argument i funktionen (efter "next") - så løber den for-sløjfen igennem, afbryder funktionen hvis den finder noget, skulle der ikke være noget svar, kommer den med en fejlbesked
Avatar billede store-morten Ekspert
15. august 2019 - 09:56 #2
Vil du ikke få "svar" hele tiden da det er en funktion?

Din formel giver: 0 hvis dato ikke findes.
Avatar billede Jan K Ekspert
15. august 2019 - 10:13 #3
Jeg ville nok vælge bare at tilføje en enkelt fejllinje i kodens If sætning. Altså noget i stil med

If ActiveSheet.Cells(i, ColNr).Value = InDate Then
      FindDateRowInCol = i ' returns rownumber
      Exit For
Else
    FindDateRowInCol = CVErr(xlErrNA)
End If

Min erfaring er at man skal ikke bruge MSGBOX i en Function.
Avatar billede Jan K Ekspert
15. august 2019 - 10:14 #4
Hvilket selvfølgelig er forkert. Testen skal først udføres når alle celler er undersøgt, altså efter Next.
Avatar billede store-morten Ekspert
15. august 2019 - 10:45 #5
Måske:
Function FindDateRowInCol(InDate As Date, ColNr As Integer)
'  find dato i en kolonne, og returner rækkenummer
Dim i As Integer
Dim LastRow As Integer

  LastRow = 10
 

  For i = 1 To LastRow
    If ActiveSheet.Cells(i, ColNr).Value = InDate Then
      FindDateRowInCol = i ' returns rownumber
    Exit For
    End If
  Next i
 
If FindDateRowInCol = 0 Then
        MsgBox "Datoen blev ikke fundet !!!"
End If
   
End Function
Avatar billede folj Forsker
15. august 2019 - 11:59 #6
Selvfølgelig Store-Morten !

Altid et godt svar fra dig.
Og med din oplysning om at den reurnerer 0 når den ikke fandt det søgte, så var opbygningen jo ligetil.
Og så serverer du oven i købet koden lige klar til indsæt i mit program.
Takker for indsatsen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester