Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1556to1560
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

Sortieren

Sortieren
04.05.2017 07:58:04
USER
Guten Morgen.
Ich habe mir eine Tabelle zusammengebastelt um mein Problem zu visualisieren. Ich möchte nämlich die Werte aus einer Tabelle 2 mal Sortiert und Zugeordnet haben. Den ersten Schritt habe ich hinbekommen nur weiß ich nicht genau wie ich den zweiten durchführen kann.
Vielleicht gibt es ja eine Formel die mir dabei hilft von der ich nichts weiß?
Jedenfalls bin ich für jegliche Hilfe dankbar :)
https://www.herber.de/bbs/user/113294.xlsm

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortieren
04.05.2017 10:57:39
fcs
Hallo USER,
eine Formel-Lösung für eine solche Aufbereitung der Daten gibt es nicht.
Das entsprechende Makro würde einfacher, wenn deine Ausgangsdaten nach den drei Spalten aufsteigend sortiert wären.
Nachfolgende Lösung kommt ohne deine Zusatztabelle aus.
LG
Franz
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B23")) Is Nothing Then
Application.EnableEvents = False
Call Daten_aufbereiten(strSuche:=Range("B23").Value)
Application.EnableEvents = True
End If
End Sub
Sub Daten_aufbereiten(strSuche As String)
Dim objCol As New Collection
Dim strWert As String
Dim Zeile As Long, lngSpalte As Long, lngZiel As Long
Dim arrData
Dim arrWerte(), intWerte As Integer
Const strSep = ";" 'Trennzeichen in Hilfswerten
On Error GoTo Fehler
With Worksheets("TAB")
'Werteliste in Datenarray einlesen
Zeile = .Cells(.Rows.Count, 7).End(xlUp).Row
If Zeile >= 26 Then
arrData = .Range(.Cells(26, 7), .Cells(Zeile, 9))
Else
MsgBox "Keine Daten in Liste vorhanden"
Exit Sub
End If
End With
'Werte zum Suchbegriff (Name) suchen
intWerte = 0
For Zeile = LBound(arrData) To UBound(arrData)
If strSuche = arrData(Zeile, 1) Then
'Spalte 2 und 3 zusammenfassen, dabei auf 5 Zeichen mit Leerzeichen auffüllen _
und Zahlen mit führenden 0 darstellen - erforderlich für korrekte Sortierung.
'bei längeren Texten in Spalte 2 oder Zahlen größer 100 in Spalte 3 muss man  _
anpassen
strWert = arrData(Zeile, 2) & String(5 - Len(arrData(Zeile, 2)), " ") _
& strSep & Format(arrData(Zeile, 3), "000")
'über das Collection-Objekt werden doppelte Werte übersprungen
objCol.Add strWert, Key:=strWert
intWerte = intWerte + 1
ReDim Preserve arrWerte(1 To intWerte)
arrWerte(intWerte) = strWert
End If
ResumeZeile:
Next
Set objCol = Nothing
Erase arrData
'gefundene Daten eintragen
With Worksheets("TAB")
'vorhandene Inhalte im Zielbereich löschen
lngZiel = 23
'letzte Zeile mit Daten in Spalte B
Zeile = .Cells(.Rows.Count, 2).End(xlUp).Row
If Zeile > lngZiel Then
.Range(.Cells(lngZiel + 1, 2), .Cells(Zeile, 5)).ClearContents
End If
If intWerte > 0 Then
If intWerte > 1 Then
'Werte aus Spalte 2 und 3 sortieren
Call QuickSort(DasArray:=arrWerte)
End If
strWert = ""
For intWerte = LBound(arrWerte) To UBound(arrWerte)
'Werte am Trennzeichen wieder trennen
arrData = Split(arrWerte(intWerte), strSep)
'Prüfen, ob sich Wert in Spalte 2 geändert hat
If strWert  Trim(arrData(0)) Then
'Startspalte für Einträge setzen
lngSpalte = 2
'Zähler für Zielzeile erhöhen
lngZiel = lngZiel + 2
'neuen Wer in Spalte 2 merken
strWert = Trim(arrData(0))
'Wert Spalte 2 eintragen
.Cells(lngZiel, lngSpalte) = strWert
End If
'Wert Spalte 3 eintragen
lngSpalte = lngSpalte + 1
.Cells(lngZiel, lngSpalte) = Val(arrData(1))
Next
End If
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 457 'doppelter Wert für Collection
Resume ResumeZeile
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub
'Aus Herber-Archiv von Rudi Maintaire
'https://www.herber.de/forum/archiv/1276to1280/1279197_Code_optimieren_beschleunigen.html# _
1279197
Sub QuickSort(ByRef DasArray, Optional ErsteZeile, Optional LetzteZeile)
On Error Resume Next
Dim UnterGrenze As Long, OberGrenze As Long
Dim AktuellerWert, GemerkterWert As Variant
If IsMissing(ErsteZeile) Then
ErsteZeile = LBound(DasArray)
End If
If IsMissing(LetzteZeile) Then
LetzteZeile = UBound(DasArray)
End If
UnterGrenze = ErsteZeile
OberGrenze = LetzteZeile
AktuellerWert = DasArray((ErsteZeile + LetzteZeile) / 2)
Do While (UnterGrenze  AktuellerWert And OberGrenze > ErsteZeile)
OberGrenze = OberGrenze - 1
Loop
If (UnterGrenze  ErsteZeile) Then Call QuickSort(DasArray, ErsteZeile, OberGrenze)
If (UnterGrenze 

Anzeige
AW: Sortieren
04.05.2017 14:36:08
USER
Vielen Dank! Habe mich ein wenig mit dem Code beschäftigt und muss sagen das ich gerade ein wenig überfordert bin ^^
Ich kann es zwar auf mein Layout anpassen nur kann das sein das es zu Fehlern kommen kann wenn Ergebnisse keine Zahlen sind sondern Texte?
In meiner Eigendlichen Datei steht in den Spalten nämlich sowas:
00225080-ABC04-HP11240B
Kann das ein das es dadurch Probleme mit dem Sortieren gibt? Fehlermeldung schaut so aus:
Fehler-Nr.:5
ungültiger Prozeduraufruf oder ungültiges Argument
Ich bin leider komplett aufgeschmissen bei sowas :(
MfG
Marco
Anzeige
AW: Sortieren
04.05.2017 15:13:23
USER
Habe bemerkt das Probleme gibt sobald ich:
In Spalte zwei sowas stehen habe wie ABC04A..... ABC04 funktioniert
In Spalte drei einen Text habe :(
Ich weiß wirklich nicht welcher Teil des Codes die Probleme verursacht. Ich nehme an das sortieren?
Bitte um Hilfe ich bin hier schon am verzweifeln
AW: Sortieren
04.05.2017 15:38:43
USER
Habe schon Probleme Ausgebessert die letzte Sache die nicht will ist einen TEXT in Spalte 3 annehmen.
Der Rest ist wirklich einwandfrei!!!!
AW: Sortieren
04.05.2017 15:46:52
fcs
Hallo Marco,
ich hab das Hauptmakro angepasst, so dass jetzt längere Texte in Spalte 2 der Liste verarbeitet werden und in Spalte 3 ganze Zahlen oder Texte stehen dürfen.
Ich hatte das Makro bisher für Texte mit bis zu 5 Zeichen vorbereitet
Ich hoffe, damit kommst du weiter.
LG
Franz
Sub Daten_aufbereiten(strSuche As String)
Dim objCol As New Collection
Dim strWert As String
Dim Zeile As Long, lngSpalte As Long, lngZiel As Long
Dim arrData
Dim arrWerte(), intWerte As Integer, intLen As Integer, intLenZ As Integer
Const strSep = ";" 'Trennzeichen in Hilfswerten
On Error GoTo Fehler
With Worksheets("TAB")
'Werteliste in Datenarray einlesen
Zeile = .Cells(.Rows.Count, 7).End(xlUp).Row
If Zeile >= 26 Then
arrData = .Range(.Cells(26, 7), .Cells(Zeile, 9))
Else
MsgBox "Keine Daten in Liste vorhanden"
Exit Sub
End If
End With
'Werte zum Suchbegriff (Name) suchen
intWerte = 0
intLen = 0
intLenZ = 0
'max. String-Länge in Spalte 2 bestimmen und längste Zahl in Spalte 3 bestimmen
For Zeile = LBound(arrData) To UBound(arrData)
If strSuche = arrData(Zeile, 1) Then
If intLen  lngZiel Then
.Range(.Cells(lngZiel + 1, 2), .Cells(Zeile, 5)).ClearContents
End If
If intWerte > 0 Then
If intWerte > 1 Then
'Werte aus Spalte 2 und 3 sortieren
Call QuickSort(DasArray:=arrWerte)
End If
strWert = ""
For intWerte = LBound(arrWerte) To UBound(arrWerte)
'Werte am Trennzeichen wieder trennen
arrData = Split(arrWerte(intWerte), strSep)
'Prüfen, ob sich Wert in Spalte 2 geändert hat
If strWert  Trim(arrData(0)) Then
'Startspalte für Einträge setzen
lngSpalte = 2
'Zähler für Zielzeile erhöhen
lngZiel = lngZiel + 2
'neuen Werte Spalte 2 merken
strWert = Trim(arrData(0))
'Wert Spalte 2 eintragen
.Cells(lngZiel, lngSpalte) = strWert
End If
'Wert Spalte 3 eintragen
lngSpalte = lngSpalte + 1
.Cells(lngZiel, lngSpalte) = _
IIf(IsNumeric(arrData(1)), Val(arrData(1)), arrData(1))
Next
End If
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 457 'doppelter Wert für Collection
Resume ResumeZeile
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Anzeige
AW: Sortieren
04.05.2017 16:24:22
USER
PERFEKT! Meinen grössten Respekt
Das mit der Länge ist mir im nachhinein auch aufgefallen nur ist deine Lösung um einiges eleganter
Ich frage mich wie du das so schnell hinbekommen hast :O
Ich weiß es wird langsam neervig aber gibt es auch Möglichkeiten leere Zellen zu überspringen?
Wie immer funktioniert das was ich mir gebastelt habe nicht ganz ^^
MfG
Marco
AW: Sortieren
05.05.2017 05:18:19
fcs
Hallo Marco,
Ich frage mich wie du das so schnell hinbekommen hast :O

Nach über 25 Jahren Arbeit mit Excel und Programmierung von Makros kenne ich natürlich viele Tücken in Excel/VBA und mögliche Lösungsansätze.
.... aber gibt es auch Möglichkeiten leere Zellen zu überspringen?

Ja, zusätzlich zur Prüfung auf den Namen muss bei der Erstellung der Trefferliste "nur" der Inhalt in Spalte 2 und 3 auf verschieden von Leerstring geprüft werden.
LG
Franz
    If intLen = 0 Then
MsgBox "Keine Werte in Spalte2 verschieden von """" zu gewähltem Namen gefunden"
Else
For Zeile = LBound(arrData) To UBound(arrData)
If strSuche = arrData(Zeile, 1) Then
'prüfen,ob Spalte 2 und 3 Inhalt haben                                  'Neu
If arrData(Zeile, 2)  "" And arrData(Zeile, 3)  "" Then             'Neu
'Spalte 2 und 3 zusammenfassen, dabei Spalte2 mit Leerzeichen auffüllen _
und Zahlen mit führenden 0 darstellen - erforderlich für korrekte Sortierung.
strWert = arrData(Zeile, 2) & String(intLen - Len(arrData(Zeile, 2)), " ") _
& strSep & Format(arrData(Zeile, 3), String(intLenZ, "0"))
'über das Collection-Objekt werden doppelte Werte übersprungen
objCol.Add strWert, Key:=strWert
intWerte = intWerte + 1
ReDim Preserve arrWerte(1 To intWerte)
arrWerte(intWerte) = strWert
End If                                                                   'Neu
End If
ResumeZeile:
Next
End If

Anzeige
AW: Sortieren
05.05.2017 07:50:56
MAXX
Ah ich verstehe glaub ich schon ein wenig mehr vom Code. Vielen Dank! Jetzt ist alles Perfekt für meinen Zweck. Ich kann dir nicht genug danken :)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige