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
