Clever-Excel-Forum

Normale Version: Excel VBA Sortierproblem
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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)

ABCDEFG
1StringBeg MonatBeg JahrMonatMonatZahlJahrSortiere
2'Auswertung'!Oktober_2014_Monatssumme1422Oktober10201401.10.2014
3'Auswertung'!November_2014_Monatssumme1423November11201401.11.2014
4'Auswertung'!Januar_2015_Monatssumme1421Januar1201501.01.2015
5'Auswertung'!März_2015_Monatssumme1419März3201501.03.2015
6'Auswertung'!April_2015_Monatssumme1420April4201501.04.2015
7'Auswertung'!Mai_2015_Monatssumme1418Mai5201501.05.2015
8'Auswertung'!Juni_2015_Monatssumme1419Juni6201501.06.2015
9'Auswertung'!Juli_2015_Monatssumme1419Juli7201501.07.2015
10'Auswertung'!August_2015_Monatssumme1421August8201501.08.2015
11'Auswertung'!September_2015_Monatssumme1424September9201501.09.2015
12'Auswertung'!Oktober_2015_Monatssumme1422Oktober10201501.10.2015
13'Auswertung'!November_2015_Monatssumme1423November11201501.11.2015
Formeln der Tabelle
ZelleFormel
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:

AB
1StringSortiere
2'Auswertung'!November_2014_Monatssumme41944
3'Auswertung'!Oktober_2014_Monatssumme41913
4'Auswertung'!April_2015_Monatssumme42095
5'Auswertung'!August_2015_Monatssumme42217
6'Auswertung'!Januar_2015_Monatssumme42005
7'Auswertung'!Juli_2015_Monatssumme42186
8'Auswertung'!Juni_2015_Monatssumme42156
9'Auswertung'!Mai_2015_Monatssumme42125
10'Auswertung'!März_2015_Monatssumme42064
11'Auswertung'!November_2015_Monatssumme42309
12'Auswertung'!Oktober_2015_Monatssumme42278
13'Auswertung'!September_2015_Monatssumme42248
Formeln der Tabelle
ZelleFormel
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.
  1. 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).
  2. Ich nehme eine Hilfsspalte, die auf jeden Fall leer ist und lösche sie nach der Sortierung gleich wieder.
  3. 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.
Seiten: 1 2