Du spelade in ett makro, det fungerade perfekt och du sparade in en massa klick. Sedan en dag händer ingenting när du kör det. Ibland dyker ett obegripligt felmeddelande upp, ibland skriver makrot data i helt fel celler. Det är ett av de vanligaste problemen för den som börjar med makron i Excel. Oftast är orsaken enkel när du väl vet var du ska leta.
Här går vi igenom de vanligaste anledningarna till att ett inspelat makro slutar fungera och vad du gör åt var och en. Det handlar bland annat om fasta cellreferenser, blad och filer som bytt namn, en Personal Macro Workbook som inte laddas och säkerhetsinställningar som stoppar makrot. Sist får du en checklista att gå igenom nästa gång något krånglar.
Är du helt ny på makron kan det vara bra att först läsa Vad är ett Excelmakro?, så har du grunderna klara innan du börjar felsöka.
Varför slutar ett inspelat makro att fungera?
När du spelar in ett makro översätter Excel varje klick och tangenttryckning till VBA-kod. Inspelaren förstår inte vad du vill uppnå. Den skriver bara ned exakt vad du gjorde, i den ordning du gjorde det. Om du klickade på cell B2 i bladet Försäljning i filen Rapport.xlsx, så står just de namnen i koden.
Ett kort inspelat makro kan se ut så här:
Windows("Rapport.xlsx").ActivateSheets("Försäljning").SelectRange("B2").SelectActiveCell.FormulaR1C1 = "Klar"
Varje rad bygger på något som var sant när du spelade in: att filen hette Rapport.xlsx, att bladet hette Försäljning och att rätt cell var B2. Makrot kontrollerar aldrig om det fortfarande stämmer. Det försöker bara upprepa samma rörelser.
Därför är inspelade makron känsliga för ändringar i arbetsboken. Typiska saker som får dem att sluta fungera är att
- ett blad eller en fil byter namn eller flyttas,
- datan växer, krymper eller får nya kolumner,
- makrot startas från ett annat blad eller en annan cell än vid inspelningen,
- makrot sparades på ett ställe som Excel inte längre läser in,
- Excel blockerar makron av säkerhetsskäl.
Ibland ger det ett felmeddelande. Ibland körs makrot utan fel men skriver i fel celler, och det är ofta svårare att upptäcka. Avsnitten nedan går igenom problemen ett i taget. Om du vill se hur inspelningen går till från början kan du läsa Skapa ditt egna Excelmakro. Där ser du också var i processen de fasta adresserna och namnen hamnar i koden.
Problem: Makrot använder absoluta cellreferenser
Det vanligaste problemet med inspelade makron är att de alltid gör saker på exakt samma ställe. Du spelar in ett makro som skriver en rubrik och en summa. Nästa gång kör du det från en annan cell, men makrot skriver ändå i samma celler som förra gången och skriver kanske över data du ville behålla.
Absoluta och relativa referenser i koden
Som standard spelar Excel in med absoluta referenser. Klickar du på cell A1 och skriver något blir koden ungefär så här:
Range("A1").Select
ActiveCell.FormulaR1C1 = "Försäljning"
Raden Range("A1").Select betyder ”gå alltid till A1”. Det spelar ingen roll vilken cell som är markerad när du startar makrot.
Spelar du i stället in med relativa referenser utgår koden från den cell som är aktiv när makrot startar:
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "Försäljning"
Här betyder Offset(1, 0) ”en rad ner, samma kolumn, räknat från där du står”. Delen Range("A1") ser förvirrande ut men pekar inte på cell A1 i bladet. Den betyder bara ”den första cellen räknat från förskjutningen”. Makrot hamnar alltså på olika ställen beroende på var du startar det.
Knappen Använd relativa referenser
Du styr detta med knappen Använd relativa referenser i gruppen Kod på fliken Utvecklare. Knappen är en av/på-knapp, och när den är aktiv är den markerad. Så här gör du:
- Markera den cell som makrot ska utgå från.
- Klicka på Använd relativa referenser så att knappen blir markerad.
- Klicka på Spela in makro och utför dina steg.
- Stoppa inspelningen.
Ordningen är viktig. Glömmer du att aktivera knappen innan du börjar spela in blir stegen inspelade med absoluta referenser, och du får antingen spela in makrot på nytt eller rätta koden för hand. Inställningen sparas tills du stänger Excel, så kontrollera knappens läge varje gång du ska spela in.
Fasta områden som inte växer med datan
Ett närliggande problem gäller områden. Spelar du in ett makro när listan har data i A1:A10 skriver Excel just det området i koden, till exempel Range("A1:A10").Select eller en summaformel som bara räknar de rader som fanns då. När listan växer bryr sig makrot inte om de nya raderna. Ofta syns inget felmeddelande, och resultatet blir bara fel.
I exemplet nedan spelades makrot in när listan hade nio säljare. Summan i E2 räknar fortfarande bara B2:B10, trots att två nya säljare har lagts till på rad 11 och 12.

Det finns två enkla sätt att lösa detta i koden:
Range("A1").CurrentRegion.Selectmarkerar hela det sammanhängande området runt A1, oavsett hur många rader det har.Cells(Rows.Count, "A").End(xlUp).Rowger numret på den sista ifyllda raden i kolumn A. Det kan du använda för att bygga området, till exempelRange("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row).
Ett alternativ utan kod är att göra om listan till en tabell med Ctrl+T. Formler som refererar till en tabellkolumn tar automatiskt med nya rader.
Problem: Bladet eller filen har bytt namn
Makroinspelaren skriver in exakta namn på blad och arbetsböcker i koden. Klickar du på ett blad som heter Blad1 och växlar till en öppen fil som heter Rapport.xlsx, kan koden se ut så här:
Sheets("Blad1").Select
Windows("Rapport.xlsx").Activate
Byter någon senare namn på bladet till Försäljning, eller sparar filen som Rapport 2024.xlsx, finns det inget som heter Blad1 eller Rapport.xlsx längre. Makrot stannar då med körningsfel 9. I svenska Excel heter felet Indexet är utanför intervallet och i engelska Subscript out of range. Samma fel får du om arbetsboken som koden pekar på inte är öppen när makrot körs.
Hitta och rätta namnet i VBA-redigeraren
- Klicka på Felsök i felmeddelandet. VBA-redigeraren öppnas och raden med det felaktiga namnet markeras i gult.
- Jämför namnet inom citattecknen med det namn som står på bladfliken eller i filens namnlist. Namnet måste stämma tecken för tecken, även mellanslag. Filnamnet ska dessutom ha rätt filändelse, till exempel
.xlsmi stället för.xlsx. - Rätta namnet direkt i koden. Om samma namn förekommer på flera ställen kan du använda Ctrl+H (Ersätt) i VBA-redigeraren och byta alla på en gång.
- Stoppa körningen med knappen Återställ (den blå fyrkanten), spara och kör makrot igen.
Du öppnar VBA-redigeraren med Alt+F11 om du vill rätta koden utan att först köra makrot.
Gör makrot mindre känsligt för namnbyten
Behöver makrot bara arbeta på det blad du står på, kan du ta bort raden med Sheets("Blad1").Select helt eller skriva ActiveSheet i stället för bladnamnet:
ActiveSheet.Range("A1").Value = "Summa"
Ska makrot alltid arbeta på ett visst blad, oavsett vad fliken heter, är bladets kodnamn ett bättre val. I Projektutforskaren i VBA-redigeraren visas varje blad som till exempel Blad1 (Försäljning). Det första namnet är kodnamnet och namnet inom parentes är det som står på fliken. Kodnamnet ändras inte när någon byter namn på fliken, så du kan skriva:
Blad1.Range("A1").Value = "Summa"
Vill du ge kodnamnet ett tydligare namn markerar du bladet i Projektutforskaren, trycker F4 och ändrar egenskapen (Name) i fönstret Egenskaper. Kodnamn fungerar bara för blad i samma arbetsbok som makrot.
För arbetsboken där makrot ligger kan du på samma sätt skriva ThisWorkbook i stället för Windows("Rapport.xlsx"). Då spelar det ingen roll vad filen heter.
Filer och mappar som har flyttats
Har du spelat in att du öppnar eller sparar en fil, finns hela sökvägen med i koden:
Workbooks.Open Filename:="C:\Rapporter\2023\Data.xlsx"
Flyttas filen, döps mappen om eller körs makrot på en annan dator, hittar Excel inte filen och makrot stoppar med ett felmeddelande om att filen inte kan hittas. Lösningen är att uppdatera sökvägen i koden. Ligger filen i samma mapp som arbetsboken med makrot kan du använda ThisWorkbook.Path, så följer sökvägen med om du flyttar båda filerna tillsammans:
Workbooks.Open Filename:=ThisWorkbook.Path & "\Data.xlsx"
Problem: Makrot i Personal Macro Workbook hittas inte
Makron som du vill kunna köra i alla arbetsböcker sparas oftast i Personal Macro Workbook, filen PERSONAL.XLSB (i Excel 2003 och äldre hette den Personal.xls). Excel öppnar den dolt varje gång programmet startar. Om filen inte laddas försvinner makrona ur listan i dialogrutan Makron, och knappar och kortkommandon som pekar på dem slutar fungera. Är du osäker på hur den personliga makroarbetsboken fungerar kan du först läsa Personal Macro Workbook – introduktion.
Vanliga orsaker
- Filen har tagits fram och sedan stängts. Om du har visat
PERSONAL.XLSBoch stänger dess fönster stängs hela filen. Makrona finns då inte tillgängliga förrän du startar om Excel. - Filen visas men har aldrig dolts igen. Då öppnas den som ett synligt fönster vid varje start. Den som stänger fönstret för att bli av med det stänger också makrona.
- Filen har tagits bort eller flyttats. Excel letar bara i startmappen
XLSTART. Om filen har raderats, döpts om eller sparats någon annanstans laddas den inte. - Excel har inaktiverat filen. Om Excel kraschar medan filen är öppen kan programmet lägga den på listan över inaktiverade objekt. Då laddas den inte vid start, och du får inget felmeddelande om det.
- Ett tillägg krånglar. Ibland hindrar ett COM-tillägg från tredje part att startfilerna laddas som de ska.
Så får du tillbaka makrona
- Kontrollera om filen är öppen. Gå till fliken Visa och klicka på Ta fram. Finns
PERSONALmed i listan är filen laddad, och du kan visa den om du behöver redigera den. Dölj den sedan igen med Visa > Dölj. Är knappen Ta fram nedtonad finns ingen dold arbetsbok öppen, och då har filen inte laddats. - Kontrollera mappen XLSTART. Skriv
%appdata%\Microsoft\Excel\XLSTARTi adressfältet i Utforskaren och tryck Enter. Där skaPERSONAL.XLSBligga, med exakt det namnet. Saknas filen kan du leta efter en säkerhetskopia. Du kan också spela in ett nytt makro och välja Personlig makroarbetsbok under Lagra makro i, så skapar Excel en ny fil. - Aktivera filen igen om den är inaktiverad. Välj Arkiv > Alternativ > Tillägg. Välj Inaktiverade objekt i listan Hantera längst ned och klicka på Kör. Står
PERSONAL.XLSBmed där markerar du den, klickar på Aktivera och startar om Excel. - Testa utan tillägg. Välj COM-tillägg i samma lista och klicka på Kör. Avmarkera tilläggen tillfälligt och starta om Excel. Laddas filen då, kan du slå på tilläggen ett i taget tills du hittar det som ställer till det.
Tänk också på att Excel inte öppnar filerna i XLSTART när programmet startas i felsäkert läge. Saknas makrona bara ibland, kan du kontrollera om Excel har startats på det sättet.
Problem: Makrosäkerheten blockerar körningen
Ibland är det inget fel på koden alls. Excel har helt enkelt stoppat makrot innan det hann starta. Makron kan göra nästan vad som helst på datorn, och därför är de avstängda som standard i filer som Excel inte litar på. Du ser oftast ett gult fält under menyfliksområdet med texten Säkerhetsvarning – Makron har inaktiverats. Klicka på Aktivera innehåll om du vet var filen kommer ifrån, så kan du köra makrot.
Kontrollera inställningarna för makron
Får du ingen varning alls och makrot ändå inte går att köra, kan inställningen vara för strikt. Så här hittar du den:
- Gå till Arkiv > Alternativ > Säkerhetscenter.
- Klicka på Inställningar för Säkerhetscenter.
- Välj Inställningar för makron i listan till vänster.
Har du fliken Utvecklare framme kommer du till samma ställe snabbare via Utvecklare > Makrosäkerhet. Om Inaktivera alla makron utan meddelande är valt stängs makron av utan att Excel säger något. Det är därför det ser ut som att makrot bara inte gör någonting. Välj i stället alternativet som inaktiverar makron med meddelande. Då får du den gula varningen och kan själv bestämma från fil till fil. Att aktivera alla makron rekommenderas inte, eftersom även skadlig kod då körs direkt.
Använd betrodda platser
Har du en mapp med egna arbetsböcker som du kör makron i hela tiden, kan du göra den till en betrodd plats. Filer där öppnas med makron aktiverade, utan varning.
- Öppna Inställningar för Säkerhetscenter som ovan.
- Välj Betrodda platser och klicka på Lägg till ny plats.
- Bläddra fram mappen och markera eventuellt att undermappar också ska vara betrodda.
Lägg bara till mappar som du själv har kontroll över, aldrig exempelvis mappen Hämtade filer.
Filer som laddats ned från internet
Om arbetsboken kommer från internet eller som bilaga i ett e-postmeddelande märker Windows filen som nedladdad. Nyare versioner av Excel blockerar då makrona helt och visar ett rött fält om en säkerhetsrisk i stället för knappen Aktivera innehåll. Lösningen görs utanför Excel:
- Stäng arbetsboken.
- Högerklicka på filen i Utforskaren och välj Egenskaper.
- Markera rutan Avblockera längst ned på fliken Allmänt och klicka på OK.
Gör det bara om du litar på avsändaren. En fil som ligger på en betrodd plats behöver du för övrigt inte avblockera på det här sättet.
Arbetsboken måste sparas som .xlsm
Ett vanligt nybörjarmisstag är att spela in ett makro och sedan spara som en vanlig arbetsbok. Filformatet .xlsx kan inte innehålla makron, så Excel varnar och tar bort koden när du sparar. Öppnar du filen nästa gång är makrot helt enkelt borta. Välj i stället Excel-arbetsbok med stöd för makron (*.xlsm) under Arkiv > Spara som. Har du redan sparat som .xlsx och stängt filen går koden inte att få tillbaka, och då behöver du spela in makrot igen.
Problem: Makrot gör fel när förutsättningarna ändras
Ibland ger makrot inget felmeddelande alls. Det körs till slut, men resultatet blir fel: data hamnar på fel blad, rader saknas eller fel kolumn sorteras. Orsaken är nästan alltid att makrot förutsätter att arbetsboken ser exakt ut som när du spelade in det. Här är de vanligaste fallen.
Makrot startas från fel blad
Inspelad kod anger ofta inte vilket blad den ska arbeta på. En rad som Range("A2:A20").ClearContents gäller det blad som är aktivt när du kör makrot. Om du spelade in på bladet Data men startar makrot medan bladet Sammanställning är öppet, töms fel celler.
Tänk också på att ändringar som ett makro gör inte kan ångras med Ctrl+Z. Testa därför nya eller ändrade makron på en kopia av arbetsboken.
Det finns två enkla sätt att lösa problemet:
- Lägg till en rad först i makrot som väljer rätt blad, till exempel
Worksheets("Data").Activate. - Skriv bladet direkt framför området:
Worksheets("Data").Range("A2:A20").ClearContents. Då spelar det ingen roll vilket blad som är aktivt när makrot startas.
Tomma rader i datan
När du spelar in och trycker Ctrl+↓ för att gå till slutet av en lista, blir det Selection.End(xlDown).Select i koden. Kommandot stannar vid första tomma cell. Om någon senare lämnar en rad tom mitt i listan, behandlar makrot bara raderna ovanför den tomma raden. Samma sak gäller CurrentRegion, som slutar vid en helt tom rad eller kolumn.
Ett säkrare sätt är att leta uppifrån från bladets sista rad. Då hittar du den sista ifyllda cellen i kolumn A även om det finns luckor i listan:
sistaRad = Cells(Rows.Count, "A").End(xlUp).Row
Därefter kan du ange området som Range("A2:A" & sistaRad).
Kolumnerna har ändrats
Om någon infogar en kolumn eller ändrar ordningen på kolumnerna pekar den inspelade koden fortfarande på samma kolumnbokstäver. Ett makro som sorterar på kolumn D sorterar då på helt andra värden, och det märks inte förrän någon granskar resultatet.
Det enklaste är att bestämma att kolumnordningen i underlaget inte ändras. Om det inte går kan du göra om listan till en tabell med Ctrl+T och i koden ange kolumnen med rubriken i stället för bokstaven, till exempel ListObjects(1).ListColumns("Belopp").DataBodyRange. Då fungerar koden även om kolumnen flyttas, så länge rubriken är densamma.
Makrot bygger på markeringar
Makroinspelaren skriver ner varje klick, och därför fylls koden med Select, Activate och Selection. Det gör makrot långsamt och känsligt. Om fel cell råkar vara markerad när makrot startar, eller om ett steg väljer något annat än du tänkt dig, fortsätter resten av koden från fel ställe.
Ofta kan du slå ihop två rader till en. Inspelad kod:
Range("B2").Select
Selection.Font.Bold = True
Förenklad kod som gör samma sak:
Range("B2").Font.Bold = True
På samma sätt kan en inspelad kopiering i sex steg, där du väljer blad, markerar, kopierar, byter blad, markerar igen och klistrar in, skrivas som en enda rad:
Worksheets("Data").Range("A1:D20").Copy Worksheets("Rapport").Range("A1")
Gör ändringarna en i taget och kör makrot efter varje ändring, så ser du direkt om något slutat fungera. Du behöver inte skriva om hela makrot på en gång. Varje Select som du tar bort gör det lite stabilare.
Checklista: Så felsöker du ett makro steg för steg
När ett makro krånglar är det lätt att börja ändra i koden på måfå. Gå hellre igenom stegen nedan i tur och ordning. Oftast hittar du felet redan i de första punkterna.
- Läs felmeddelandet. Notera felnumret och texten, till exempel Körfel 9 eller Körfel 1004. Numret säger ofta vilken typ av problem det är: ett namn som inte finns, ett område som inte går att använda eller ett objekt som saknas.
- Klicka på Felsök. VBA-redigeraren öppnas och den rad som orsakade felet markeras med gult. Det är där du ska börja leta. Läs raden och fundera på vad den förutsätter, till exempel ett visst blad, en viss fil eller en viss cell.
- Stega igenom koden med F8. Stoppa körningen med knappen Återställ (den fyrkantiga stoppknappen), ställ markören i makrot och tryck F8 för att köra en rad i taget. Ha Excelfönstret synligt bredvid, så ser du exakt vad varje rad gör och var det börjar gå fel. Håll muspekaren över en variabel för att se dess värde.
- Kontrollera blad- och filnamn. Jämför namnen i koden, som
Sheets("Blad1")ochWorkbooks("Rapport.xlsx"), med de namn som faktiskt finns i arbetsboken. Titta även på sökvägar till filer och mappar som kan ha flyttats. - Kontrollera referenserna. Pekar makrot på fasta celler eller fasta områden som inte längre stämmer med datan? Har kolumner flyttats eller har det tillkommit rader?
- Kontrollera säkerhetsinställningarna. Startar makrot inte alls kan det vara Excel som blockerar det. Se efter i Säkerhetscenter, kontrollera om filen är blockerad under Egenskaper och att den är sparad som
.xlsm. - Kontrollera var makrot är sparat. Ligger det i den aktuella arbetsboken, i en annan fil eller i PERSONAL.XLSB? Om filen med makrot inte är öppen kan Excel inte heller köra det.
- Avgör om du ska spela in på nytt eller skriva om. Är makrot kort och ändringen stor, till exempel att du nu vill använda relativa referenser, går det ofta snabbast att spela in det igen. Är felet begränsat till ett namn eller ett område är det enklare att rätta just den raden i koden.
Ett bra tips är att alltid testa makrot på en kopia av arbetsboken. Ett makro kan inte ångras med Ctrl+Z, så om något går fel mitt i körningen vill du inte att det ska vara i originalfilen.
Läs vidare
När du vet varför inspelade makron går sönder blir det lättare att spela in dem rätt från början. De här artiklarna är bra nästa steg:
- Vad är ett Excelmakro? går igenom grunderna: vad ett makro är, vad det kan användas till och hur VBA hänger ihop med Excel.
- Skapa ditt egna Excelmakro visar hur du spelar in ett makro steg för steg. Läs den igen med felsökningen i bakhuvudet, så ser du var de fasta referenserna och markeringarna kommer in i koden.
- Personal Macro Workbook – introduktion förklarar hur du sparar makron så att de finns i alla arbetsböcker, och hur PERSONAL.XLSB fungerar när du startar Excel.
Ett tips till sist: när du har fått ett makro att fungera, spara en kopia av koden innan du börjar ändra i den. Då har du alltid en version som du vet fungerar att gå tillbaka till.