Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Macro: (Variable) Jahresperioden in Monatsperioden wandeln

Macro: (Variable) Jahresperioden in Monatsperioden wandeln
31.10.2024 11:40:05
Meike
Liebe Herber-Excelprofis,

ich muss Jahreswerte (bspw. Budgets) in Monatswerte umwandeln (verteilen).

Wege über eine PowerQuery finde ich zu umständlich und würde gerne dafür ein macro benutzen. An der Erstellung scheitere ich aber :-(

Aufbau:
Jahr 1 | Jahr 2 | xxx
0 | 12 | 0

Umwandeln in eine Monatstabelle.

Dabei würde ich gerne unterscheiden in:
Modus 1 = Kosten laufen einmalig in der letzten Periode auf (hier 12 in Monat 24)
Modus 2 = Kosten werden auf die vergangenen Perioden gleichmäßig verteilt (12/24 = 0.5 von Monat 1 bis Monat 24, usw.)

Habe eine aussagekräftige Beispieldatei angefügt.
https://www.herber.de/bbs/user/173319.xlsx

Vielen Dank für Eure Hilfe!
LG
Meike


Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Macro: (Variable) Jahresperioden in Monatsperioden wandeln
31.10.2024 13:16:21
Klexy
Ich habe eine Lösung, kann sie dir aber erst am Nachmittag schicken.
Bis dann
AW: Macro: (Variable) Jahresperioden in Monatsperioden wandeln
31.10.2024 14:03:57
Meike
Hallo Klexy!

das klingt ja super - vielen Dank schon mal vorab!
Bin gespannt.

LG Meike

AW: Macro: (Variable) Jahresperioden in Monatsperioden wandeln
31.10.2024 13:23:02
Yal
Hallo Meike,

ja, es ist mit PQ nicht ganz einfach. Die Handlung der Wert in Zeilen anstatt Spalten ist unüblich:
- Bereich B5:U6 markieren, einen Name vergeben und sofort Menü "Daten", "Aus Tabelle/Bereich". So bekommst Du die Daten in PQ. Die Abfrage heisst "Daten"
- Menü "Tranformieren", "Vertauschen" (=Transponieren)
- Name der Spalten in "Jahr" und "K1" ändern
- Typ von "Jahr" in Datum ändern
- Rechtklick auf "Jahr", "Transformieren", "Jahr", "Jahresende"
- nochmal: "Transformieren", "Monat", "Monatsanfang"
- rechtsklick auf die Abfrage und "Verweis" klicken

- Du hast eine zweite Abfrage, benenne sie "Daten_Modus2" um
- jetzt entsteht eine Fummelei, die nicht ganz PQ-Anfänger Niveau ist. Am besten gebe ich dir den Code. Einfach "Erweiterte Editor" öffnen und Code ersetzen:
let

Quelle = Daten,
Monatswert = (Jahr, Wert)=> List.Generate (() => 1, each _ = 12, each _ + 1, each [Datum = #date(Jahr, _,1), Wert = Wert / 12]),
#"Aufgerufene benutzerdefinierte Funktion" = Table.AddColumn(Quelle, "Monaten", each Monatswert(Date.Year([Jahr]), [K1])),
#"Entfernte Spalten" = Table.RemoveColumns(#"Aufgerufene benutzerdefinierte Funktion",{"Jahr", "K1"}),
#"Erweiterte Monaten" = Table.ExpandListColumn(#"Entfernte Spalten", "Monaten"),
#"Erweiterte Monaten1" = Table.ExpandRecordColumn(#"Erweiterte Monaten", "Monaten", {"Datum", "Wert"}, {"Jahr", "K2"}),
#"Angefügte Abfrage" = Table.Combine({#"Erweiterte Monaten1", Daten}),
#"Ersetzter Wert" = Table.ReplaceValue(#"Angefügte Abfrage",null,0,Replacer.ReplaceValue,{"K1"}),
#"Gruppierte Zeilen" = Table.Group(#"Ersetzter Wert", {"Jahr"}, {{"Kosten Modus 1", each List.Sum([K1]), type any}, {"Kosten Modus 2", each List.Sum([K2]), type number}})
in
#"Gruppierte Zeilen"

Nur soviel: es wird für jede Jahreswert 12 gezwölte Monatswert errechnet samt Datum.
Am Ende werden die beide Abfragen kombiniert und mit endgültige Spaltennamen gruppiert.
Nur diese zweite Abfrage sollte herausgegeben werden (die andere in "Nur Verbindung"). In der Ausgabe, die Spalte "Jahr" als Datum formatieren.

Zugegeben, der VBA-Code ist fast leichter:
Sub Transform()

Dim Daten
Dim Erg
Dim i, j, m

Daten = Worksheets("Sheet1").Range("B5:U6").Value
ReDim Erg(1 To 4, 1 To UBound(Daten, 2) * 12)
For i = 1 To UBound(Daten, 2)
For m = 1 To 12
j = (i - 1) * 12 + m
Erg(3, j) = 0 'default-Monatswert bei Modus 1
If m = 12 Then 'nur bei letztem Monat
Erg(1, j) = DateSerial(Year(Daten(1, i)), 12, 1) 'Jahr übertragen
Erg(3, j) = Daten(2, i) 'Jahreswert übertragen
End If
Erg(2, j) = m 'monat übertragen
Erg(4, j) = Daten(2, i) / 12 'gezwölftelte Jahreswert übertragen
Next
Next
Worksheets("Sheet1").Range("B40").Resize(4, UBound(Erg, 2)) = Erg
End Sub


VG
Yal
Anzeige
AW: Macro: (Variable) Jahresperioden in Monatsperioden wandeln
31.10.2024 18:39:46
Klexy
Hier ist deine Datei mit einer eleganten Lösung:
https://www.herber.de/bbs/user/173332.xlsm

im Tabellenblatt "Lösung" sind die Voraussetzungen: die gelb markierten Zellen bekommen Namen, damit dder Code relativ zu diesen Zellen läuft, egal ob das jetzt in Zeile 1 oder in Zeile 5 stattfinden soll. Und auch egal wie viele Jahre oder Kosten.

Anzeige
AW: Macro: (Variable) Jahresperioden in Monatsperioden wandeln
01.11.2024 01:15:39
Meike
Hey Klexy,

happy Halloween!
Auch Deine Lösung funktioniert :-)

Vielen lieben Dank!
Meike
Korrektur: Anforderung falsch gelesen
31.10.2024 13:49:40
Yal
Hallo Meike,

anbei der korrigierten VBA:
Sub Transform()

Dim Daten
Dim Erg
Dim i, j, m

Daten = Worksheets("Sheet1").Range("Daten").Value
ReDim Erg(1 To 4, 1 To UBound(Daten, 2) * 12)
On Error Resume Next
For i = 1 To UBound(Daten, 2)
'Monatswerte
For m = 1 To 12
j = (i - 1) * 12 + m
Erg(3, j) = 0 'default-Monatswert bei Modus 1
Erg(2, j) = m 'monat übertragen
'Modus 2
Erg(4, j) = Daten(2, i) / 36 'eigenes Jahr: Jahreswert / 36
Erg(4, j - 12) = Erg(4, j - 12) + Daten(2, i) / 36 'Vorjahr
Erg(4, j - 24) = Erg(4, j - 24) + Daten(2, i) / 36 'Vor-Vorjahr
Next
'Jahreswert (Modus 1)
Erg(1, i * 12) = DateSerial(Year(Daten(1, i)), 12, 1) 'Jahr übertragen
Erg(3, i * 12) = Daten(2, i) 'Jahreswert übertragen
Next
Worksheets("Sheet1").Range("B40").Resize(4, UBound(Erg, 2)) = Erg
End Sub


"Vorgangene Periode" interpretiere ich so: ist ein Betrag für 2025 vorhanden, bekommen jede Monat von 2023, 2024 und 2025 ein Sechunddreizigstel der Jahreswert allokiert. Addiert sich zur eventuell vorhandenen Wert.

VG
Yal
Anzeige
AW: Korrektur: Anforderung falsch gelesen
31.10.2024 15:22:20
Meike
Hi Yal,

vielen Dank erstmal. Deine Interpretation ist richtig,

Bei der VBA Lösung bekomme ich leider eine Fehlermeldung. (runtime 1004)
Ist vielleicht besser das Macro auf Inputzeilen (Jahr/Kosten) zu beschränken?
Wo macht der hier eine Identifizierung? *noob*

Dank & LG Meike
Anzeige
AW: Korrektur: Anforderung falsch gelesen
31.10.2024 15:59:31
Yal
Hallo Meike,

ja, richtig. Ich hatte in der erste, falsche Berechnung die Adresse nur auf dem im Forum kopierten Code korrigier, und somit meine zweite Vorschlag auf einem nicht korrigierten Bereich angelegt.
Daten = Worksheets("Sheet1").Range("B5:U6").Value

ist richtig.

Oder Du benennst, wie im PQ-Losung vorgeschlagen, den Bereich B5:U6 in "Daten" (die PQ-Lösung ist übrigens weiterhin auf Basis meiner falsche Annahme. Nicht verwenden)

VG
Yal
Anzeige
AW: Korrektur: Anforderung falsch gelesen
31.10.2024 17:54:19
Meike
Hi Yal,

mach Sinn :-)
Da hätte ich ja auch selber drauf kommen können.

a) Wie binde ich das dropdown in B9 ein, damit ich jeweils nur den gewählten Modus generiere?
b) Ist es viel Aufwand, die Formatierung wie im Beispiel zu übernehmen (Rahmenlinie, Schattierung, Zentrierung,..)?

Vielen lieben Dank!

Meike
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige