Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1892to1896
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Sortieren

VBA Sortieren
28.07.2022 17:11:41
MeddlBosdler
Hallo
Ich versuche mich an diesem kleinen Code, und bis aufs sortieren klappt es ganz gut.
Das Calculate am Schluss ist drin, da ich es jetzt so gelöst habe dass in einer Spalte das Ergebnis kommt, und die Sortieren Formel dann in einer anderen Spalte dies übernimmt. Diesen Zwischenschritt würde ich gerne weglassen.
Bestimmt könnt ihr mir helfen, Danke im voraus.

Sub Eindeutige_Daten()
Dim rng As Range
Dim InputRng As Range, OutRng As Range
Set dt = CreateObject("Scripting.Dictionary")
xTitleId = "Eindeutige Daten"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
For Each rng In InputRng
If rng.Value  "" Then
dt(rng.Value) = ""
End If
Next
OutRng.Range("A1").Resize(dt.Count) = Application.WorksheetFunction.Transpose(dt.Keys)
'** Zelladresse in Spalten- und Zeilenangabe trennen
Dim wert() As String
wert = Split(OutRng.Address, "$")
letztezeile = ActiveSheet.Cells(1048576, wert(1)).End(xlUp).Row
With ActiveWorksheet.Sort
.SetRange Range(OutRng & ":" & wert(1) & letztezeile)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Calculate
End Sub

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Sortieren
28.07.2022 17:27:36
GerdL
Hallo, ist es so besser?

Sub Eindeutige_Daten()
Dim rng As Range
Dim InputRng As Range, OutRng As Range
Set dt = CreateObject("Scripting.Dictionary")
xTitleId = "Eindeutige Daten"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
For Each rng In InputRng
If rng.Value  "" Then
dt(rng.Value) = ""
End If
Next
OutRng.Range("A1").Resize(dt.Count) = Application.WorksheetFunction.Transpose(dt.Keys)
'** Zelladresse in Spalten- und Zeilenangabe trennen
Dim wert() As String
wert = Split(OutRng.Address, "$")
letztezeile = ActiveSheet.Cells(1048576, wert(1)).End(xlUp).Row
With ActiveWorkbook.ActiveSheet.Sort
.SetRange ActiveWorkbook.ActiveSheet.Range(OutRng & ":" & wert(1) & letztezeile)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Calculate
End Sub
Gruß Gerd
Anzeige
AW: VBA Sortieren
28.07.2022 18:11:23
Christian
Hallo
Danke für die schnelle Antwort
gleicher Fehler.
Anwendungs- oder objektdefinierter Fehler
in dieser Zeile

        .SetRange ActiveWorkbook.ActiveSheet.Range(OutRng & ":" & wert(1) & letztezeile)

AW: VBA Sortieren
28.07.2022 18:26:52
Daniel
Hi
probiers mal in dieser Zeile so

.SetRange ActiveWorkbook.ActiveSheet.Range(OutRng.Address & ":" & wert(1) & letztezeile)
da du hier den Addressstring zusammenstellst, brauchst du von OutRng auch die Adresse und nicht die Zelle selbst.
oder du definierst den Zellbereich so:

SetRange OutRng.Resize(letztezeile - OutRng.Row + 1, 1)
Gruß Daniel
Anzeige
AW: VBA Sortieren
28.07.2022 18:56:56
Christian
Danke Daniel
Das klappt jetzt, aber sortieren trotzdem nicht.
Der Sortierbezug ist ungültig.
evtl ist der Fehler das sortieren nach, da es keine intelligente Tabelle ist?
wie kann ich das lösen.
Fehler wird angezeigt bei '.apply'
AW: VBA Sortieren
28.07.2022 19:50:28
Daniel
Hi
in deinem Code fehlt ja noch die Defintion der Sortierspalten, also nach welchen Spalten soll sortiert werden, aufsteigend oder absteigend usw.
zeichne mal in einer neuen Datei das das Sortieren mit dem Recorder auf und du wirst schnell sehen, was da noch fehlt.
Gruß Daniel
AW: VBA Sortieren
28.07.2022 20:06:23
Christian
Dann ist das das Problem
Objekt erforderlich

    ActiveWorksheet.Sort.SortFields.Add2 Key:=Range( _
OutRng.Address & ":" & wert(1) & letztezeile), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
Hab das Makro aufgezeichnet und die Range mit der variablen wie drunter ersetzt
Anzeige
AW: VBA Sortieren
28.07.2022 21:00:39
Daniel
bitte nicht tröpfenweise
oder jedes mal 20 Euro an mich überweisen , dann gerne.
AW: VBA Sortieren
28.07.2022 21:13:42
Christian
ich habe ja meinen ganzen Code hier hochgeladen, und dann tröpfchenweise angepasst.
ich kann mich ja nur von Problem zu Problem hangeln.
Ich habe das Makro aufgezeichnet und mir ist das aufgefallen dass nicht vor meinem Code stand, also habe ich das eingefügt und den Bereich durch meine Variablen ergänzt, so wie in der vorherigen Nachricht geschrieben.
Das hat mich eben dann zum nächsten Fehler gebracht.
Mir wäre es, zumindest im Moment, auch lieber wenn ich gleich nach der 1. Antwort einen funktionierenden Code gehabt hätte.
Ich habe auch nichts gegen das herantasten, denn dann verstehe ich evtl etwas mehr , aber genau wegen dem "tröpfechenweise" habe ich den gesamten Code gleich am Anfang gepostet, so dass jeder seine Lösung testen könnte und evtl kein Fehler mehr auftaucht.
Anzeige
AW: VBA Sortieren
28.07.2022 23:17:58
Oberschlumpf
...oder du könntest ja auch...gleich als ganzes, nich byteweise, per Upload eine Bsp-Datei mit Bsp-Daten zeigen....is nur so ne Idee von mir
AW: VBA Sortieren
28.07.2022 23:44:16
Yal
Hallo zusammen,
Ich verstehe weiterhin nicht, warum es aus eine Liste von Werte (sagen wir 10 einzelne) nur die eindeutige Werte gelesen werden (es sind womöglich weniger als in der originale Liste. Vor allem die leere Zelle werden ausser acht gelassen. Wir sagen, wir hätten nur noch 7), irgendwo abgelegt und darauf sortiert, aber dann auf dem gesamten Umfang der originale Liste.
Irgendwie ergibt dieses Verfahren für mich sehr wenig sinn.
Vielleicht könnte die Datei (verfremdet, es interessiert uns nur eine sehr kleine Teil davon) helfen, das gesamt zu verstehen.
Blind würde folgende Vorschlag einreichen:

Sub Eindeutige_Daten()
Dim rng As Range
Dim InputRng As Range
Dim OutRng As Range
Dim Spalte() As String
Set InputRng = Application.InputBox("Range :", xTitleId, Selection.Address, Type:=8)
Set OutRng = Application.InputBox("Output to (single cell):", xTitleId, Type:=8)
'stellt sicher, dass OutRng nur eine Zelle ist.
Set OutRng = OutRng.Cells(1)
'aber eigentlich wäre vielleicht folgende Verfahren besser
'    Set OutRng = Intersect(InputRng.Rows(1).EntireRow, OutRng.Cells(1).EntireColumn)
'Aufnahme der eindeutige Werte im Quellbereich (wozu?)
Set dt = CreateObject("Scripting.Dictionary")
For Each rng In InputRng
If rng.Value  "" Then dt(rng.Value) = ""
Next
'Ausgabe der eindeutigen Werte
OutRng.Resize(dt.Count, 1) = Application.WorksheetFunction.Transpose(dt.Keys)
'Bereich zu sortieren defineren
' Ein Bereich kann als Range(Range("A1"), Range("D4")) definiert werden
' aber auch als Range(Range("A4"), Range("D1")
With ActiveWorksheet.Sort
.SetRange Range(OutRng, ActiveSheet.Cells(Rows.Count, 1).End(xlUp))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'temporäre kopierte Daten wieder löschen
OutRng.Cells.ClearContents
Calculate
End Sub
VG
Yal
Anzeige
AW: VBA Sortieren
29.07.2022 06:25:37
Christian
Guten Morgen
Auch kommt beim Sortieren ein Fehler, Objekt erforderlich.
Ich habe hier 4 - 6 Dienstposten und einen dazugehörigen Springer.
Im Dienstplan habe ich diese so angelegt, dass mich per Dropdown nur die angezeigt bekomme, die den Posten auch können.
Beim Springer ist es dann natürlich sinnvoll, dass jeder Name nur einmal auftaucht.
Bei den einzelnen Bezirken ging das über die Sortieren-Funktion, Da ich hier eine Aufstellung mit Name und Bezirk habe, wo ich ein "X" eintrage wenn jemand den Bezirk kann.
Beim Springer wollte ich das eben so lösen.
Datei hochgeladen
https://www.herber.de/bbs/user/154417.xlsm
Anzeige
Passwort?
29.07.2022 09:10:37
Yal
Lol: eine passwortgeschutzte Datei hochladen. Da kommt Freude auf!
Helft uns bitte Dir zu helfen.
VG
Yal
AW: Passwort?
29.07.2022 09:37:35
Christian
Sorry
Den wollte ich noch entfernen.
3373
Viel Heu, aber kein Nadel.
29.07.2022 10:36:33
Yal
Hallo Christian,
sehe ich das richtig, dass deine Datei sehr viel beinhaltet, aber nicht den von Dir zur Prüfung gegebenen Code?
Könntest Du die Datei so abspecken, dass NUR die 2 oder 3 Elemente beinhaltet, die die Beantwortung deiner Frage notwendig sind?
Ich habe zum Beispiel Excel 2016 und kann mit den Excel365-Formeln nichts anfangen. Diese sind für die Lösung deines Problems nicht relevant, aber für die Funktionsfähigkeit deiner Datei sehr wohl. Weg damit.
Ich stelle die Frage aus Status offen.
VG
Yal
Anzeige
AW: Viel Heu, aber kein Nadel.
29.07.2022 11:05:12
Christian
ich habe das Makro in meiner Persönlichen Mappe, brauche sie für mehrere Dateien.
habe sie jetzt hier hinzugefügt, ging davon aus da sie im 1. Post drin steht nicht notwendig
https://www.herber.de/bbs/user/154420.xlsm
AW: Viel Heu, aber kein Nadel.
29.07.2022 14:23:10
Yal
Hallo Christian,
wie dumm von mir, dass ich folgende Satz nicht genau gesehen habe:
"Auch kommt beim Sortieren ein Fehler, Objekt erforderlich."
Es fehlt nämlich bei der Sortierung den Schlüssel nachdem es dsortiert werden soll. Das entdeckt man u.a. in dem man eine Sortierung unter laufenden Makrorekorder einrichtet.
Der Code sollte dementsprechend wie folgt ergänzt:

    With ActiveWorksheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range(OutRng), SortOn:=xlSortOnValues, Order:=xlAscending
.SetRange Range(OutRng, ActiveSheet.Cells(Rows.Count, 1).End(xlUp))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Ich habe den Code nicht getestet, weil ich müsste dabei definieren, was sortiert werden soll und wo diese OutRng sein soll. Weder in deinem Coding noch in der Datei ist soetwas zu entdecken. Und deine Erklärung "Ich habe hier 4 - 6 Dienstposten und einen dazugehörigen Springer. [..]" ist für mich als aussenstehende nicht aussagekräftig. Ich müsste zu viel Zeit reinstecken, um womöglich daneben zu liegen.
VG
Yal
Anzeige
AW: Viel Heu, aber kein Nadel.
29.07.2022 14:34:06
Christian
leider Nein
auch hier Objekt erforderlich
Es soll in der Musterdatei, im Blatt Dropdown alle Namen von Bezirk 1 - 6 markiert werden und in Springer 1 (H8) sortiert werden und jeder Name nur einmal vorkommen.
Das gleiche dann in Springer 2 für Bezirk 7 - 12, und eben in anderen Dateien
Vor lauter Bäume den wlad nicht sehen...
29.07.2022 15:13:53
Yal
Es heisst "ActiveSheet" und nicht "ActiveWorksheet"!
Und ich habe eine Fehler. Folgende Zeile muss so aussehen:

.SortFields.Add Key:=OutRng, SortOn:=xlSortOnValues, Order:=xlAscending
Aber ganz genau gesehen: im Blatt "Bezirke" sind die Daten in einer aktiven Tabelle.
Wenn es immer so ist, sollte den Code so aussehen:

Sub Eindeutige_Daten()
With ActiveSheet.ListObjects(1)
'Remove Duplicate löscht die ganze Zeile, wenn in Spalte 1 ein Eintrag zum zweiten mal vorkommt
.DataBodyRange.RemoveDuplicates Columns:=1, Header:=xlYes
With .Sort
.SortFields.Clear
.SortFields.Add Key:=.Parent.DataBodyRange.Cells(1), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortTextAsNumbers
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
VG
Yal
Anzeige
AW: Vor lauter Bäume den wlad nicht sehen...
29.07.2022 15:23:28
Christian
jetzt kommt wieder ein Fehler bei
.apply
Teile einer Matrix können nicht geändert werden.
Die Werte sind pro Spalte in einer Matrix, dass sie sich selbstständig aktualisieren (eben mit der Sortieren und Filter Funktion)
Es ist nicht immer eine Formatierte Tabelle, und werden dann mit deiner 2. Lösung nicht alle zu eindeutige Daten, und nicht Bezirk 1-6 und dann 7-12.
Es gibt auch welche wo nur 4 oder 5 Bezirke drin sind, dann also nur 1-5 oder 6-10.
AW: Vor lauter Bäume den wlad nicht sehen...
29.07.2022 15:51:10
Daniel
"Hart" (also über die Menüfunktion) sortieren solltest du nur Tabellen mit festen Werten.
Wenn du Werte per Formel aus anderen Tabellen übernimmst musst du die Sortierung so übernehmen wie von dort vorgegeben ist, oder eben in deiner Formel sortieren.
Dafür gibst - je nach Excelversion - die Funktion Sortieren.
Gruß Daniel
AW: Vor lauter Bäume den wlad nicht sehen...
29.07.2022 15:58:09
Christian
Ok, dann geht es nicht.
Die Ausgangswerte kann ich nicht Sortieren, da sie in "X"-Tabelle sind, sprich ich trage nur ein X ein wer welchen Bezirk kann.
Dies wird dann mit der Matrix-Formel vorne berechnet. und auf die greife ich zu.
Dann muss ich den unschönen Weg gehen und eine Hilfsspalte einfügen in der ich die Werte per Makro erhalte und dann in der anderen Sortiere.
Ich habe das auch schon irgendwo gesehen, dass man Formeln in Werte umwandelt per Makro. Wäre das als Zwischenschritt innerhalb des Makros möglich um es dann Sortieren zu können? Nur so ein Gedanke der mir da gerade gekommen ist.
AW: Vor lauter Bäume den wlad nicht sehen...
29.07.2022 16:30:35
Daniel
hatte ich doch geschrieben:
"Hart" (also über die Menüfunktion) sortieren solltest du nur Tabellen mit festen Werten.
damit sollte eigentlich klar sein, dass du sortieren kannst, wenn du die Formeln durch Werte ersetzt hast.
Gruß Daniel
AW: Vor lauter Bäume den wlad nicht sehen...
29.07.2022 16:48:21
Christian
Hab es Versucht in Werte umzuwandeln.
Das habe ich dazu gefunden ( stelle komplettes Makro hier rein )
Wenn ich das mache, sind alle Einträge unter den Bezirken weg und der jeweils 1. Eintrag rutscht von Zeile 8 in Zeile 4.
Beim Springer über Makro ist die 1. Zeile auch weg, der Rest bleibt stehen, ist aber auch nicht sortiert.

Sub Eindeutige_Daten()
Dim rng As Range
Dim InputRng As Range
Dim OutRng As Range
Dim Spalte() As String
Set InputRng = Application.InputBox("Range :", xTitleId, Selection.Address, Type:=8)
Set OutRng = Application.InputBox("Output to (single cell):", xTitleId, Type:=8)
Set OutRng = Intersect(InputRng.Rows(1).EntireRow, OutRng.Cells(1).EntireColumn)
'Aufnahme der eindeutige Werte im Quellbereich (wozu?)
Set dt = CreateObject("Scripting.Dictionary")
For Each rng In InputRng
If rng.Value  "" Then dt(rng.Value) = ""
Next
'Ausgabe der eindeutigen Werte
OutRng.Resize(dt.Count, 1) = Application.WorksheetFunction.Transpose(dt.Keys)
'Zellinhalt als Werte
ActiveSheet.Range(OutRng, ActiveSheet.Cells(Rows.Count, 1).End(xlUp)).Value = ActiveSheet.Range(OutRng, ActiveSheet.Cells(Rows.Count, 1).End(xlUp)).Value
'Bereich zu sortieren defineren
' Ein Bereich kann als Range(Range("A1"), Range("D4")) definiert werden
' aber auch als Range(Range("A4"), Range("D1")
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=OutRng, SortOn:=xlSortOnValues, Order:=xlAscending
.SetRange Range(OutRng, ActiveSheet.Cells(Rows.Count, 1).End(xlUp))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'temporäre kopierte Daten wieder löschen
OutRng.Cells.ClearContents
Calculate
End Sub

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige