Brauche einen Makro

Hallo,

ich habe eine Datei A (Hauptdatei), in der die Datensätze aufgenommen werden.
Die zweite Datei B zieht sich aus der ersten Datei A nur ganz bestimmte Datensätze raus, die dann beim Öffnen der einzelnen Blätter automatisch nach Name sortiert werden.
Makro hierfür: Blattschutz aufheben, Sortieren, Blattschutz aktivieren.

Nun möchte ich aber es so einrichten, dass beim Öffnen der Datei B die einzelnen Blätter der Reihe nach selbständig geöffnet werden (wegen Sortierung) und anschließend zum ersten Blatt wieder zurückkehren.

Habe es mit Makro in Makro aufzeichnen probiert, funktioniert leider nicht.
Unter anderem habe ich folgende – nicht funktionierende - Makroaufzeichnung probiert:

auf Blatt 1 geklickt, Makro „Sortieren“ ausgeführt,
auf Blatt 2 geklickt, Makro „Sortieren“ ausgeführt, usw.,
anschließend wieder auf Blatt 1 geklickt.
Das Ergebnis war: Es wurde lediglich „Gehe zu Blatt 1“ aufgezeichnet.

Bin für jeden Tipp dankbar

Gruß Lena

Makro hierfür: Blattschutz aufheben, Sortieren, Blattschutz aktivieren.

Hallo Lena,

ich hoffe Dir ist mit diesem Makro gedient

Private Sub Workbook\_Open()
 Call SortDataInWorkbook
End Sub

Für Tabellen mit Spaltenbeschriftung

Private Sub SortDataInWorkbook()
 For Each objSheet In Worksheets
 With objSheet
 .Activate
 .Protect Contents:=False
 Range(Cells(1, 1), \_
 Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Sort \_
 Key1:=.Columns(1), \_
 Header:=xlGuess
 Range("A1").Select
 .Protect Contents:=True
 End With
 Next
 Worksheets(1).Activate
End Sub

Für Tabellen ohne Spaltenbeschriftung

Private Sub SortDataInWorkbook()
 For Each objSheet In Worksheets
 With objSheet
 .Activate
 .Protect Contents:=False
 Range(Cells(1, 1), \_
 Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Sort \_
 Key1:=.Columns(1)
 Range("A1").Select
 .Protect Contents:=True
 End With
 Next
 Worksheets(1).Activate
End Sub

Der Wert Key1:=.Columns(1) gibt die zu sortierende Spalte an (Du kannst auch Key1:=.Columns(„A“) nehmen), wenn Du weitere Sortierungen benötigst, dann gibt es noch Key2: und Key3:, weitere Informationen siehe Excel VB-Script Hilfe.

Gruß
Christian

Hallo Christian,

danke für deine Makros.
Nur bin ich leider ziemlich unbedarft, was die Materie angeht. Habe die Variante mit Spaltenüberschriften zuerst in mein bestehendes Makros und dann in ein neues Makro reinkopiert: Fast alle Zeilen (im Code) sind dann rot oder es kommt irgend eine Meldung.

Ich habe hier meinen Makro reinkopiert, der beim Öffnen eines Tabellenblattes ausgeführt wird. (Es sind im übrigen insgesamt 20 Blätter; Excel 2000)

Darf ich dich bitten, deinen Makro-Vorschlag in meinen bestehenden einzubinden?

Vielen Dank im voraus.

Gruß Lena

Public Sub Sort2()
ActiveSheet.Unprotect
ActiveWindow.ScrollRow = 187
Range(„B12:G230“).Select
Range(„G230“).Activate
Selection.Sort Key1:=Range(„G12“), Order1:=xlAscending, Key2:=Range(„B12“) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
ActiveWindow.ScrollRow = 8
Range(„A1:F1“).Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Zur Info:
Der zu Sortierende Bereich ist von B12 bis G230, wobei B12 bis G12 Überschriften enthält, und Sortierung zuerst nach Spalte G und dann nach Spalte B (beides aufsteigend) ausgeführt wird.
Aber für einen Makro-Experten ist das alles bestimmt aus dem Makro selbst zu erlesen.)

Und muss ich dann auch bei Excel-Objekten, sprich in das Code der einzelnen Tabellenblätter, etwas reinschreiben?

Für Tabellen mit

Spaltenbeschriftung

Private Sub
SortDataInWorkbook()
For Each objSheet In Worksheets
With objSheet
.Activate
.Protect Contents:=False
Range(Cells(1, 1), _
Cells(.UsedRange.Rows.Count,
.UsedRange.Columns.Count)).Sort _
Key1:=.Columns(1), _
Header:=xlGuess
Range(„A1“).Select
.Protect Contents:=True
End With
Next
Worksheets(1).Activate
End Sub

Hallo Lena,

dann probiere den mal (unten ist er nochmals unformartiert aber kopierbar :wink:)

Private Sub Sort2()
 For Each objSheet In Worksheets

 With objSheet
 .Activate
 .Unprotect

 Range("B12:G230").Sort \_
 Key1:=.Columns("G"), Order1:=xlAscending, \_
 Key2:=.Columns("B"), Order2:=xlAscending, \_
 Header:=xlGuess, \_
 OrderCustom:=1, \_
 MatchCase:=False, \_
 Orientation:=xlTopToBottom

 Range("A1:F1").Select

 .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
 End With

 Next

 Worksheets(1).Activate
End Sub

**Private Sub Sort2()
For Each objSheet In Worksheets

With objSheet
.Activate
.Unprotect

Range(„B12:G230“).Sort _
Key1:=.Columns(„G“), Order1:=xlAscending, _
Key2:=.Columns(„B“), Order2:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom

Range(„A1:F1“).Select

.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With

Next

Worksheets(1).Activate
End Sub**

Gruß
Christian

Und muss ich dann auch bei Excel-Objekten, sprich in das Code
der einzelnen Tabellenblätter, etwas reinschreiben?

Was willste denn noch reinschreiben :wink: - in der Originalversion startet der Makro automatisch nach dem Öffnen der Tabelle und läuft alle enthaltenen Arbeitsblätter durch (For Each objSheet In Worksheets … Next), so war doch Deine Bedingung.

Wenn es nicht funktioniert, bimmel nochmal per E-Mail oder hier an.

Gruß
Christian

Hallo Christian,

ich hab´s geschafft! Habe ein Makro aufgezeichnet, welches alle Blätter nacheinander öffnet und wieder beim ersten landet!

Der Trick beim Aufzeichnen des Makros war, zwischen dem Nacheinander-Öffnen der einzelnen Blätter irgendwo im Blatt auf eine leere Zelle zu klicken. Also, Blatt 1 öffnen (Makro Sortieren wird ausgeführt) => klick in eine leere Zelle => Blatt 2 öffnen => klick in eine leere Zelle, usw.

Dieses Makro (den Namen) habe ich dann im Code bei „DieseArbeitsmappe“ reinkopiert, und nun führt Excel dieses Makro bereits beim Öffnen der Datei durch.
Juhui…
Ein unbeschreibliches Glücksgefühl, für mich als Neuling in der Makromaterie. :smile:)))

Ich danke dir trotzdem für deine Mühe.

Gruß Lena