Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sortieren zweier Tabellenblätter mittels Makro

Forumthread: Sortieren zweier Tabellenblätter mittels Makro

Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 17:58:05
Lutz Mergen
Guten Tag,

ich führe 2 Anwesenheitslisten auf getrennten Tabellenblättern in einer Arbeitsmappe für 2 Wochentage, aber für die gleichen Teilnehmer. Diese möchte ich z. B. nach Vornamen oder nach Familienname sortieren, aber immer ausgehend von der ersten der beiden Listen, die zweite Liste sollte automatisch mitsortiert werden. Dazu verwende ich Befehlsschaltflächen (ActivX-Steuerelemente) in der ersten Anwesenheitsliste. Soweit zu den Rahmenbedingungen.

Leider funktioniert das Wechseln der Seiten mittels VBA per Makrorecorder-Aufzeichnung nicht.

Wie kann ich beide Tabellenblätter mit dem "Klick" gleichzeitig so ansprechen, dass sie nach den gleichen Kriterien sortiert sind?

Genereller Ablauf der Makros:
- Tabellenschutz aufheben (ohne Kennwort)
- Bereich markieren
- Sortieren
- Markierung aufheben
- Tabellenschutz aktivieren (ohne Kennwort).
Abschließend soll nur das Tabellenblatt aktiviert sein, das die Befehlsschaltflächen enthält.

Vielen Dank!

Gruß, Lutz
Anzeige

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 18:07:22
Onur
Du sollst nicht dein Makro beschreiben, sondern es POSTEN.
Oder sollen wir dir die Lösung auch nur beschreiben ???
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 18:42:34
Lutz Mergen
Soll ich die Codezeilen hier nur reinkopieren oder gibt es da ein spezielles Verfahren?
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 19:26:01
Piet
Hallo

es geht beides, am besten benutze vitte den Button "Code pre Code" oben rechts.

mfg Piet
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 19:49:27
Lutz Mergen
So, hier der mittels dem Makrorekorder erzeugte Code.

Private Sub CommandButton3_Click()

ActiveSheet.Unprotect
Range("B6:AF40").Select
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").Sort.SortFields.Add2 Key:= _
Range("B6:B40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").Sort.SortFields.Add2 Key:= _
Range("C6:C40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("TN-LIste Donnerstag").Sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B6").Select
Sheets("TN-LIste Sonntag").Select
ActiveSheet.Unprotect
Range("B6:AF40").Select
ActiveWorkbook.Worksheets("TN-LIste Sonntag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("TN-LIste Sonntag").Sort.SortFields.Add2 Key:=Range _
("B6:B40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("TN-LIste Sonntag").Sort.SortFields.Add2 Key:=Range _
("C6:C40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("TN-LIste Sonntag").Sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B6").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False
Sheets("TN-LIste Donnerstag").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False
End Sub
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 19:53:09
Onur
Optimal wäre es, auch die Datei zu haben. Dann könnte man alles auch testen.
Du kannst ja sensible Daten anonymisieren.
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 12:13:45
Lutz Mergen
Ok, hier die "gestrippte Testdatei". Makros nur in in der ersten Tabelle, Schutzfunktionen habe ich aus den Makros rausgenommen.
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 12:15:37
Onur
Du solltest mal die Anweisungen beim Hochladen beachten: "Datei hochladen - Link dazu kopieren - Link im Beitarag einfügen" .
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 12:17:01
Lutz Mergen
Nun ja, sehe jetzt keinen Anhang, obwohl die Datei hochgeladen wurden (mit einer Nummer statt dem Dateinamen).
Werde sie nochmal hochladen und zuvor die Makros entfernen, da die eh gesperrt wurden...
Werde dann die Dateinummer oder einen passenden Link falls möglich hier einstellen.
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 12:21:01
Onur
Ist es denn soooo schwer?? " oder einen passenden Link" ? DER PASSENDE LINK wird nach dem Hochladen dir gegeben, Du musst nur mal die Texte LESEN, statt alles wegzuklicken.
"die Makros entfernen, da die eh gesperrt wurden" ?????
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 12:29:10
Lutz Mergen
Ja, hat ja jetzt geklappt und die Makros wurden als "nicht vertrauenswürdig" eingestuft beim Aufruf der hochgeladenen Tabelle. Daher habe ich sie rausgeschmissen, sind aber identisch mit dem bereits geposteten Code.

Aber jetzt ist sie ja da und Du kannst Dir das ja mal ansehen. Ich hoffe jetzt auf einen guten Rat von Dir, meine Vorarbeit war für mich (als Forumseinsteiger) ja auch nicht ganz ohne.
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 14:14:10
Onur
Wenn heruntergeladene Dateien als "nicht vertrauenswürdig" eingestuft werden, hast du im "Trust-Center" den Ordner, wo deine Downloads landen, noch nicht zu den "vertrauenswürdigen Ordnern" hinzugefügt.
Teste das hier mal:
https://www.herber.de/bbs/user/170624.xlsm
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 19:29:44
Onur
Einfach den ganzen Code aus dem VBA-Editor kopieren, hier als Nachricht einfügen, den Code komplett markieren und auf "Code" (zw. "Formel" und "Liste") klicken und posten.
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 18:21:39
daniel
Hi

schreibe erstmal das Sortieren als eigenes Makro.

achte darauf, dass du jede Tabellenblattangabe (Sheets(...), ActiveSheet) durch eine Variable (z.B. TB) ersetzt und ergänze diese Variable auch vor jedem Range oder Cells im Code (JEDEM!)

definiere dann diese Variable als Übergabeparameter in der Kopfzeile, eine Dimensionierung ist dann nicht mehr erforderlich
Sub SortierenX(TB as Worksheet)



im Hauptmakro rufst du dann dieses Untermakro auf und verwendest dabei das zu sortierende Tabellenblatt als übergabeparameter:
...

Call SortierenX(Sheets("ABC"))
Call SortierenX(Sheets("DEF"))
...

so stellst du sicher, dass beide Blätter mit den selben Einstellungen sortiert werden.

Gruß Daniel
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 15:15:19
Piet
Hallo

was hat ein Test mit meinem Programm denn ergeben?? Das konnte ich nicht herauslesen.
Bei meiner Variante, die der von Daniel ähnlich ist, kannst du jeden beliebigen Tag neu einfügen.
Du musst nur den Tag als "ShtName" angeben, mit dem Befehl GoSub dahinter. Das ist alles!
Die Sortierfunktion vom Bereich her ist ja bei allen Tagen gleich. Nur der Sheetname ändert sich.

mfg Piet
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
03.07.2024 10:39:11
Lutz Mergen
Hallo Piet,

ich habe Deinen Code überbnommen, bekomme aber eine Fehlermeldung an folgender Stelle:

 LDo .sort.SortFields.Clear


Deaktiviere ich diese Codezeile (mit ' oder "rem") wird die Codezeile darüber als fehlerhaft markiert.

Private Sub CommandButton1_Click()


'*** Sortieren nach Vorname ***

Dim LDo As Worksheet, LSo As Worksheet
Set LDo = Worksheets("TN-LIste Donnerstag")
Set LSo = Worksheets("TN-LIste Sonntag")

LDo.Unprotect
LDo Range("B6:AF40").Select
LDo .sort.SortFields.Clear
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort.SortFields.Add2 Key:= _
Range("B6:B40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort.SortFields.Add2 Key:= _
Range("C6:C40"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("AI1").Select
ActiveCell.FormulaR1C1 = "1"
Range("B5").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False
End Sub
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
03.07.2024 10:52:05
Lutz Mergen
Hallo Piet,

da ist bei mir gerade etwas schief gelaufen. Habe wohl irgendeinen früheren Code getestet und gepostet.

Dein Code funktioniert! Zumindest in der Einfachversion (bezogen auf ein Tabellenblatt). Ich werde jetzt mal noch versuchen, Deine Info für mehrere Tabellenblätter umzusetzen.
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
03.07.2024 11:30:50
Lutz Mergen
Hi Piet,

komme mit Deiner letzten Info nicht klar.

"Du musst nur den Tag als "ShtName" angeben, mit dem Befehl GoSub dahinter. Das ist alles! "

Habe jetzt viel rumprobiert, da irgendwo eine Anweisung in unterschiedlichen Kombinationen, Schreibweisen und an unterschieldlichen Stellen einzusetzen, immer mit Fehlermeldung.

Welchen Tag meinst Du denn und wo soll die "ShtName"-Angabe denn hin? Gibt es irgendwo eine Anleitung dazu? Auch die Syntax ist mir nicht klar: Irgendwo "GoSub" hinter eine "ShtName"-Angabe zu setzen, führt generell zu Fehlermeldungen.
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
03.07.2024 16:25:50
Piet
Hallo Lutz

bitte entschuldige, ganz schusseliger Flüchtigkeitsfehler!! Wenn man zu schnell arbeitet!!
Überall wo noch - ActiveWorkbook.Worksheets("TN-LIste Donnerstag") steht - musst du als Tabelle ShtName angeben!
Wir können den Code aber durch eine doppelte With Klammer elegant verkürzen. Ob du Protect brauchst musst du entscheiden!

mfg Piet



With ActiveWorkbook.Worksheets(ShtName)
.Unprotect 'benötigt??
.sort.SortFields.Clear
.sort.SortFields.Add2 Key:=Range("B6:B40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.sort.SortFields.Add2 Key:=Range("C6:C40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With .sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
End With

Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
04.07.2024 15:38:49
Lutz Mergen
Hallo Piet,

funktioniert Alles!!! Top Beratung, herzlichen Dank!

- das "unprotect" ist zumindest bei der Makrorecorder-Aufnahme notwendig, weil bei geschütztem Tabellenblatt der Sortierbutton gesperrt ist. Habs mit Makro jetzt nicht probiert.

- habe den Code noch insoweit angepasst, als dass ich unterhalb der Platzhalterdefinitionen (heißt das so?) noch Routinen eingefügt habe, die nur für das Tabellenblatt mit den zugehörigen Makros gelten.

Der Vollständigkeit halber hier nochmal der vollständige VBA-Code für einen der beide Sortiermakros:

Private Sub CommandButton1_Click()


'*** Sortieren nach Vorname ***

Dim ShtName As String, Bereich As String
ShtName = "TN-LIste Donnerstag": GoSub sort
ShtName = "TN-LIste Sonntag": GoSub sort
'** dieser Code kann beliebig erweitert werden!

ActiveSheet.Unprotect
Range("AI2").Select
ActiveCell.FormulaR1C1 = "1"
Range("B6").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False

Exit Sub

sort: 'Gosub Unterproramm mit Return
With ActiveWorkbook.Worksheets(ShtName)
.Unprotect 'benötigt??
.sort.SortFields.Clear
.sort.SortFields.Add2 Key:=Range("B6:B40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.sort.SortFields.Add2 Key:=Range("C6:C40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With .sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
End With
Return
End Sub
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
04.07.2024 15:55:07
daniel
Hi

besser als Gosub fände ich hier eine Schleife über die beiden Tabellenblätter, in welcher du sortierst.

also im prinzip so:

dim ShtName 

for each ShtName in Array("TN-LIste Donnerstag", "TN-LIste Sonntag")
With ActiveWorkbook.Worksheets(ShtName)
.Unprotect 'benötigt??
.sort.SortFields.Clear
.sort.SortFields.Add2 Key:=Range("B6:B40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.sort.SortFields.Add2 Key:=.Range("C6:C40"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With .sort
.SetRange .Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
End With
Next


beachte, dass du bei mehreren Tabellenblättern die Tabellenblattreferenz vor jedem Range oder Cells mit angeben musst, sonst referenzieren diese immer auf das gerade aktive Blatt.
gerade beim Sortieren übersieht man gerne die beiden Ranges.
Die Recorderaufzeichnung ist hier auch nicht optimal.

beim sortieren bevorzuge ich auch die alte Codierung aus den Zeiten bis Excel 2003, die kommt nämlich mit einer Zeile aus und ist daher viel übersichtlicher, wenn man nicht mehr als drei Sortierkriterien hat:
hier also das Sortieren für 2 Tabellenblätter mit gleichem Aufbau
for each ShtName in Array("TN-LIste Donnerstag", "TN-LIste Sonntag")

With ActiveWorkbook.Worksheets(ShtName)
.unprotect
.Range("B6:AF40").Sort Key1:=.Range("B6"), Order1:=xlascending, Key2:=.Range("C6"), order2:=xlascending, header:=xlguess
.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
end with
next

Gruß Daniel

Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
05.07.2024 12:28:00
Lutz Mergen
Hallo Daniel,

der VBA-Code von Dir funktioniert leider so nicht. Ich habe ihn 1:1 in mein VBA reinkopiert. Die Version 1 steigt an folgender Stelle aus:

    With .sort

.SetRange .Range("B6:AF40")


Die Version 2 sortiert gelegentlich de 2. Tabelle nicht, wobei die Ursache hierfür nicht erkennbar ist.
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
01.07.2024 23:00:58
Piet
Hallo

im Prinzip hat Daniel dir schon den Weg zu einer richtigen Lösung gezeigt. Durch Mehrfach Aufruf.
Ich nehme aber an, das du noch nicht fit genug in VBA bist. um die Idee von Daniel umzusetzen.
Ich benutze dafür lieber den Gosub Befehl. (Der übrigens nur von mir verwendet wird.)

mfg Piet

Private Sub CommandButton3_Click()

Dim ShtName As String, Bereich As String
ShtName = "TN-LIste Donnerstag": GoSub sort
ShtName = "TN-LIste Sonntag": GoSub sort
'** dieser Code kann beliebig erweitert werden!
Exit Sub

sort: 'Gosub Unterproramm mit Return
ActiveWorkbook.Worksheets(ShtName).Unprotect
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort.SortFields.Clear
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort.SortFields.Add2 _
Key:=Range("B6:B40"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort.SortFields.Add2 _
Key:=Range("C6:C40"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("TN-LIste Donnerstag").sort
.SetRange Range("B6:AF40")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

ActiveWorkbook.Worksheets(ShtName).Protect _
DrawingObjects:=False, Contents:=True, Scenarios:=False
Return
End Sub
Anzeige
AW: Sortieren zweier Tabellenblätter mittels Makro
02.07.2024 11:24:06
Lutz Mergen
Hallo Piet,

erst mal danke für die fast mundgerechte Lösung. Wird auch in Kürze getestet! Und mit Deiner Einschätzung meiner VBA-Kenntnisse hast Du absolut recht.

Daher noch eine Frage an dieser Stelle:

in Deinem Code ist beim eigentlichen Sortiervorgang nur die "TN-Liste Donnerstag" aufgeführt. Kann ich jetzt den entsprechenden Code für die "TN-Liste Sonntag" einfach darunter setzen oder brauchts da noch so etwas wie eine Schleife ("While..." etc.)?

Hast Du vielleicht noch einen Tip bzw. Link für ein "VBA-Programmierlexikon". Ich denke da an so etwas ähnliches wie die Microsoft-Onlinehilfe für Formeln. Beschreibung und zwei drei Beispiele für das bessere Verständnis der Semantik.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige