Prompter: AI för ekonomer

Den här sidan samlar alla prompter från kursen AI för ekonomer. Varje prompt ligger i en kopierbar kodruta. Kopiera hela blocket och klistra in i ditt AI-verktyg. Innehåll * Pass I

Den här sidan samlar alla prompter från kursen AI för ekonomer. Varje prompt ligger i en kopierbar kodruta. Kopiera hela blocket och klistra in i ditt AI-verktyg.

Innehåll

  • Pass I – Live-demos (m01)
    • Finansiell analys med AI
    • Excel VBA-kod med AI
    • Rapportsammanfattning
  • Pass III – Praktiska övningar (m03)
    • Prompt för Excel VBA
    • Exempel: Finansanalys prompt
    • Rapportanalys prompt
    • Budgetplanering prompt
  • Extramaterial

💡 Osäker på VBA? Guide: Kom igång med VBA i Excel för ekonomer


Pass I – Live-demos (m01)

Finansiell analys med AI

Jag har följande nyckeltal för företaget ABC:
- Omsättningstillväxt: +15% (föregående år +8%)
- Rörelsemarginal: 12% (föregående år 14%) 
- Skuldsättningsgrad: 0.6 (föregående år 0.4)
- Likviditetskvot: 1.2 (föregående år 1.5)

Analysera företagets finansiella position och ge rekommendationer.

Excel VBA-kod med AI

Jag har importerat en csv-fil med försäljningsdata med kolumnerna:
- Datum, Kund, Produktkategori, Belopp, Säljare

Skapa VBA-kod som:
1. Skapar en pivottabell med försäljning per månad och kategori
2. Beräknar tillväxt jämfört med föregående månad
3. Formaterar tabellen professionellt
4. Skapar ett stapeldiagram

Koden måste vara så enkel som möjligt och fungera både på PC och Mac.

Alternativ:

Jag har importerat en CSV-fil i första bladet i Excel.
Filen innehåller kolumnerna:
	•	Datum
	•	Kund
	•	Produktkategori
	•	Belopp
	•	Säljare

Skriv ett enkelt VBA-makro (utan FileDialog, utan pivottabeller, utan externa bibliotek, utan ActiveX) som gör följande:

1. Använder det aktiva bladet (t.ex. Blad1) som datakälla. Rubrikerna ligger i rad 1.

2. Lägger till en ny kolumn ÅrMånad (format yyyy-mm) baserat på kolumnen Datum. Datum kan vara i datumformat eller som text i ÅÅÅÅ-MM-DD, och koden ska fungera i båda fallen.

3. Räknar ut summan av Belopp per (ÅrMånad × Produktkategori) direkt med VBA och skriver resultatet till ett nytt blad som heter Rapport. (Ingen pivottabell.)

4. Beräknar för varje produktkategori även tillväxt i % jämfört med föregående månad (första månaden lämnas tom).

5. Formaterar tabellen med rubriker, siffror och AutoFit.

6. Skapar ett stapeldiagram från huvudtabellen (försäljning per månad och kategori).

All kod ska ligga i en modul och ha ett huvudmakro som heter FörstaÖvning_VBA().
När koden körts ska ett meddelande visas: “Klar! Se bladet ‘Rapport’”.

Skriv ut hela den färdiga VBA-koden.

Rapportsammanfattning

Sammanfatta denna årsredovisning för styrelsemedlemmar som inte har tid att läsa hela rapporten. Fokusera på:

1. Finansiell prestation vs mål
2. Största risker och möjligheter  
3. Viktiga förändringar sedan förra året
4. Rekommendationer för nästa år

Håll sammanfattningen under 500 ord och använd tydliga rubriker.

Pass III – Praktiska övningar (m03)

Prompt för Excel VBA

Jag har importerat en csv-fil med försäljningsdata med följande kolumner:
- A: Datum (format: YYYY-MM-DD)
- B: Kund  
- C: Produktkategori
- D: Belopp
- E: Säljare
- F: Region

Skapa VBA-kod som:

1. Skapar en pivottabell på nytt blad som visar:
   - Rader: Månad (från Datum)
   - Kolumner: Produktkategori  
   - Värden: Summa av Belopp

2. Lägger till kolumn som beräknar procentuell tillväxt jämfört med föregående månad

3. Formaterar tabellen professionellt med:
   - Rubriker i fet stil
   - Tal formaterade som kronor
   - Zebra-randig bakgrund

4. Skapar ett stapeldiagram som visar totalförsäljning per månad

Inkludera felhantering och kommentarer i koden. Viktigt: koden ska gå att köra på både PC och Mac och vara så enkel som möjligt.

Exempel: Finansanalys prompt

Analysera följande finansiella nyckeltal för Företag XYZ (detaljhandel):

LÖNSAMHET:
- Rörelsemarginal: 8.5% (branschsnitt: 12%)
- Nettomarginal: 4.2% (branschsnitt: 6%)
- ROE: 15% (branschsnitt: 18%)

LIKVIDITET:
- Kassalikviditet: 0.8 (branschsnitt: 1.2)  
- Balanslikviditet: 1.3 (branschsnitt: 1.5)

SOLIDITET:
- Soliditet: 35% (branschsnitt: 45%)
- Skuldsättningsgrad: 1.9 (branschsnitt: 1.2)

TILLVÄXT:
- Omsättningstillväxt: +12% (branschsnitt: +8%)
- Resultattillväxt: +18% (branschsnitt: +10%)

Gör en systematisk analys och ge konkreta rekommendationer för:
1. Förbättring av lönsamhet
2. Stärkning av likviditet  
3. Optimering av kapitalstruktur
4. Bedömning av kreditvärdighet (skala 1-10)

Rapportanalys prompt

Här är en pdf med ett företags Q2-rapport. Extrahera och strukturera informationen:

[Bifoga pdf]

Leverera resultatet i följande format:

## NYCKELTAL (lämpligt för Excel)
| Kategori | Q2 2024 | Q2 2023 | Förändring |
|----------|---------|---------|------------|

## VIKTIGA FÖRÄNDRINGAR
- Lista de 5 mest betydelsefulla förändringarna

## RISKER
- Identifiera potentiella risker som nämns

## MÖJLIGHETER  
- Framtidssatsningar och tillväxtområden

## EXECUTIVE SUMMARY (max 150 ord)
- Sammanfattning för ledning som inte har tid läsa hela rapporten

Fokusera på kvantifierbara data och undvik vaga formuleringar.

Budgetplanering prompt

Baserat på följande historiska försäljningsdata, skapa en budget för 2025:

MÅNADSFÖRSÄLJNING 2022-2024:
2022: Jan 850k, Feb 920k, Mar 1100k, Apr 1200k, Maj 1150k, Jun 980k, Jul 750k, Aug 680k, Sep 1080k, Okt 1250k, Nov 1400k, Dec 1650k

2023: Jan 900k, Feb 980k, Mar 1180k, Apr 1280k, Maj 1200k, Jun 1020k, Jul 800k, Aug 720k, Sep 1140k, Okt 1320k, Nov 1480k, Dec 1750k

2024: Jan 950k, Feb 1050k, Mar 1250k, Apr 1350k, Maj 1280k, Jun 1080k, Jul 850k, Aug 780k, Sep 1220k, Okt 1420k, Nov (prognos) 1580k, Dec (prognos) 1850k

EXTERNA FAKTORER:
- Förväntad inflation: 3%
- Ny konkurrent lanserar i mars 2025
- Planerad marknadsföringssatsning Q2 2025: +2M SEK

Skapa:
1. Månatlig prognos för 2025 (konservativ, realistisk, optimistisk)
2. Identifiera säsongsmönster och trender  
3. Kvantifiera påverkan av externa faktorer
4. Rekommendera när marknadsföringssatsningen bör göras för maximal effekt

Extramaterial


PASS I – LIVE-DEMOS (M01)

Första övning:

Option Explicit

Public Sub FörstaÖvning_VBA()
    Dim wsData As Worksheet, wsRep As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim cDat As Long, cKat As Long, cBel As Long, cYM As Long
    Dim r As Long
    
    Set wsData = ActiveSheet
    If wsData Is Nothing Then Exit Sub
    
    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
    lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column
    If lastRow < 2 Then Exit Sub
    
    cDat = FindHeader(wsData, "Datum")
    cKat = FindHeader(wsData, "Produktkategori")
    cBel = FindHeader(wsData, "Belopp")
    If cDat = 0 Or cKat = 0 Or cBel = 0 Then
        MsgBox "Rubriker saknas. Krävs: Datum, Produktkategori, Belopp.", vbExclamation
        Exit Sub
    End If
    
    ' ÅrMånad
    cYM = lastCol + 1
    wsData.Cells(1, cYM).Value = "ÅrMånad"
    For r = 2 To lastRow
        wsData.Cells(r, cYM).Value = YearMonthOf(wsData.Cells(r, cDat).Value)
    Next r
    
    ' Unika månader & kategorier (utan Dictionary/ActiveX)
    Dim months() As String, cats() As String
    months = UniqueValues(wsData, cYM, lastRow)
    cats = UniqueValues(wsData, cKat, lastRow)
    SortStrings months: SortStrings cats
    
    ' 2D-summa: månader x kategorier
    Dim m As Long, k As Long
    Dim sums() As Double
    ReDim sums(0 To UBound(months), 0 To UBound(cats))
    
    For r = 2 To lastRow
        Dim ym As String, cat As String, bel As Double
        ym = CStr(wsData.Cells(r, cYM).Value)
        cat = CStr(wsData.Cells(r, cKat).Value)
        bel = Val(CStr(wsData.Cells(r, cBel).Value))
        m = IndexOf(months, ym): k = IndexOf(cats, cat)
        If m >= 0 And k >= 0 Then sums(m, k) = sums(m, k) + bel
    Next r
    
    ' Skapa Rapport
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("Rapport").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    Set wsRep = Worksheets.Add(After:=wsData): wsRep.Name = "Rapport"
    
    Dim sr As Long, sc As Long: sr = 3: sc = 2
    wsRep.Cells(1, sc).Value = "Försäljning per månad och kategori"
    wsRep.Cells(1, sc).Font.Bold = True: wsRep.Cells(1, sc).Font.Size = 14
    
    wsRep.Cells(sr - 1, sc).Value = "ÅrMånad"
    For k = 0 To UBound(cats)
        wsRep.Cells(sr - 1, sc + 1 + k).Value = cats(k)
    Next k
    For m = 0 To UBound(months)
        wsRep.Cells(sr + m, sc).Value = months(m)
        For k = 0 To UBound(cats)
            wsRep.Cells(sr + m, sc + 1 + k).Value = sums(m, k)
        Next k
    Next m
    
    ' MoM
    Dim gap As Long: gap = 2
    Dim momC0 As Long: momC0 = sc + 1 + UBound(cats) + gap
    wsRep.Cells(sr - 1, momC0).Value = "MoM Tillväxt (%)"
    For k = 0 To UBound(cats)
        wsRep.Cells(sr - 1, momC0 + 1 + k).Value = cats(k)
    Next k
    Dim currV As Double, prevV As Double
    For m = 0 To UBound(months)
        wsRep.Cells(sr + m, momC0).Value = months(m)
        For k = 0 To UBound(cats)
            currV = wsRep.Cells(sr + m, sc + 1 + k).Value
            If m = 0 Then
                wsRep.Cells(sr + m, momC0 + 1 + k).Value = vbNullString
            Else
                prevV = wsRep.Cells(sr + m - 1, sc + 1 + k).Value
                If prevV <> 0 Then
                    wsRep.Cells(sr + m, momC0 + 1 + k).Value = (currV - prevV) / prevV
                Else
                    wsRep.Cells(sr + m, momC0 + 1 + k).Value = vbNullString
                End If
            End If
        Next k
    Next m
    
    ' Formatering
    Dim lastRepRow As Long: lastRepRow = sr + UBound(months)
    wsRep.Range(wsRep.Cells(sr - 1, sc), wsRep.Cells(lastRepRow, sc)).NumberFormat = "@"
    wsRep.Range(wsRep.Cells(sr, sc + 1), wsRep.Cells(lastRepRow, sc + 1 + UBound(cats))).NumberFormat = "#,##0"
    wsRep.Range(wsRep.Cells(sr, momC0 + 1), wsRep.Cells(lastRepRow, momC0 + 1 + UBound(cats))).NumberFormat = "0.0%"
    wsRep.Rows(sr - 1).Font.Bold = True
    wsRep.Columns.AutoFit
    
    ' Diagram
    Dim chObj As ChartObject, cht As Chart, src As Range
    Set src = wsRep.Range(wsRep.Cells(sr - 1, sc), wsRep.Cells(lastRepRow, sc + 1 + UBound(cats)))
    Set chObj = wsRep.ChartObjects.Add(Left:=wsRep.Columns(sc).Left, Top:=wsRep.Rows(lastRepRow + 3).Top, Width:=600, Height:=320)
    Set cht = chObj.Chart
    cht.ChartType = xlColumnClustered
    cht.SetSourceData src
    cht.HasTitle = True
    cht.ChartTitle.Text = "Försäljning per månad och kategori"
    cht.HasLegend = True
    
    MsgBox "Klar! Se bladet 'Rapport'.", vbInformation
End Sub

' ---- Hjälp ----
Private Function FindHeader(ws As Worksheet, ByVal header As String) As Long
    Dim c As Range: Set c = ws.Rows(1).Find(What:=header, LookAt:=xlWhole)
    If Not c Is Nothing Then FindHeader = c.Column
End Function

Private Function YearMonthOf(v As Variant) As String
    If IsDate(v) Then
        YearMonthOf = Format(CDate(v), "yyyy-mm")
    Else
        Dim s As String: s = Trim$(CStr(v))
        If Len(s) >= 7 Then YearMonthOf = Left$(s, 7) Else YearMonthOf = ""
    End If
End Function

Private Function UniqueValues(ws As Worksheet, ByVal col As Long, ByVal lastRow As Long) As String()
    Dim coll As Collection: Set coll = New Collection
    Dim r As Long, val As String
    On Error Resume Next
    For r = 2 To lastRow
        val = CStr(ws.Cells(r, col).Value)
        If Len(val) > 0 Then coll.Add val, val  ' dubbletter ignoreras via fel
    Next r
    On Error GoTo 0
    Dim arr() As String, i As Long
    ReDim arr(0 To coll.Count - 1)
    For i = 1 To coll.Count
        arr(i - 1) = coll(i)
    Next i
    UniqueValues = arr
End Function

Private Sub SortStrings(ByRef a() As String)
    Dim i As Long, j As Long, t As String
    If (Not Not a) = 0 Then Exit Sub
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(j) < a(i) Then t = a(i): a(i) = a(j): a(j) = t
        Next j
    Next i
End Sub

Private Function IndexOf(a() As String, ByVal s As String) As Long
    Dim i As Long
    For i = LBound(a) To UBound(a)
        If a(i) = s Then IndexOf = i: Exit Function
    Next i
    IndexOf = -1
End Function

Pivot:

Option Explicit

Public Sub SkapaPivot()
    Dim srcWs As Worksheet, pvtWs As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim rng As Range, pc As PivotCache, pt As PivotTable
    Dim dfSum As PivotField, dfGrowth As PivotField
    Dim datumCol As Long

    Set srcWs = ActiveSheet

    '--- hitta använd område + kolumnindex för "Datum"
    With srcWs
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Set rng = .Range(.Cells(1, 1), .Cells(lastRow, lastCol))
        datumCol = HittaKolumnIndex(.Rows(1), "Datum")
        If datumCol = 0 Then
            MsgBox "Hittar inte kolumnen 'Datum' i rubrikraden.", vbExclamation
            Exit Sub
        End If
    End With

    '--- försök konvertera textdatum (t.ex. '2025-09-14') till riktiga datum
    Call KonverteraDatumKolumn(srcWs, datumCol, lastRow)

    '--- skapa/återställ bladet "Pivot"
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("Pivot").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    Set pvtWs = Worksheets.Add(After:=srcWs)
    pvtWs.Name = "Pivot"

    '--- bygg pivotcache & pivottabell
    Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng)
    Set pt = pc.CreatePivotTable(TableDestination:=pvtWs.Range("A3"), TableName:="PivotFörsäljning")

    With pt
        .RowAxisLayout xlTabularRow
        .RepeatAllLabels xlRepeatLabels
        .NullString = "0"
        On Error Resume Next
        .TableStyle2 = "PivotStyleMedium9" ' snygg standardstil
        On Error GoTo 0
    End With

    '--- fält: rader = Produktkategori, kolumner = Datum (grupperad till Månader)
    With pt
        .PivotFields("Produktkategori").Orientation = xlRowField
        .PivotFields("Produktkategori").Position = 1

        With .PivotFields("Datum")
            .Orientation = xlColumnField
            .Position = 1
        End With

        ' Autogruppning (År + Mån) – funkar om "Datum" är riktiga datum
        On Error Resume Next
        .PivotFields("Datum").AutoGroup
        On Error GoTo 0

        ' Summa Belopp
        Set dfSum = .AddDataField(.PivotFields("Belopp"), "Summa Belopp", xlSum)
        dfSum.NumberFormat = "#,##0"

        ' Tillväxt % jämfört med föregående månad
        Set dfGrowth = .AddDataField(.PivotFields("Belopp"), "Tillväxt % vs föreg. månad", xlSum)
        With dfGrowth
            .Calculation = xlPercentDifferenceFrom
            .BaseField = "Datum"
            .BaseItem = xlPrevious
            .NumberFormat = "0.0%"
        End With

        .RowAxisLayout xlTabularRow
        .HasAutoFormat = True
    End With

    '--- lite ren finish
    pvtWs.Columns.AutoFit
    pvtWs.Range("A1").Value = "Försäljning per månad och kategori"
    With pvtWs.Range("A1")
        .Font.Bold = True
        .Font.Size = 14
    End With

    '--- skapa stapeldiagram (pivotchart) kopplat till tabellen
    Call SkapaStapeldiagram(pvtWs, pt)

    MsgBox "Klart! Bladet 'Pivot' innehåller pivottabell med tillväxt och stapeldiagram.", vbInformation
End Sub

' Hjälpfunktion: hitta kolumnindex för ett fältnamn i rad 1
Private Function HittaKolumnIndex(ByVal headerRow As Range, ByVal fieldName As String) As Long
    Dim c As Range
    For Each c In headerRow.Cells
        If Trim$(LCase$(c.Value2)) = Trim$(LCase$(fieldName)) Then
            HittaKolumnIndex = c.Column
            Exit Function
        End If
        If c.Value2 = "" Then Exit For ' sluta vid första tomma cell efter rubriker
    Next c
    HittaKolumnIndex = 0
End Function

' Försök konvertera text som ser ut som YYYY-MM-DD till riktiga datum
Private Sub KonverteraDatumKolumn(ByVal ws As Worksheet, ByVal col As Long, ByVal lastRow As Long)
    Dim r As Long, v
    For r = 2 To lastRow
        v = ws.Cells(r, col).Value
        If VarType(v) = vbString Then
            If v Like "####-##-##" Then
                On Error Resume Next
                ws.Cells(r, col).Value = DateSerial(Left$(v, 4), Mid$(v, 6, 2), Right$(v, 2))
                On Error GoTo 0
            ElseIf IsDate(v) Then
                ws.Cells(r, col).Value = CDate(v)
            End If
        End If
    Next r
    ws.Columns(col).NumberFormat = "yyyy-mm-dd"
End Sub

' Skapa ett enkelt klustrat stapeldiagram baserat på pivottabellen
Private Sub SkapaStapeldiagram(ByVal pvtWs As Worksheet, ByVal pt As PivotTable)
    Dim ch As Chart

    ' Försök med AddChart2 (nyare Excel); falla tillbaka till AddChart på äldre
    On Error Resume Next
    Set ch = pvtWs.Shapes.AddChart2(240, xlColumnClustered).Chart
    If ch Is Nothing Then
        Dim shp As Shape
        Set shp = pvtWs.Shapes.AddChart(xlColumnClustered)
        Set ch = shp.Chart
    End If
    On Error GoTo 0

    With ch
        .SetSourceData pt.TableRange1
        .HasTitle = True
        .ChartTitle.Text = "Försäljning per månad och kategori"
        .Legend.Position = xlLegendPositionRight
        .Parent.Left = pvtWs.Range("A" & pt.TableRange2.Row + pt.TableRange2.Rows.Count + 2).Left
        .Parent.Top = pvtWs.Range("A" & pt.TableRange2.Row + pt.TableRange2.Rows.Count + 2).Top
        .Parent.Width = 600
        .Parent.Height = 350
    End With
End Sub

PASS III – PRAKTISKA ÖVNINGAR (M03)

Pivot:

Option Explicit

'===========================================================
' Bygger pivot + tillväxt + diagram från enkel försäljningsdata
' Förväntad datakälla (aktivt blad):
'   A: Datum (YYYY-MM-DD eller giltigt datum)
'   B: Kund
'   C: Produktkategori
'   D: Belopp (tal)
'   E: Säljare
'   F: Region
'
' Output:
'   - Nytt blad "Pivot" med pivottabell:
'       Rader: Månad (från Datum)
'       Kolumner: Produktkategori
'       Värden: Summa av Belopp
'     + Till höger: tabell med Månad, Total och Tillväxt % mot föregående månad
'   - Stapeldiagram med totalförsäljning per månad
'
' Designval för enkelhet & kompatibilitet:
'   - Inga ActiveX-/COM-beroenden.
'   - En hjälpkolumn "Månad" (första dagen i månaden) skapas i datakällan för stabil gruppering.
'   - Tillväxt beräknas i separat översiktstabell (robust och tydligt).
'===========================================================

Public Sub ByggFörsäljningsPivot()
    On Error GoTo FailSafe

    Dim wsData As Worksheet, wsPV As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim rngData As Range
    Dim hasMonthCol As Boolean
    Dim monthCol As Long
    Dim i As Long
    Dim dt As Date, s As String
    Dim pc As PivotCache, pt As PivotTable
    Dim df As PivotField, rf As PivotField, cf As PivotField
    Dim dfName As String
    Dim pvtName As String
    Dim overviewStart As Range, tbl As ListObject
    Dim ch As ChartObject
    Dim itm As PivotItem
    Dim outRow As Long

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set wsData = ActiveSheet

    '--- 0) Grundkontroller
    If wsData.Cells(1, 1).Value <> "Datum" _
       Or wsData.Cells(1, 3).Value <> "Produktkategori" _
       Or wsData.Cells(1, 4).Value <> "Belopp" Then
        Err.Raise vbObjectError + 101, , _
            "Rubriker saknas eller är fel. Kräver minst: A: Datum, C: Produktkategori, D: Belopp."
    End If

    ' Hitta sista rad/kolumn i källdata
    lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column

    If lastRow < 2 Then
        Err.Raise vbObjectError + 102, , "Inga data hittades (minst en datarad krävs)."
    End If

    '--- 1) Skapa / uppdatera hjälpkolumn "Månad" (första dagen i månaden)
    '     Lägger den som sista kolumn om den inte finns.
    hasMonthCol = False
    For i = 1 To lastCol
        If LCase$(wsData.Cells(1, i).Value) = "månad" Then
            hasMonthCol = True
            monthCol = i
            Exit For
        End If
    Next i

    If Not hasMonthCol Then
        monthCol = lastCol + 1
        wsData.Cells(1, monthCol).Value = "Månad"
        lastCol = monthCol
    End If

    ' Fyll "Månad" från Datum (tålig mot text "YYYY-MM-DD" och datumformat)
    For i = 2 To lastRow
        s = Trim$(CStr(wsData.Cells(i, 1).Value))
        If IsDate(s) Then
            dt = CDate(s)
        ElseIf Len(s) >= 10 And Mid$(s, 5, 1) = "-" And Mid$(s, 8, 1) = "-" Then
            ' Text i ISO-format YYYY-MM-DD
            dt = DateSerial(CLng(Left$(s, 4)), CLng(Mid$(s, 6, 2)), CLng(Mid$(s, 9, 2)))
        Else
            ' Om allt faller, markera tomt (filtreras bort i pivot)
            dt = 0
        End If

        If dt <> 0 Then
            wsData.Cells(i, monthCol).Value = DateSerial(Year(dt), Month(dt), 1)
        Else
            wsData.Cells(i, monthCol).ClearContents
        End If
    Next i

    ' Sätt visningsformat yyyy-mm på hjälpkolumnen
    wsData.Columns(monthCol).NumberFormat = "yyyy-mm"

    ' Definiera hela dataintervallet inkl hjälpkolumn
    Set rngData = wsData.Range(wsData.Cells(1, 1), wsData.Cells(lastRow, lastCol))

    '--- 2) Skapa blad "Pivot" fräscht
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("Pivot").Delete
    Application.DisplayAlerts = True
    On Error GoTo FailSafe

    Set wsPV = Worksheets.Add(After:=wsData)
    wsPV.Name = "Pivot"

    '--- 3) Bygg pivottabell
    Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData)
    pvtName = "FörsäljningsPivot"

    Set pt = pc.CreatePivotTable(TableDestination:=wsPV.Range("A3"), TableName:=pvtName)

    ' Rader: Månad
    Set rf = pt.PivotFields("Månad")
    rf.Orientation = xlRowField
    rf.Position = 1
    rf.NumberFormat = "yyyy-mm"
    rf.Subtotals(1) = False ' inga delsumma-rader
    pt.RowAxisLayout xlTabularRow

    ' Kolumner: Produktkategori
    Set cf = pt.PivotFields("Produktkategori")
    cf.Orientation = xlColumnField
    cf.Position = 1
    cf.Subtotals(1) = False

    ' Värden: Summa av Belopp
    Set df = pt.PivotFields("Belopp")
    df.Orientation = xlDataField
    df.Function = xlSum
    dfName = df.Name ' fånga den faktiska datafältsrubriken
    df.NumberFormat = "#,##0 [$kr]"

    ' Visa rad-grand total (används även i översikt)
    pt.RowGrand = True
    pt.ColumnGrand = True

    ' Stil & zebra-randning
    pt.DisplayErrorString = False
    pt.RepeatAllLabels xlRepeatLabels
    pt.ShowTableStyleRowStripes = True
    pt.TableStyle2 = "PivotStyleMedium9" ' zebra-liknande pivotstil
    ' Fet rubrikrad
    pt.TableRange1.Rows(1).Font.Bold = True

    ' Sortera månader stigande (säkerställ att tomma hamnar sist)
    rf.AutoSort xlAscending, rf.Name

    '--- 4) Bygg en översiktstabell med (Månad, Total) och Tillväxt %
    ' Placerar denna direkt till höger om pivoten
    Dim pr As Range, leftTop As Range
    Set pr = pt.TableRange2
    Set leftTop = wsPV.Cells(pr.Row, pr.Column + pr.Columns.Count + 2)

    leftTop.Offset(0, 0).Value = "Månad"
    leftTop.Offset(0, 1).Value = "Total"
    leftTop.Offset(0, 2).Value = "Tillväxt % mot föreg. mån"

    leftTop.Resize(1, 3).Font.Bold = True

    ' Loopa över alla månadsposter i pivoten och hämta total per månad
    outRow = 1
    For Each itm In rf.PivotItems
        ' Hoppa över tomma/blank poster om de skulle finnas
        If Len(Trim$(itm.Name)) > 0 Then
            leftTop.Offset(outRow, 0).Value = itm.Name
            ' Hämta total via GetPivotData mot radens månad
            On Error Resume Next
            leftTop.Offset(outRow, 1).Formula = "=GETPIVOTDATA(""" & dfName & """," & pt.TableRange2.Cells(1, 1).Address(True, True) & _
                ",""Månad"",""" & itm.Name & """)"
            On Error GoTo FailSafe
            outRow = outRow + 1
        End If
    Next itm

    ' Formatera totalsiffror som kronor
    leftTop.Offset(1, 1).Resize(outRow - 1, 1).NumberFormat = "#,##0 [$kr]"

    ' Tillväxt%: (den första raden lämnas tom)
    Dim rStart As Range, rEnd As Range
    Set rStart = leftTop.Offset(1, 2)
    Set rEnd = leftTop.Offset(outRow - 1, 2)

    If outRow > 2 Then
        ' Formeln jämför aktuell total mot föregående rad (undviker #Div/0!)
        rStart.FormulaR1C1 = "=IF(RC[-1]=0,"""",IF(R[-1]C[-1]=0,"""",(RC[-1]/R[-1]C[-1])-1))"
        rStart.AutoFill Destination:=rStart.Resize(outRow - 2, 1)
        leftTop.Offset(1, 2).Resize(outRow - 1, 1).NumberFormat = "0.0%"
    End If

    ' Gör översikten till en "riktig" tabell med zebra
    Dim lastOverviewRow As Long
    lastOverviewRow = leftTop.Row + outRow - 1
    Set tbl = wsPV.ListObjects.Add(xlSrcRange, wsPV.Range(leftTop, wsPV.Cells(lastOverviewRow, leftTop.Column + 2)), , xlYes)
    tbl.Name = "ÖversiktMånad"
    tbl.TableStyle = "TableStyleMedium2" ' zebra

    '--- 5) Skapa stapeldiagram över totalförsäljning per månad
    ' Diagrammet baseras på Översiktens två första kolumner (Månad, Total)
    Set ch = wsPV.ChartObjects.Add(Left:=tbl.Range.Offset(0, 4).Left, _
                                   Top:=tbl.Range.Top, _
                                   Width:=420, Height:=260)
    ch.Chart.ChartType = xlColumnClustered
    ch.Chart.SetSourceData Source:=tbl.DataBodyRange.Columns(1).Resize(, 2)
    ch.Chart.HasTitle = True
    ch.Chart.ChartTitle.Text = "Total försäljning per månad"
    ch.Chart.Axes(xlCategory).HasTitle = True
    ch.Chart.Axes(xlCategory).AxisTitle.Characters.Text = "Månad"
    ch.Chart.Axes(xlValue).HasTitle = True
    ch.Chart.Axes(xlValue).AxisTitle.Characters.Text = "Kronor"
    ch.Chart.Legend.Delete ' onödig för två-kolumners källa

    ' Lite luft runt pivot
    wsPV.Columns.AutoFit

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    MsgBox "Klart! Bladet 'Pivot' innehåller pivottabell, tillväxt och diagram.", vbInformation
    Exit Sub

FailSafe:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Något gick fel: " & Err.Description, vbExclamation
End Sub