Hallo zusammen,
verehrtes Forum vielleicht könnt Ihr mir wieder mal helfen?
Ich lese aus einem Tabellenblatt alle vergebenen Bereichsnamen in ein neues Tabellenblatt des gleichen Workbooks ein.
Die Bereichsnamen sind so angelegt:
'Auswertung'!November_2014_Monatssumme
'Auswertung'!Oktober_2014_Monatssumme
'Auswertung'!April_2015_Monatssumme
'Auswertung'!August_2015_Monatssumme
'Auswertung'!Januar_2015_Monatssumme
'Auswertung'!Juli_2015_Monatssumme
'Auswertung'!Juni_2015_Monatssumme
'Auswertung'!Mai_2015_Monatssumme
'Auswertung'!März_2015_Monatssumme
'Auswertung'!November_2015_Monatssumme
'Auswertung'!Oktober_2015_Monatssumme
'Auswertung'!September_2015_Monatssumme .....usw
Meine Frage ist nun wie ich per VBA eine Sortierung erstellen kann dass "aufsteigend" nach Monat & Jahr sortiert werden kann?
Ist das möglich wenn das Sortierkriterium sich in einem String verbirgt?
Vielen Dank für eine Rückmeldung!
Hallo Erich,
natürlich ist das möglich!
Löse mittels VBA die ausgelesenen Bezeichnungen in Hilfsspalte auf und sortiere dann die ganze Zeile - die Hilfsspalten kannst du anschließend wieder löschen.
Die Monatsnamen muss du mittels Select-Case-Anweisung vom Text in die Zahlenwerte bringen, dann sortierst du mit zwei Kriterien.
Hallo,
ein Tip für die Zukunft:
Wenn Du Datumsangaben in Bezeichnungen verwendest, dann nimm Zahlen und das Format "YYYY-MM-TT" ,
also erst das Jahr dann Monat und Tag, so wird ob in Ordner oder in Namen alles automatisch chronologisch sortiert.
Z.B bei Deinen Namen:
'Auswertung'!_2015_01_Monatssumme
Hi!
Nur zur Demo ...
Ist ganz einfach, vielleicht verwurstelt jemand dieses ja in einer Monsterformel? :19:
(hier bereits nach der Sortierung)
| A | B | C | D | E | F | G |
1 | String | Beg Monat | Beg Jahr | Monat | MonatZahl | Jahr | Sortiere |
2 | 'Auswertung'!Oktober_2014_Monatssumme | 14 | 22 | Oktober | 10 | 2014 | 01.10.2014 |
3 | 'Auswertung'!November_2014_Monatssumme | 14 | 23 | November | 11 | 2014 | 01.11.2014 |
4 | 'Auswertung'!Januar_2015_Monatssumme | 14 | 21 | Januar | 1 | 2015 | 01.01.2015 |
5 | 'Auswertung'!März_2015_Monatssumme | 14 | 19 | März | 3 | 2015 | 01.03.2015 |
6 | 'Auswertung'!April_2015_Monatssumme | 14 | 20 | April | 4 | 2015 | 01.04.2015 |
7 | 'Auswertung'!Mai_2015_Monatssumme | 14 | 18 | Mai | 5 | 2015 | 01.05.2015 |
8 | 'Auswertung'!Juni_2015_Monatssumme | 14 | 19 | Juni | 6 | 2015 | 01.06.2015 |
9 | 'Auswertung'!Juli_2015_Monatssumme | 14 | 19 | Juli | 7 | 2015 | 01.07.2015 |
10 | 'Auswertung'!August_2015_Monatssumme | 14 | 21 | August | 8 | 2015 | 01.08.2015 |
11 | 'Auswertung'!September_2015_Monatssumme | 14 | 24 | September | 9 | 2015 | 01.09.2015 |
12 | 'Auswertung'!Oktober_2015_Monatssumme | 14 | 22 | Oktober | 10 | 2015 | 01.10.2015 |
13 | 'Auswertung'!November_2015_Monatssumme | 14 | 23 | November | 11 | 2015 | 01.11.2015 |
Formeln der Tabelle |
Zelle | Formel | B2 | =FINDEN("!";A2)+1 | C2 | =FINDEN("_";A2)+1 | D2 | =TEIL(A2;B2;C2-B2-1) | E2 | =SUCHEN(LINKS(D2;3);"||janfebmäraprmaijunjulaugsepoktnovdez")/3 | F2 | =TEIL(A2;C2;4) | G2 | =DATUM(F2;E2;1) |
|
Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8
Gruß Ralf
Weil mich der Ehrgeiz packte was kompaktes mit nur einer (Sortier-)Hilfsspalte:
| A | B |
1 | String | Sortiere |
2 | 'Auswertung'!November_2014_Monatssumme | 41944 |
3 | 'Auswertung'!Oktober_2014_Monatssumme | 41913 |
4 | 'Auswertung'!April_2015_Monatssumme | 42095 |
5 | 'Auswertung'!August_2015_Monatssumme | 42217 |
6 | 'Auswertung'!Januar_2015_Monatssumme | 42005 |
7 | 'Auswertung'!Juli_2015_Monatssumme | 42186 |
8 | 'Auswertung'!Juni_2015_Monatssumme | 42156 |
9 | 'Auswertung'!Mai_2015_Monatssumme | 42125 |
10 | 'Auswertung'!März_2015_Monatssumme | 42064 |
11 | 'Auswertung'!November_2015_Monatssumme | 42309 |
12 | 'Auswertung'!Oktober_2015_Monatssumme | 42278 |
13 | 'Auswertung'!September_2015_Monatssumme | 42248 |
Formeln der Tabelle |
Zelle | Formel | B2 | =--(TEIL(A2;FINDEN("!";A2)+1;3)&TEIL(A2;FINDEN("_";A2)+3;2)) |
|
Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8
:19:
Gruß Ralf
... jetzt muss nur noch aufsteigend nach Spalte B sortiert werden!
Danke Leute,
Ihr seid so cool und kompetent, einfach klasse.
Ich werde Eure Ratschläge versuchen umzusetzen und testen.
Eine VBA Lösung wäre aber immer noch nicht schlecht.
Vielen Dank!
Hi,
(01.12.2015, 22:41)sharky51 schrieb: [ -> ]Eine VBA Lösung wäre aber immer noch nicht schlecht.
Option Explicit
Sub Sortieren_nach_Jahr_und_Monat()
'
' Sortieren_nach_Jahr_und_Monat Makro
'
Dim loLetzte As Long
'
loLetzte = Cells(Rows.Count, 2).End(xlUp).Row ' letzte belegte in Spalte B (2)
Range("B2:B" & loLetzte).FormulaR1C1 = _
"=--(MID(RC[-1],FIND(""!"",RC[-1])+1,3)&MID(RC[-1],FIND(""_"",RC[-1])+3,2))"
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("B1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("A2:B" & loLetzte)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B2").Select
End Sub
VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media
Code erstellt und getestet in Office 15 - mit VBAHTML 12.6.0
Hi Ralf!
Nur ergänzend bzw. meine Sicht der Dinge, hat nichts mit Deinem Code zu tun.
- Ich persönlich mag die Sortiermethode ab 2007 nicht und verwende lieber eine Zeile nachvollziehbaren Code als die acht, die uns der Makrorekorder aufdrängt (zumindest, wenn es sich um eine "normale" Sortierung handelt).
- Ich nehme eine Hilfsspalte, die auf jeden Fall leer ist und lösche sie nach der Sortierung gleich wieder.
- Normalerweise nehme ich auch die .FormulaR1C1-Variante, weil es auch diejenige ist, die Excel intern verwendet. Hier mal ausnahmsweise die .FormulaLocal-Version, damit der TE sieht, dass das Makro nichts anderes macht wie meine oben gepostete Formellösung.
Sub SortRPP()
Dim Spalte As Integer, Zeile As Long
Spalte = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Zeile = Cells(Rows.Count, 1).End(xlUp).Row
With ActiveSheet
.Range(Cells(2, Spalte), Cells(Zeile, Spalte)).FormulaLocal = _
"=--(TEIL(A2;FINDEN(""!"";A2)+1;3)&TEIL(A2;FINDEN(""_"";A2)+3;2))"
.UsedRange.Sort Key1:=.Columns(Spalte), Order1:=xlAscending, Header:=xlYes
.Columns(Spalte).Delete
End With
End Sub
Gruß Ralf
Hi Ralf,
(02.12.2015, 11:09)RPP63 schrieb: [ -> ]Nur ergänzend bzw. meine Sicht der Dinge, hat nichts mit Deinem Code zu tun.
das ist gar kein Problem. Ich hatte, weil ich zu faul war, länger nachzudenken, das Makro aufgezeichnet und dann verallgemeinert und die meisten Activates/Selects entfernt.
Dein Code ist natürlich besser und wahrscheinlich schneller.
FormulaLocal gefällt mir auch viel besser, hab aber nicht dran gedacht, R1C1 im Code zu ersetzen.