Just nu i M3-nätverket
Gå till innehåll

Konstigt fel


short

Rekommendera Poster

Sub nn()
Dim kolumn As Integer

For kolumn = 0 To 2067 Step 16
    On Error GoTo FEL
        Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = _
        Application.WorksheetFunction.VLookup(Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3), _
        Sheets("Aktiviteter").Range("AKT"), 2, False)
        GoTo NÄSTA
FEL:    If Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3) = "" Then
            Range("TP_Aktivitet").Cells(0, kolumn + 3) = ""
        Else
            Range("TP_Aktivitet").Cells(0, kolumn + 3) = "SAKNAS"
           
        End If
NÄSTA:
    Next kolumn
    
End Sub

Ovanstående sub genererar fel gången efter det att FEL genomlöpts en gång. Jag begriper inte varför. Jag har försökt med On Error GoTo 0 men det hjälper inte.

Länk till kommentar
Dela på andra webbplatser

Ove Söderlund
Sub nn()
Dim kolumn As Integer

For kolumn = 0 To 2067 Step 16
    On Error GoTo FEL
        Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = _
        Application.WorksheetFunction.VLookup(Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3), _
        Sheets("Aktiviteter").Range("AKT"), 2, False)
        GoTo NÄSTA
FEL:    If Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3) = "" Then
            Range("TP_Aktivitet").Cells(0, kolumn + 3) = ""
        Else
            Range("TP_Aktivitet").Cells(0, kolumn + 3) = "SAKNAS"
           
        End If
NÄSTA:
    Next kolumn
    
End Sub

Ovanstående sub genererar fel gången efter det att FEL genomlöpts en gång. Jag begriper inte varför. Jag har försökt med On Error GoTo 0 men det hjälper inte.

 

 

Bortsett från att GoTo-satser får mina ExcelVBA-ögon att blöda en smula så undrar jag inte om du på något vis försöker använda relativa referenser till celler, se värdena 0 resp. -1 som du använder i satsen Cells. Jag tror att du behöver titta på Offset i det läget. Cells(row, column) är ju annars att ange absolut referens och då ska det vara positiva värden >0 då det inte finns typ rad noll och kolumn noll i ett kalkylark. Cell A1 är i detta fall Cells (1, 1).

Länk till kommentar
Dela på andra webbplatser

Vad har jag sagt om Goto kära Snow?!!?!

 

Bort bort bort har INGET i VBA att göra i annat än ren felhantering och då ENDAST i stil med

Sub MyTest
     On Error Goto errHandle
      ......kod som eventuellt genererar fel

Exit sub
errHandle:
'kod som åtgärdar/hanterar eventuellt fel. 
End Sub

ALDRIG hopp inom kod med GOTO, det är bara, tyvärr, dålig programmering.

 

Du kan alltid hantera fel innan de uppstår. Jag tror Ove ovan är inne på helt rätt spår, att du hamnar på negativa kolumner/rader varvid det blir fel. I sig fungerar Range("A10").Cells(-1) utmärkt men jag ser inget i koden som säger mig att du inte råkar göra något i stil med

Range("A1").Cells(-1)

vilket givetvis icke definierat.

Även

Range("A1").Cells(0)

är icke definierat då

Range("A1").Cells(1,1)

är samma cell som referensen, dvs cell A1.

 

Gör om, tänk om, ta bort Goto och du ska se att det fungerar.

Länk till kommentar
Dela på andra webbplatser

Ove Söderlund

Vad har jag sagt om Goto kära Snow?!!?!

 

Monshi, hur kom jag med i denna tråd?? :huh:

 

Typexempel på mindre bra felhantering ;-)

Länk till kommentar
Dela på andra webbplatser

Vad har jag sagt om Goto kära Snow?!!?!

 

Monshi, hur kom jag med i denna tråd?? :huh:

Oops, inte lätt detta med namn...

Jag kan redigera bort dig om du vill men ... jag låter skrivet ord stå.

 

 

Typexempel på mindre bra felhantering ;-)

:-D

Länk till kommentar
Dela på andra webbplatser

Som framgår av koden hämtar jag med VLOOKUP och om det jag försöker hämta inte finns vill jag skriva blankt eller SAKNAS och sedan fortsätta med nästa VLOOKUP. Då kan jag ju inte ha en felhantering som bygger på att jag bryter körningen efter felhanteringen. Hur klarar jag det utan GOTO?

 

TP_Aktivitet är en Range som omfattar en hel kolumn. Såvitt jag begriper så får jag en annan kolumn med offset men det vill jag inte ha bara en enskild cell. Risken att jag hamnar utanför arket är noll. Kolumn är minst=3 och det finns sex rader ovanför den första raden i TP_Aktivitet.

Länk till kommentar
Dela på andra webbplatser

Sub nn()
Dim kolumn As Integer

For kolumn = 0 To 2067 Step 16
    On Error Resume Next
        If Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3) = "" Then
           Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = ""
        Else
            Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = _
            Application.WorksheetFunction.VLookup(Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3), _
            Sheets("Aktiviteter").Range("AKT"), 2, False)
        End If
        If Err > 0 Then Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = "SAKNAS"
        Err.Clear
    Next kolumn
End Sub

Det här fungerade!

Länk till kommentar
Dela på andra webbplatser

Det är en bättre kod det där. Men i sig kan du komma undan felhanteraren helt med en enkel IF-sats.

Se det som en hemuppgift att skriva om koden utan att använda On Error Resume Next.

Länk till kommentar
Dela på andra webbplatser

mmh, ha, nu ser jag.

 

Det är när man skapar formeln, vlookup. Den kan inte skrivas om den inte returnerar ett korrekt värde.

Sub nn()
    Dim kolumn As Integer
     
    For kolumn = 0 To 2067 Step 16
        
        If Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3) = "" Then
            Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = ""
        Else
            On Error GoTo ErrHandle
            Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = _
            Application.WorksheetFunction.VLookup(Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(-1, kolumn + 3), _
            Sheets("Aktiviteter").Range("AKT"), 2, False)
            On Error GoTo 0
        End If
    Next kolumn
Exit Sub
ErrHandle:
    If Err > 0 Then Sheets("Timplanering helår").Range("TP_Aktivitet").Cells(0, kolumn + 3) = "SAKNAS"
    Err.Clear
    Resume Next
End Sub

Det man kan göra är att visa med felhanteraren exakt var koden går fel. men inget direkt fel i din hantering av koden nu.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...