Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Excel 2003 - 5 Ebenen sortieren

Frage Microsoft Microsoft Office

Mitglied: MohrSys

MohrSys (Level 1) - Jetzt verbinden

11.08.2010, aktualisiert 22:22 Uhr, 6576 Aufrufe, 7 Kommentare

Hallo Freaks,

ich habe ein Problem mit Excel 2003 und hoffe ihr könnt mir helfen?!?!?!?!

Und zwar habe ich eine große Tabelle und möchte diese nach 5 Ebenen sortieren.
Leider kann ich im Menü "sortieren" nur 3 Ebenen sortieren lassen.

Kann ich dieses Fenster "erweitern"???

Vielen vielen Dank für eure Hilfe!!!

Grüße,
Christian
Mitglied: Biber
11.08.2010 um 22:07 Uhr
Moin Mit-Freak,

bitte beschränke die Verwendung von "???" und "!!!" und "?!?!?!" auf ein normales Dorfdisko-vor-21h-Maß.
Dann kommen mehr Antworten zum eigentlichen Thema.

a) Du kannst nicht mit vertretbarem Aufwand das Menü "Sortieren" erweitern
b) du kannst aber natürlich eine zusätzliche (meinetwegen unsichtbare) Hilfsspalte anlegen, nach der du ganz oder teilsortierst.
Beispiel. Wenn du eigentlich nach Spalten B, E, F, K und L sortieren musst, leg dir doch in Feld W2 (wie Whatever) per Formel
=B2 & E2 & F2 &K2 & L2

...an und kopiere es nach unten.
Und sortier dann nach Spalte W
c) Wenn du eine Excel-Tapete hast, die du nach 5 Spalten sortieren musst....Hey! Du solltest mal langsam eine Datenbank oder ein kleines SQL-Handbuch auf den Wunschzettel setzen. Excel ist -lass dir nichts anderes einreden- ziemlich ZWEI-dimensional ....setzt eine starre Sortierung (oder Umsortierung) voraus.

Wenn es bei dir kein konzeptioneller Fehler ist, der dich zu 5 Sortierspalten zwingt, dann brauchst du die Flexibilität einer Datenbank.
Da kannst du selbst bei den billigsten Varianten mindestens 128 verschiedene sauschnelle Indices auf einer Tabelle haben.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
11.08.2010 um 22:31 Uhr
... und falls sich mittendrin in Deinen 5 Werten auch die eine oder andere Zahl befindet, sei an die Funktion "TEXT()" erinnert - mit der bringst Du die Zahlen dann auch auf eine gleiche Stellenanzahl - etwa:
=B2 & TEXT(E2;"000000,00") & TEXT(F2;"0000") & K2 & L2
bzw wenn auch für eine gleiche Länge der Textinhalte vorgesorgt werden muss, zB
=RECHTS(WIEDERHOLEN(" ";20)&B2;20) & TEXT(E2;"000000,00") & TEXT(F2;"0000") & RECHTS(WIEDERHOLEN(" ";20)&K2;20) & RECHTS(WIEDERHOLEN(" ";20)&L2;20)
wobei hier davon ausgegangen wurde, dass keiner der Textinhalte mehr als 20 Zeichen umfasst (ansonsten eben jeweils beide Werte in der entsprechenden "RECHTS()"-Funktion entsprechend erhöhen) ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
13.08.2010 um 23:32 Uhr
Bitte warten ..
Mitglied: 76109
16.08.2010 um 22:57 Uhr
Hallo zusammen!

2. Versuch

Beim vorherigen Codeschnipsel hatte ich leider einen Denkfehler, obwohl bastla in seinem Kommentar deutlichst auf das Problem beim Stringverknüpfen hingewiesen hat Meine Testdaten waren leider nicht darauf ausgelegt, sodass mir das erst später bewusst wurde Bei weiteren Überlegungen, bin ich dann auf eine noch viel einfachere Lösung gestoßen und hoffe, dass es diesesmal fehlerfrei funktioniert?

Der VBA-Code ist der Versuch Biber's Anregungen in einen automatisierten Vorgang umzusetzen

Die maximale Anzahl der Ebenen ist mir nicht bekannt. Hab nur 6 Ebenen (auf ca 50.000 Zeilen verteilt) getestet.

Vorbereitungen:
Den VB-Editor öffnen Menü>Extras>Makro>Visual Basic Editor
Im Project-Explorer Rechte Maustaste>Einfügen>UserForm eine Leere UserForm erstellen
Im Eigenschaftsfenster UserForm1>(Name) von "UserForm1" nach "FormSort" ändern
Im Project-Explorer FormSort>Rechte Maustaste>Code anzeigen Quelltext UserForm einfügen
Im Project-Explorer Rechte Maustaste>Einfügen>Modul Quelltext Modul einfügen
Anschließend in Menü>Debuggen>Kompilern von VBA-Project] anklicken
Darauf achten, dass in den Codeseiten ganz oben nur einmal "Option Explicit" drinnen steht!

Wenn keine Fehler angezeigt werden, dann VB-Editor wieder schließen. Das Makro kann dann über Excel-Menü>Extras>Makro>Makros>Sortieren gestartet werden, wobei mit dem Auswahlpunkt Optionen eine Tastenkombination angegeben werden kann.

Wegen der Übersichtlichkeit habe ich bewusst auf das auskommentieren verzichtet. Wenn was unklar ist, bitte Fragen!

UserForm(Quelltext in FormSort kopieren):
01.
Option Explicit 
02.
 
03.
Const MaxCellChar = 64 
04.
'Konstante anpassen, wenn Zellen mehr als 64 Zeichen enthalten (32, 64, 128) 
05.
 
06.
Public WithEvents BtnOK As MSForms.CommandButton 
07.
Public WithEvents BtnClear As MSForms.CommandButton 
08.
Public WithEvents BtnCancel As MSForms.CommandButton 
09.
 
10.
Public WithEvents CBoxColumns As MSForms.ComboBox 
11.
Public WithEvents LabelColumns As MSForms.Label 
12.
 
13.
Public WithEvents OptionOrderAZ As MSForms.OptionButton 
14.
Public WithEvents OptionOrderZA As MSForms.OptionButton 
15.
Public WithEvents OptionHeaderOn As MSForms.OptionButton 
16.
Public WithEvents OptionHeaderOff As MSForms.OptionButton 
17.
 
18.
Const adVarChar = 200 
19.
Const adFldIsNullable = 32 
20.
 
21.
Dim FormEvents As New Collection 
22.
 
23.
Sub InitUserForm() 
24.
    Dim Char As String, i As Integer 
25.
         
26.
    If Selection.Count < 2 Then 
27.
        MsgBox "Kein Bereich ausgewählt!", vbExclamation, "Fehler":  Exit Sub 
28.
    End If 
29.
     
30.
    With FormSort 
31.
       .Caption = "Daten sortieren":  .Height = 212:  .Width = 222 
32.
         
33.
        With .Controls 
34.
            .Add "Forms.Frame.1", "FrameColumns" 
35.
            .Add "Forms.Frame.1", "FrameOrder" 
36.
            .Add "Forms.Frame.1", "FrameHeader" 
37.
        End With 
38.
         
39.
        With .Controls("FrameColumns") 
40.
            .Caption = "Spalten auswählen" 
41.
            .TabIndex = 0 
42.
            .Height = 54: .Left = 12: .Top = 12: .Width = 194 
43.
             
44.
             Set FormSort.LabelColumns = .Controls.Add("Forms.Label.1", "LabelColumns") 
45.
             Set FormSort.CBoxColumns = .Controls.Add("Forms.ComboBox.1", "CBoxColumns") 
46.
             Set FormSort.BtnClear = .Controls.Add("Forms.CommandButton.1", "BtnClear") 
47.
        End With 
48.
         
49.
        With .LabelColumns 
50.
            .Height = 16: .Left = 12: .Top = 25: .Width = 168 
51.
            .BackColor = &HFFFFFF 
52.
            .SpecialEffect = fmSpecialEffectSunken 
53.
        End With 
54.
              
55.
        With .CBoxColumns 
56.
            .TabIndex = 0 
57.
            .Height = 15.75: .Left = 12: .Top = 6: .Width = 72 
58.
        End With 
59.
             
60.
        With .BtnClear 
61.
            .Accelerator = "C" 
62.
            .Caption = "Clear" 
63.
            .TabIndex = 1 
64.
            .Height = 18: .Left = 119: .Top = 4: .Width = 60 
65.
        End With 
66.
         
67.
        With .Controls("FrameOrder") 
68.
            .Caption = "Sortieren" 
69.
            .TabIndex = 1 
70.
            .Height = 36: .Left = 12: .Top = 72: .Width = 194 
71.
              
72.
             Set FormSort.OptionOrderAZ = .Controls.Add("Forms.OptionButton.1", "OptionOrderAZ") 
73.
             Set FormSort.OptionOrderZA = .Controls.Add("Forms.OptionButton.1", "OptionOrderZA") 
74.
        End With 
75.
         
76.
        With .OptionOrderAZ 
77.
            .Accelerator = "U" 
78.
            .Caption = "Aufsteigend" 
79.
            .Value = True 
80.
            .TabIndex = 0 
81.
            .Height = 18: .Left = 10: .Top = 6: .Width = 78 
82.
        End With 
83.
         
84.
        With .OptionOrderZA 
85.
            .Accelerator = "B" 
86.
            .Caption = "Absteigend" 
87.
            .TabIndex = 1 
88.
            .Height = 18: .Left = 108: .Top = 6: .Width = 78 
89.
        End With 
90.
         
91.
        With .Controls("FrameHeader") 
92.
            .Caption = "Daten enthalten" 
93.
            .TabIndex = 2 
94.
            .Height = 36: .Left = 12: .Top = 114: .Width = 194 
95.
             
96.
             Set FormSort.OptionHeaderOn = .Controls.Add("Forms.OptionButton.1", "OptionHeaderOn") 
97.
             Set FormSort.OptionHeaderOff = .Controls.Add("Forms.OptionButton.1", "OptionHeaderOff") 
98.
        End With 
99.
              
100.
        With .OptionHeaderOn 
101.
            .Accelerator = "E" 
102.
            .Caption = "eine Überschrift" 
103.
            .TabIndex = 0 
104.
            .Height = 18: .Left = 10: .Top = 6: .Width = 78 
105.
        End With 
106.
         
107.
        With .OptionHeaderOff 
108.
            .Accelerator = "K" 
109.
            .Caption = "keine Überschrift" 
110.
            .Value = True 
111.
            .TabIndex = 1 
112.
            .Height = 18: .Left = 108: .Top = 6: .Width = 78 
113.
        End With 
114.
         
115.
        Set .BtnOK = .Controls.Add("Forms.CommandButton.1", "BtnOK") 
116.
        Set .BtnCancel = .Controls.Add("Forms.CommandButton.1", "BtnCancel") 
117.
         
118.
        With .BtnOK 
119.
            .Accelerator = "O" 
120.
            .Caption = "OK" 
121.
            .TabIndex = 3 
122.
            .Height = 18: .Left = 36: .Top = 162: .Width = 60 
123.
        End With 
124.
         
125.
        With .BtnCancel 
126.
            .Accelerator = "A" 
127.
            .Caption = "Abbrechen" 
128.
            .TabIndex = 4 
129.
            .Height = 18: .Left = 120: .Top = 162: .Width = 60 
130.
        End With 
131.
         
132.
        FormEvents.Add .BtnOK 
133.
        FormEvents.Add .BtnCancel 
134.
        FormEvents.Add .BtnClear 
135.
        FormEvents.Add .CBoxColumns 
136.
    End With 
137.
     
138.
    With CBoxColumns 
139.
        For i = 0 To UBound(Selection.Value, 2) - 1 
140.
             Char = Chr(Asc("@") + Selection.Column + i) 
141.
             
142.
            .AddItem "Spalte " & Char 
143.
            .List(.ListCount - 1, 1) = Char 
144.
        Next 
145.
        
146.
       .ListIndex = 0 
147.
        LabelColumns = " " & .List(0, 1) 
148.
       .SetFocus 
149.
        Show 
150.
    End With 
151.
End Sub 
152.
 
153.
Private Sub CBoxColumns_Change() 
154.
    With CBoxColumns 
155.
        If .ListIndex < 0 Then 
156.
            Exit Sub 
157.
        ElseIf LabelColumns = "" Then 
158.
            LabelColumns = " " & .List(.ListIndex, 1) 
159.
        ElseIf InStr(LabelColumns, .List(.ListIndex, 1)) = 0 Then 
160.
            LabelColumns = LabelColumns & ";" & .List(.ListIndex, 1) 
161.
        End If 
162.
    End With 
163.
End Sub 
164.
 
165.
Private Sub BtnClear_Click() 
166.
    LabelColumns = "" 
167.
End Sub 
168.
 
169.
Private Sub BtnCancel_Click() 
170.
    Unload Me 
171.
End Sub 
172.
 
173.
Private Sub BtnOK_Click() 
174.
    If LabelColumns <> "" Then Call Sortieren 
175.
    Unload Me 
176.
End Sub 
177.
 
178.
Private Sub Sortieren() 
179.
    Dim RS As Object, Cols As Variant, SortText As String, SortOrder As String, i As Long, r As Long 
180.
    Dim ColCount As Long, FirstCol As Long, LastCol As Long, FirstRow As Long, LastRow As Long 
181.
     
182.
    Set RS = CreateObject("ADOR.Recordset") 
183.
 
184.
    With Selection 
185.
        If OptionHeaderOn = True Then FirstRow = .Row + 1 Else FirstRow = .Row 
186.
         
187.
        If UBound(.Value, 1) = Rows.Count Then 
188.
            LastRow = Cells(Rows.Count, CBoxColumns.List(0, 1)).Rows.End(xlUp).Row 
189.
        Else 
190.
            LastRow = .Row + UBound(.Value, 1) - 1 
191.
        End If 
192.
         
193.
        ColCount = UBound(.Value, 2) 
194.
         
195.
        FirstCol = .Column:  LastCol = .Column + ColCount - 1 
196.
    End With 
197.
     
198.
    If OptionOrderAZ = True Then SortOrder = " ASC," Else SortOrder = " DESC," 
199.
             
200.
    Cols = Split(Trim(LabelColumns), ";") 
201.
     
202.
    For i = 0 To UBound(Cols) 
203.
        SortText = SortText & Cols(i) & SortOrder 
204.
    Next 
205.
     
206.
    SortText = Mid(SortText, 1, Len(SortText) - 1) 
207.
     
208.
    With RS 
209.
        For i = 0 To ColCount - 1 
210.
            .Fields.Append CBoxColumns.List(i, 1), adVarChar, MaxCellChar, adFldIsNullable 
211.
        Next 
212.
     
213.
       .Open 
214.
     
215.
        For r = FirstRow To LastRow 
216.
           .AddNew 
217.
            For i = 0 To ColCount - 1 
218.
               .Fields(i) = Cells(r, FirstCol + i) 
219.
            Next 
220.
           .Update 
221.
        Next 
222.
     
223.
       .Sort = SortText:  .Update 
224.
        
225.
        Application.ScreenUpdating = False 
226.
          
227.
        Range(Cells(FirstRow, FirstCol), Cells(LastRow, LastCol)).ClearContents 
228.
         
229.
        For r = FirstRow To LastRow 
230.
            For i = 0 To ColCount - 1 
231.
                Cells(r, FirstCol + i) = .Fields(i) 
232.
            Next 
233.
           .MoveNext 
234.
        Next 
235.
        
236.
       .Close 
237.
         
238.
        Application.ScreenUpdating = True 
239.
    End With 
240.
End Sub
Modul(Quelltext in Modul kopieren):
01.
Option Explicit 
02.
 
03.
Sub Sortieren() 
04.
    FormSort.InitUserForm 
05.
End Sub
Zum Ablauf:
Ist kein Bereich markiert, wird eine entsprechende Meldung ausgegeben und der Vorgang abgebrochen.

Die Steuerelemente der UserForm werden erst zur Laufzeit des Makros erstellt. Die UserForm beinhaltet dann 3 Frames mit Steuerelementen und 2 Buttons:

Frame1 (Spalten auswählen) beinhaltet:
Eine Combobox, in der die einzelnen Spalten der Sortierreihenfolge nach ausgewählt werden können.
Eine Textanzeige, die die ausgewählten Spalten in Form A;B;C;.... anzeigt
Ein Button (Clear), mit dem die Auswahl bei einer Falscheingabe wieder gelöscht werden kann

Frame2 (Sortieren) beinhaltet:
Zwei Option-Buttons mit der Auswahl Aufsteigend/Absteigend

Frame3 (Daten enthalten) beinhaltet:
Zwei Option-Buttons mit der Auswahl Eine/Keine Überschrift

Buttons:
Zwei Command-Buttons OK/Abbrechen

Gruß Dieter
Bitte warten ..
Mitglied: Biber
17.08.2010 um 08:50 Uhr
Moin didi1954,

du ahnst sicherlich, dass ich deine Beiträge in diesem Forum sehr zu schätzen weiss.
Mit dieser Lösung bringst du mich (in meiner Rolle als Moderator) aber in mehrfacher Hinsicht in eine Zwickmühle.

Erstens ist dieser vor 6 Tagen erstellte und seit 5 Tagen mit mehreren unabhängig voneinander funktionierenden Lösungsansätzen beantwortete Beitrag immer noch ohne Antwort.

Und gehört von daher schon seit dem Wochenende eigentlich in einem anderen meiner Lieblingsbereiche.

Kein Feedback, kein Wert für andere Lösungssucher - du kennst da ja meine Haltung.
Wäre aber schade drum nach deiner Musterlösung.

Zweitens... so schön diene Strategie "rein handwerklich" auch ist.... wie ich oben angedeutet habe - ich würde schon gerne noch mal draufschauen, wie und warum es überhaupt soweit kommen konnte (rein fachlich).

Ich ziehe ja gern über die Redmonder her - aber ich würde denen niemals Knauserigkeit oder Inkompetenz unterstellen, weil die in Excel (=bestes M$-Tool wo überhaupt gibt) "nur" eine Sortierung nach drei Spalten erlauben.

Wer seine Exceltapeten nach 5 oder 7 oder 122 Spalten sortieren muss, damit aus Daten Informationen werden, der hat vorher schon irgendwas verratzt. Oder benutzt das falsche Tool/sollte lieber eine Datenbank nehmen. Dazu stehe ich nach wie vor.

Anyway - @MohrSys: Ich bitte mal allerfreundlichst um zeitnahes Feedback, ob denn deine Frage hinreichend beantwortet wurde.

Grüße
Biber
Bitte warten ..
Mitglied: MohrSys
17.08.2010 um 09:15 Uhr
@Biber:

Ich kenne mich zwar recht gut in Excel aus, aber bei Quelltext und VB-Editor muß ich passen.

Ich sortiere weiterhin nur 3 Ebenen und werde mit ggf. ein neueres Office-Paket zulegen
(bei z.B. 2007 sollte ich selbst (und danz einfach) mehrere Ebenen anlegen können).

Vielen Dank aber für eure Bemühungen!

Christian
Bitte warten ..
Mitglied: 76109
17.08.2010 um 09:30 Uhr
Guten Morgen Biber!

Tja, ich habe auch erst überlegt, ob ich den Code reinsetzen soll, da der TO eigentlich gar keine Antwort verdient. Aber dann habe ich mir gedacht, naja, es gibt ja eventuell noch andere, die es interessieren könnte und da ich aus persönlichem Ehrgeiz den Code erstellt habe, wäre es doch schade drum, ihn in den Mülleimer zu werfen Ich zumindest, habe keine Verwendung dafür, aber ich mag eben kleine Herausforderungen

Außerdem kann ich mir vorstellen, das einige Coder die UerForm-Erstellung zur Laufzeit interessieren könnte, sofern sie den Beitrag auch per Google finden.

Ansonsten hast Du natürlich - wie meistens - wieder mal Recht und es lag bestimmt nicht in meiner Absicht, Dir in irgendeiner Weise an die Karre zu fahren und hoffe Du vergibst mir diesesmal auch wieder

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung!

(1)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Microsoft Office
Prüfung von Intervallen und Textausgabe in Excel (2)

Frage von traller zum Thema Microsoft Office ...

Windows Server
gelöst Gruppenrichtlinien-Vorlage Office 2013 auf einem DC 2003 (5)

Frage von bluepython zum Thema Windows Server ...

Windows Netzwerk
Windows Server 2003 SBS Netzwerk durch neuen Server Ersetzen (9)

Frage von MultiStorm zum Thema Windows Netzwerk ...

Microsoft Office
Darstellung einer Produktionsmenge in einer Excel Übersicht! (4)

Frage von Magnus32x1 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (10)

Frage von 1410640014 zum Thema Backup ...