PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBAErrorhantering önskasErrorhantering önskas
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2013-03-20 10:30
 

Sub Test_Sökfunktion()
'
Dim Txt_nr As Integer
Dim Finn_Txt As String

Range("A6:A300").Select
Application.ScreenUpdating = False
For Txt_nr = 1 To 4
If Txt_nr = 1 Then
Finn_Txt = "fisk"
Else
If Txt_nr = 2 Then
Finn_Txt = "fågel"
Else
If Txt_nr = 3 Then
Finn_Txt = "nöt"
Else
Finn_Txt = "vilt"
End If
End If
End If

Selection.Find(What:=Finn_Txt, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

Do
If ActiveCell.Offset(0, 8) = "" Then
ActiveCell.Offset(0, 8) = Finn_Txt
Selection.FindNext(After:=ActiveCell).Activate
End If
Loop Until ActiveCell.Offset(0, 8) <> ""
Next Txt_nr
Range("A5").Select
Application.ScreenUpdating = True

End Sub

Ovanstående lilla Makro är mitt klumpiga försök till en sökfunktion som skall hitta de sökord (Variabeln Finn_Txt) som styrs av For-räknarens värde bland ett Range-område av textsträngar. Så länge sökfunktionen Selection.Find hittar de ord som angetts som sökord fungerar denna lösning. Problemet är det att när ingen av raderna innehåller något av sökorden bryts Makrot och ett felmeddelande visas. "Körfel nr '91'.: Objektvariabel eller With-blockvariabel har inte angetts". Hur skall jag göra för att få Makrot att ignorera detta och i stället fortsätta med nästa Txt_nr, eller avsluta Suben?

Tack på förhand // Jörgen.

Nytt inlägg
 2013-04-17 23:03
 
Hej Jörgen!

Undantagshantering i VBA sköter du med hjälp av "On Error Goto" eller "On Error Resume Next" statements.

"On Error Goto" ska efterföljas av en etikett (på en ensam rad skriver du ett valfritt namn på etiketten fölljt av ":" exempelvis ErrHandler1:). Ifall ett körfel uppstår på kod som exekveras efter "On Error Goto" flyttas exekveringen till första raden efter etiketten.

Det andra alternativet "On Error Resume Next" fortsätter exekvera nästa rad ifall ett körfel uppstår.

Generellt är "On Error Goto" att föredra. Det är troligen allra viktigast att vara restriktiv med "On Error Resume Next" som nybörjare. Som du säkert förstår kan "On Error Resume Next" användas på ett sätt som gör att du helt tappar kontroll över din kod. Det finns dock ett par tillfällen där "On Error Resume Next" är det enda tillgänliga alternativet. Det märker du genom att du får ett meddelande om körfel trots att du redan kapslat in kod under ett "On Error Goto" statement.
Då "On Error Resume Next" används ansvarsfullt ligger det i ett väldigt begränsat stycke kod och åtföljs av ett villkor där det kontrolleras ifall det uppstått ett fel ex:
If Err.Number <> 0 then
Msgbox("Ett körfel har uppstått avbryter bearbetningen")
Exit Sub
End if

Du kan återställa felhanteringen genom att använda "On Error Goto 0", då kommer ett meddelande om körfel ifall det uppstår där du också kan välja att felsöka eller avsluta.

Man bör försöka undvika undantagshantering. Det är oftast bättre att själv validera data innan den används genom villkor ex:
If Isnumeric(strTestStringVal) = False Then
Msgbox("Felaktig indata avbryter bearbetningen")
Exit Sub
End if
Man bör också försöka undvika att ha många villkor i sin kod. Det är bättre att ha en tydlig och väl genomtänkt ide. Men det är möjligen lite mycket att kräva av nybörjare.


För att lösa ditt exempel på enklaste sätt kan du lägga tilll mina ändringar nedan:

On Error Goto ErrHandler1: ' TILLAGT
Selection.Find(What:=Finn_Txt, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
On Error Goto 0 ' TILLAGT

Do
If ActiveCell.Offset(0, 8) = "" Then
ActiveCell.Offset(0, 8) = Finn_Txt
Selection.FindNext(After:=ActiveCell).Activate
End If
Loop Until ActiveCell.Offset(0, 8) <> ""
ErrHandler1: ' TILLAGT
On Error Goto 0 ' TILLAGT
Next Txt_nr
Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBAErrorhantering önskasErrorhantering önskas

PNG32 PNG32
Excelforum drivs av Excelspecialisten som bedriver utbildning i Excel och VBA, tillhandahåller support och hjälp med Excel, utvecklar program i Excel. Är ni i behov av en konsult inom Excel, VBA eller VSTO, eller söker en excelkurs, kontakta oss.
Copyright 2013 ExcelSpecialisten XLS AB   Användarvillkor  Personliga uppgifter