Ich habe einen Algorithmus geschrieben, der ganzzahlige Werte in aufsteigender Reihenfolge sortiert, aber entsprechende Informationen in benachbarten Zellen in einer Zeile sortiert hält. Er verwendet Arr als Momentaufnahme der zu sortierenden Zelle, erstellt ein Array der Indizes der Werte (TagIndex), wenn sie in aufsteigender Reihenfolge sortiert wurden, und wendet TagIndex auf diese und die angrenzenden Zellen an.Ungleichheitsoperatoren scheitern beim Vergleichen von Varianten
Zum Beispiel sollte es dies nehmen ...
----------------------------------
| 5/14/12 | 87 | 91 | 102 |
| 12/8/11 | 96 | 81 | 93 |
| 9/30/10 | 75 | 101 | 74 |
| 4/26/08 | 107 | 95 | 64 |
----------------------------------
... und sortiert nach der zweiten Spalte ganz links es in diese einzuschalten:
----------------------------------
| 9/30/10 | 75 | 101 | 74 |
| 5/4/12 | 87 | 91 | 102 |
| 12/8/11 | 96 | 81 | 93 |
| 4/26/08 | 107 | 95 | 64 |
----------------------------------
Hier ist der Code:
Dim cell as Range
Dim Arr, TempArr, BoundVal As Variant
For Each cell In ActiveSheet.ListObjects("Table2").ListColumns(targetColumn).DataBodyRange
Arr = Split(cell.Value, Chr(10))
ReDim TagIndex(0 To UBound(Arr)) As Variant
For i = 0 To UBound(Arr)
BoundVal = Arr(i) 'starts with first value and index
TagIndex(i) = i 'as defaults
For j = 0 To UBound(Arr)
If Arr(j) < BoundVal Then 'if sorter finds a smaller value,
BoundVal = Arr(j) 'flags it...
TagIndex(i) = j '...and its index as smaller,
End If 'keeps looking,
Next j 'leaves For loop with the smallest,
Arr(TagIndex(i)) = 201 'and moves it up out of reach so sorter won't
Next i 'flag it anymore (none of the values go above 200)
For j = leftBoundColumn To rightBoundColumn
TempArr = Split(Cells(cell.Row, j).Value, Chr(10))
For i = 0 To UBound(TempArr)
Arr(i) = TempArr(TagIndex(i))
Next i
Cells(cell.Row, j).Value = Join(Arr, Chr(10))
Next j
Next cell
Dieser Code arbeitete zuerst Dandy, aber ich hatte zwei getrennte Versionen - eine für das Sortieren von ganzen Zahlen und eine andere für das Sortieren Dates - und wollte einen, der beides angeht. Um das zu tun, versuchte ich BoundVal als eine Variante in der neuen zu deklarieren. Als die Ergebnisse wonky, enthüllte scharfer Gebrauch von MsgBox'es, dass es logische Tests am Operator < versagte und versuchte, mir für 96 < 201 und Ja für 107 < 75 Nein zu sagen (aber nicht für 117/107, wie es sollte).
Wenn ich BoundVal als Integer deklariere, funktioniert es gut für Integer, aber gibt mir einen Type Mismatch Fehler, wenn ich es an Daten versuche.
Gibt es ein grundlegendes Problem beim Vergleich von Arr (j) < BoundVal? Beide sind Varianten, beide stammen von Strings ab. Irgendwelche Ideen?
Nur weil Sie eine Variable als Variante deklarieren, heißt das nicht, dass sie zur Laufzeit nur so bleibt. Teste es einfach selbst: 'Dim varTMP As Variant' setze es dann auf 20 in der nächsten Zeile' varTMP = 20' und frage nach dem Typ der Variablen 'Debug.Print TypeName (varTMP)'. Sie erhalten die Antwort "Integer". Also, vielleicht möchten Sie ein paar mehr TextBoxen hinzufügen, um zu überprüfen, was Sie miteinander vergleichen ... – Ralph
Danke, das ist das Problem. Aber BoundVal = CVar (Arr (i)) gelingt es nicht, BoundVal zu einer Variante zu ändern. Wie sonst könnte es gemacht werden? –