Excel Vba sortieren

Hallo experten,
ich habe eine Exceltabelle in der ich mehrere Bereiche automatisch (per Makro) fülle.
Spalten A und B dann
L1…AA25
Dann L30…R53
klappt alles wunderbar. (teilweise mit eurer Hilfe-Danke)

Jetzt will ich die verschieden Bereiche auch sortieren klappt händisch. Aber als fauler mensch will ich das Excel das tut.

wksAktuell.Columns("A:B").Sort \_
Key1:=wksAktuell.Range("B1"), \_
Order1:=xlDescending, Header:=xlYes, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal

das klappt auch, aber wenn ich nur einen Bereich sortieren möchte kommt eine Fehlermeldung:
Die Methode Range ist für das Worksheet fehlgeschlagen.
Dabei habe ich doch nichts anderes gemacht als beim anderen sortieren:

wksAktuell.Range(Cells(ersteZeile, constName), \_
Cells(letzteZeile, constName + 7)).Sort \_
Key1:=wksAktuell.Range(Cells(ersteZeile, constName + 7)), \_
Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, \_
MatchCase:=False, Orientation:=xlTopToBottom, \_
DataOption1:=xlSortNormal

Der Bereich stimmt!Habe ich getestet mit:

wksAktuell.Range(Cells(ersteZeile, constName), \_ 
Cells(letzteZeile, constName + 7)).Select

Da ist genau der Bereich sortiert der Sortiert werden soll.

Könnt ihr mir bitte helfen ich sehe da keinen Unterschied, oder kann man per makro nur Spalten sortieren. (Aber das kann ich mir nicht vorstellen

Liebe Grüße Winter
P.S.
mein erster versuch war das gesamte in einer With -schleife zu machen um mir die wksaktuell zu sparen (Danke für den Tipp)

 With wksAktuell
 ersteZeile = .Cells(letzteZeile, constName).End(xlDown).Row
 letzteZeile = .Cells(65536, constName).End(xlUp).Row


 For i = ersteZeile To letzteZeile
 For j = 1 To UBound(arMitaTab)

 If arMitaTab(j, 0) = .Cells(i, constName) Then

 .Cells(i, constName + 1).Value = \_
CInt(.Cells(i, constName + 1).Value) + 1
 .Cells(i, constName + 2).Value = \_
CInt(.Cells(i, constName + 2).Value) + arMitaTab(j, 1) 
 ...
End With

Danke Winter

Hallo Winter,

Dabei habe ich doch nichts anderes gemacht als beim anderen
sortieren:

Excel versteht das nicht:
Key1:=wksAktuell.Range(Cells(ersteZeile, constName + 7)),
ändere es in
Key1:=wksAktuell.Cells(ersteZeile, constName + 7),

Den Code im PS verstehe ich nicht und auch nicht den Zusammenhang mit Sort.

Und bei
ersteZeile = .Cells(letzteZeile, constName).End(xlDown).Row

ist mir so manches unklar, „letzteZeile“ klingt irgendwie nach unterster belegter Zeile, von da aus gehts du nach unten, welche Zeile außer 65536 erwartest du anzutreffen, und die nennst du dann erstezeile?
Interessant ist auch daß du „letzteZeile“ erst eine Codezeile nachdem du sie schon benutzt hast ermittelst.

Gruß
Reinhard

Servus,
danke für Deine FIXE antwort

Excel versteht das nicht:
Key1:=wksAktuell.Range(Cells(ersteZeile, constName + 7)),
ändere es in
Key1:=wksAktuell.Cells(ersteZeile, constName + 7),

geändert und immer noch die selbe Fehler Meldung ;-(

Den Code im PS verstehe ich nicht und auch nicht den
Zusammenhang mit Sort.
Interessant ist auch daß du „letzteZeile“ erst eine Codezeile
nachdem du sie schon benutzt hast ermittelst.

Der Code im PS ist nicht wichtig. habe ihn nur angefügt um zu zeigen, dass ich das With verwendet habem wie von EUch hier gezeigt.
Danke
Ich habe die LetzteZeile schon definiert und ändere sie dann, wenn es Dich interessiert sende ich dir mal den gesamte Code, aber wie gesagt ist nicht so wichtig.
Grüße Winter

Excel versteht das nicht:
Key1:=wksAktuell.Range(Cells(ersteZeile, constName + 7)),
ändere es in
Key1:=wksAktuell.Cells(ersteZeile, constName + 7),

geändert und immer noch die selbe Fehler Meldung ;-(

Hallo Winter,

möglicherweise bist du im falschen Blatt wenn du das Makro startest.
Oder deine Variablen haben falsche Werte.
Dieser Code läuft:

Sub tt()
Dim wksAktuell
Set wksAktuell = ActiveSheet
wksAktuell.Range(Cells(3, 4), \_
Cells(10, 4 + 7)).Sort \_
Key1:=wksAktuell.Cells(3, 4), \_
Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, \_
MatchCase:=False, Orientation:=xlTopToBottom ', \_ DataOption1:=xlSortNormal
wksAktuell.Range(Cells(3, 4), Cells(10, 4 + 7)).Select
End Sub

Setz bei dir einen Haltepunkt auf die Sortzeile und schau dir deine Variablen an in dem du mit der Maus drüberfährst oder mittels Debug.print oder Msgbox oder…

Gruß
Reinhard

Servus

Hallo Winter,

möglicherweise bist du im falschen Blatt wenn du das Makro
startest.
Oder deine Variablen haben falsche Werte.
Dieser Code läuft:

 wksAktuell.Activate

 wksAktuell.Range(Cells(ersteZeile, constName), Cells(letzteZeile, constName + 7)).Sort Key1:=wksAktuell.Cells(ersteZeile, constName + 7), \_
 Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal

Dieser COde auch.
DANKE!

Scheint so, als müsste ich das Sheet activieren?
Aber warum? Deswegen setzte ich doch das wksaktuell davor. Damit Excel weiß, dass ich im Aktuell bin.
Folgender COde funkt nicht

 wksAktuell.Activate
 wksAuswertung.Activate
 With wksAktuell
 .Range(Cells(ersteZeile, constName), Cells(letzteZeile, constName + 7)).Sort \_
 Key1:=.Cells(ersteZeile, constName + 7), \_
 Order1:=xlAscending, Header:=xlGuess, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal
 End With

Es liegt an dem Acticate.
Aber zur H****e warum?

Danke aber für Deine Hilfe und deine SUPER SCHNELLE Hilfe.
Grüße
Winter

möglicherweise bist du im falschen Blatt wenn du das Makro
startest.
Oder deine Variablen haben falsche Werte.

Scheint so, als müsste ich das Sheet activieren?
Aber warum? Deswegen setzte ich doch das wksaktuell davor.
Damit Excel weiß, dass ich im Aktuell bin.

Folgender COde funkt nicht

wksAktuell.Activate
wksAuswertung.Activate
With wksAktuell

Nein, du bist beim Sortaufruf im Blatt wksAuswertung

Schwierig mit Codeschnipseln und unbekannten varianlen, bau lieber kleine komplette Prozeduren wo klar definiert ist was was ist und als Wert hat und die (bis auf den jeweiligen Fehler) eigenständig lauffähig wären.
Ist viel einfacher für Andere das laufen zu lassen und man redet vom Gleichen!

Sub Test()
Dim a,b,c, wks1, wks1
a=5
b=„huhu“
c=8
set wks1=worksheets(1)
set wks2=worksheets(2)


End Sub

Gruß
Reinhard

Grüezi Winter

Scheint so, als müsste ich das Sheet activieren?
Aber warum? Deswegen setzte ich doch das wksaktuell davor.
Damit Excel weiß, dass ich im Aktuell bin.

Folgender COde funkt nicht

wksAktuell.Activate
wksAuswertung.Activate
With wksAktuell
.Range(Cells(ersteZeile, constName), Cells(letzteZeile,
constName + 7)).Sort _
Key1:=.Cells(ersteZeile, constName + 7), _
Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With

Es liegt an dem Acticate.
Aber zur H****e warum?

Setzte allen Cells()-Anweisungen einen Punkt, auch vor denen, die in der Range()-Anweisung stehen.

…denn ohne den Punkt beziehen sich die Cells() wieder auf das aktive Tabellenblatt…

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]
1 „Gefällt mir“

Grüezi Winter

Es liegt an dem Acticate.
Aber zur H****e warum?

Setzte allen Cells()-Anweisungen einen
Punkt, auch vor denen, die in der Range()-Anweisung stehen.

…denn ohne den Punkt beziehen sich die Cells() wieder auf
das aktive Tabellenblatt…

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Servus Thomas,
danke das macht Sinn. Ist mir zwar nicht einleuchtend, aber man kann sich der Logic nicht entziehen.
Danke jetzt funktioniert es auch ohne activate.
Grüße Winter

(und auch Danke, dass Du mir nicht erklärt hast, dass es mit einer Pivot-tabelle VIEL einfacher wäre :wink: )

danke das macht Sinn. Ist mir zwar nicht einleuchtend, aber
man kann sich der Logic nicht entziehen.

Jepp, Hallo Winter,

Sub test()
Dim s As Range
Worksheets( **2** ).Activate
With Worksheets(1)
 Set s = Range("A1")
 MsgBox s.Parent.Name ' Okay
 Set s = .Range("A1")
 MsgBox s.Parent.Name ' Okay
 Set s = .Range(.Cells(1, 1), .Cells(2, 2))
 MsgBox s.Parent.Name ' Okay
 Set s = Range(.Cells(1, 1), .Cells(2, 2))
 MsgBox s.Parent.Name ' Okay
 Set s = .Range(Cells(1, 1), Cells(2, 2))
 MsgBox s.Parent.Name ' **Fehler**
End With
End Sub
'
Sub test2()
Dim s As Range
Worksheets( **1** ).Activate
With Worksheets(1)
 Set s = Range("A1")
 MsgBox s.Parent.Name ' Okay
 Set s = .Range("A1")
 MsgBox s.Parent.Name ' Okay
 Set s = .Range(.Cells(1, 1), .Cells(2, 2))
 MsgBox s.Parent.Name ' Okay
 Set s = Range(.Cells(1, 1), .Cells(2, 2))
 MsgBox s.Parent.Name ' Okay
 Set s = .Range(Cells(1, 1), Cells(2, 2))
 MsgBox s.Parent.Name ' **Kein Fehler**
End With
End Sub

(und auch Danke, dass Du mir nicht erklärt hast, dass es mit
einer Pivot-tabelle VIEL einfacher wäre :wink: )

*grien* :smile: Sehe ich genauso, garantiert sehr sicher, Thomas und Marion haben sicher Recht daß Pivots Klasse sind , das sagt mir mein Kopf, mein Bauch sagt mir wenn hier eine Pivotanfrage kommt, sofort den Beitrag wieder zuzumachen :smile:

Genau wie mit Diagrammanfragen wie jetzt diese Average-Chart-Anfrage, aber da gehts noch. Da habe ich auch keine Ahnung aber kämpfe mich durch, sobald ich rausfinde was der Anfrager da eigentlich will *gg*, bei Pivots beginne ich den Kampf erst gar nicht.

Gruß
Reinhard

Grüezi Winter

Es liegt an dem Acticate.
Aber zur H****e warum?

Setzte allen Cells()-Anweisungen einen
Punkt, auch vor denen, die in der Range()-Anweisung stehen.

…denn ohne den Punkt beziehen sich die Cells() wieder auf
das aktive Tabellenblatt…

danke das macht Sinn. Ist mir zwar nicht einleuchtend, aber
man kann sich der Logic nicht entziehen.

Doch, das macht durchaus Sinn.
Jede Anweisung bezieht sich prinzipiell auf das aktive Tabellenblatt - worauf denn auch sonst :wink:

Sobald Du extern referenzieren willst musst Du dies konsequent tun.
Normalerweise reicht das beim .Range(), da Du aber darin mit .Cells() eine Start- und eine End-Zelle angeibst musst Du diese ebenfalls sauber referenzieren.

Aber tröste dich, diese beiden Punkte werden von vielen vergessen…

Danke jetzt funktioniert es auch ohne activate.

Na, das will ich doch schwer hoffen :smile:

(und auch Danke, dass Du mir nicht erklärt hast, dass es mit
einer Pivot-tabelle VIEL einfacher wäre :wink: )

Naja, das wären ja Eulen nach Athen getragen - deine Worte zeigen, dass Du es bereits weisst… :wink:

…und vielleicht kriegen wir ja auch den Reinhard noch dahin… :wink:

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Grüezi Thomas,

danke das macht Sinn. Ist mir zwar nicht einleuchtend, aber
man kann sich der Logic nicht entziehen.

Doch, das macht durchaus Sinn.
Jede Anweisung bezieht sich prinzipiell auf das aktive
Tabellenblatt - worauf denn auch sonst :wink:

prinzipiell ist richtig, Range(„A1“).select klappt ja auch, normalerweise, aber aufgrund einer Anfrage hier mit ausgeblendeden Zeilen weiß ich grad nicht was geschieht wenn ich Range(„A1“).select anweise, aber Zeile 1 ist ausgeblendet.

In der Anzeige ist danach keine Zelle markiert, wie auch. Nur, was ich nicht weiß und es mir auch zu mühsam ist da alle Möglichkeiten durchzutesten, weißt du genau, daß sich alle Prozeduren die sich auf ActiveCell beziehen auch korrekt funktionieren?

Aber tröste dich, diese beiden Punkte werden von vielen
vergessen…

Jepp, bin da Champion :smile:

…und vielleicht kriegen wir ja auch den Reinhard noch
dahin… :wink:

Nix da, never, außer ich krieg paar Fränkli dafür, dann schau ich mir mal wohlwollend die Hilfe zu Pivots an und was das überhaupt ist oder frag bei dir oder Marion nach, irgendwie bequemer *find*

Gruß
Reinhard

Grüezi Reinhard

danke das macht Sinn. Ist mir zwar nicht einleuchtend, aber
man kann sich der Logic nicht entziehen.

Doch, das macht durchaus Sinn.
Jede Anweisung bezieht sich prinzipiell auf das aktive
Tabellenblatt - worauf denn auch sonst :wink:

prinzipiell ist richtig, Range(„A1“).select klappt ja auch,
normalerweise, aber aufgrund einer Anfrage hier mit
ausgeblendeden Zeilen weiß ich grad nicht was geschieht wenn
ich Range(„A1“).select anweise, aber Zeile 1 ist ausgeblendet.

…Du beleibst den Spezialfall zu konstruieren - um solche Feinheiten und Finessen ging es mir dabei nicht :wink:

In der Anzeige ist danach keine Zelle markiert, wie auch. Nur,
was ich nicht weiß und es mir auch zu mühsam ist da alle
Möglichkeiten durchzutesten, weißt du genau, daß sich alle
Prozeduren die sich auf ActiveCell beziehen auch korrekt
funktionieren?

Im Prinzip ja, aber es kann Ausnahmen geben

…und vielleicht kriegen wir ja auch den Reinhard noch
dahin… :wink:

Nix da, never, außer ich krieg paar Fränkli dafür, dann schau
ich mir mal wohlwollend die Hilfe zu Pivots an und was das
überhaupt ist oder frag bei dir oder Marion nach, irgendwie
bequemer *find*

…wie Du meinst (fauler Hund :wink:))))

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Grüezi Winter

Doch, das macht durchaus Sinn.
Jede Anweisung bezieht sich prinzipiell auf das aktive
Tabellenblatt - worauf denn auch sonst :wink:

Sobald Du extern referenzieren willst musst Du dies konsequent
tun.
Normalerweise reicht das beim .Range(), da Du aber darin mit
.Cells() eine Start- und eine End-Zelle angeibst musst Du
diese ebenfalls sauber referenzieren.

Aber tröste dich, diese beiden Punkte werden von vielen
vergessen…

Servus Thomas,
ich habe mir gerade meinen Code an einer anderen Stelle angeschaut der dort nicht funktioniert hat und ich ihn auskommentiert hatte.

wksAktuell.Range(Cells(headerCount, 1), Cells(headerCount + maxcount, 1)).Rows.Group 

und ich atte KEINE ahnung warum nicht.
Jetzt ist es mir klar.

wksAktuell.Range(wksAktuell.Cells(headerCount, 1), wksAktuell.Cells(headerCount + maxcount, 1)).Rows.Group

Damit funktioniert es.
Danke!

Noch eine Nebenfrage:
Wenn ich die with anweisung mache kan nich bestimmt auf eine anderes (hier tabellenbaltt) beziehen

With wks1
.cells(1,1) = wks2.Cells(2,2).value
...
End with

und was auch funktionieren müsste:

wks2. activate
With wks1
.cells(1,1) = Cells(2,2).value
...
End with

beide müssten doch auf das selbe Ergebnis kommen,wenn ich das richtig verstanden habe?.
Grüße und Nochmals Danke
Winter