Makro-Start

Hallo Makro-Experten!

Ich habe folgendes Makro aufgezeichnet, das mir eine Fußballtabelle sortiert:

Sub Sortierung()
'
' Sortierung Makro
' Makro am 10.04.2006 von Alexander Maximilian Winter aufgezeichnet
'
' Tastenkombination: Strg+Umschalt+S
'
 Range("B4:I7").Select
 Selection.Sort Key1:=Range("C4"), Order1:=xlDescending, Key2:=Range("I4") \_
 , Order2:=xlDescending, Key3:=Range("E4"), Order3:=xlAscending, Header \_
 :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom \_
 , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= \_
 xlSortNormal
End Sub

Es funktioniert auch problemlos, allerdings wäre es für den Benutzer feiner, wenn er es nicht mühsam über eine Tastenkombination oder einen Button starten müsste. Ist es möglich, dieses Makro dann auszuführen, wenn in der Zelle Q10 ein Wert größer 0 drinsteht??
Die zweite Frage: Ich habe diese Tabelle vier Mal auf dem selben Blatt. Muss ich das Makro jedes Mal neu in eine Private Sub-Klammer stellen oder reicht es einmal? (Das Makro sortiert vier verschiedene Tabellen).

Vielen Dank für die (hoffentlich zahlreichen) Tips!

Gruß Alex

Es funktioniert auch problemlos, allerdings wäre es für den
Benutzer feiner, wenn er es nicht mühsam über eine
Tastenkombination oder einen Button starten müsste. Ist es
möglich, dieses Makro dann auszuführen, wenn in der Zelle Q10
ein Wert größer 0 drinsteht??
Die zweite Frage: Ich habe diese Tabelle vier Mal auf dem
selben Blatt. Muss ich das Makro jedes Mal neu in eine Private
Sub-Klammer stellen oder reicht es einmal? (Das Makro sortiert
vier verschiedene Tabellen).

Hi Alex,
ich habs jetzt mal ungetestet für 2 Tabellen auf eineem Blatt entwickelt. Code gehört in das klassenmodul des Tabellenblattes.

Option Explicit
Option Base 1
Private Sub Worksheet\_Change(ByVal Target As Range)
If Target.Address(0, 0) "Q10" Then Exit Sub
If Target.Value = 0 Then Exit Sub
Dim Sortier, n As Byte
Sortier = Array("B4:I7", "C4", "I4", "E4", "M4:X7", "N4", "O4", "P4")
For n = 1 To UBound(Sortier) Step 4
 Range(Sortier(n)).Sort Key1:=Range(Sortier(n + 1)), Order1:=xlDescending, Key2:=Range(Sortier(n + 2)) \_
 , Order2:=xlDescending, Key3:=Range(Sortier(n + 3)), Order3:=xlAscending, Header \_
 :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom \_
 , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= \_
 xlSortNormal
Next n
End Sub

Gruß
Reinhard

Hallo Alex,

das Makro könnte man so umstrukturieren, dass das eigentliche Sortieren in einer separaten Routine ausgeführt wird.

Sub sortierung()
 With ThisWorkbook.Sheets("Tabelle1")
 'Tabelle 1
 Call Sortieren(.Range("B4:I7"), .Range("C4"), .Range("I4"), .Range("E4"))
 'Tabelle 2
 Call Sortieren(.Range("B17:I20"), .Range("C17"), .Range("I17"), .Range("E17"))
 'Tabelle 3
 Call Sortieren(.Range("B30:I33"), .Range("C30"), .Range("I30"), .Range("E30"))
 'Tabelle 4
 Call Sortieren(.Range("B43:I46"), .Range("C43"), .Range("I43"), .Range("E43"))
 End With
End Sub


Private Sub Sortieren(Bereich As Range, Sort1 As Range, Sort2 As Range, Sort3 As Range)
'
'
 Bereich.Sort Key1:=Sort1, Order1:=xlDescending, Key2:=Sort2 \_
 , Order2:=xlDescending, Key3:=Sort3, Order3:=xlAscending, Header \_
 :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom \_
 , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= \_
 xlSortNormal
End Sub

Das automatische Starten des Makros wenn Wert in Q10>0 geht, wenn der Wert in Q10 manuell geändert wird oder wenn man Wertänderungen in den Zellen überwacht, die in der Formel von Q10 stehen.
Die folgende Routine, die im VBA -Editor unter der Tabelle eingefügt werden muß, startet automatisch die Sortierung.

 0 Then
 Call sortierung
 End If

 'Variante bei Änderung von Zellen, die in Formel von Q10 stehen
 'In diesem Beispiel die Spalten M(13) und N(14)
 If Target.Column = 13 Or Target.Column = 14 And Range("Q10") \> 0 Then
 Call sortierung
 End If

End Sub

Gruß
Franz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex
In „Tabelle/Code anzeigen“ (also nicht in ein Modul) fügst du das Makro ein:

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
If Not Range("G10").Value = 0 Then
 Range("B4:I7").Sort Key1:=Range("C4"), Order1:=xlDescending, Key2:=Range("I4") \_
 , Order2:=xlDescending, Key3:=Range("E4"), Order3:=xlAscending, Header \_
 :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom \_
 , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= \_
 xlSortNormal
End If
End Sub

Es ist auch immer besser, nicht mit SELECT zu arbeiten, da sonst immer der Cursor verschoben wird. Dieses Makro macht die Sortierung und lässt den Cursor stehen, wo er ist.
Viel Erfolg
Erich