Seite 1 von 1
Sortier fehler ( 15 kleiner als 2 ?!?!? )
Verfasst: Di, 26.09.2006 16:33
von LSH_Dackel
Hallo Leute ich hab ein problem
Mein Makro sortier alle werte die mit 1 anfangen ( also 1,10,11,12,13,14,15)
so als wären sie kleiner als 2,3,4,5,6,7,8,9.
Code: Alles auswählen
sub rankingABIGK
Dim Entry(1, 3)
Dim Entry_s(1, 1)
Dim Entry_v(1, 1)
oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("HJLübersicht")
For zeile = 3 to 4
j = 1
k = 1
for i = 1 to 3
Cell = oSheet.getCellByposition(i,zeile)
Select Case Cell.Type
Case com.sun.star.table.CellContentType.VALUE
Entry_v(0,j) = oSheet.getCellByposition(i,zeile).Value
Entry_v(1,j) = oSheet.getCellByposition(i,0).formula
j = j + 1
Redim Preserve Entry_v(1,j)
Case Else
Entry_s(0,k) = oSheet.getCellByposition(i,zeile).String
Entry_s(1,k) = oSheet.getCellByposition(i,0).formula
k = k + 1
Redim Preserve Entry_s(1,k)
End Select
Next i
Redim Preserve Entry_v(1,j-1)
Redim Preserve Entry_s(1,k-1)
'*
For Count = 1 To UBOUND(Entry_v(),2)
For Count2 = Count + 1 To UBOUND(Entry_v(),2)
If Entry_v(0,Count) < Entry_v(0,Count2) Then
Temp = Entry_v(0,Count)
Temp2 = Entry_v(1,Count)
Entry_v(0,Count) = Entry_v(0,Count2)
Entry_v(1,Count) = Entry_v(1,Count2)
Entry_v(0,Count2) = Temp
Entry_v(1,Count2) = Temp2
End If
Next Count2
Next Count
'**
For Count = 1 To UBOUND(Entry_s(),2)
For Count2 = Count + 1 To UBOUND(Entry_s(),2)
If Entry_s(0,Count) < Entry_s(0,Count2) Then
Temp = Entry_s(0,Count)
Temp2 = Entry_s(1,Count)
Entry_s(0,Count) = Entry_s(0,Count2)
Entry_s(1,Count) = Entry_s(1,Count2)
Entry_s(0,Count2) = Temp
Entry_s(1,Count2) = Temp2
End If
Next Count2
Next Count
For Count = 1 To UBOUND(Entry_v(),2)
Entry(0, Count) = Entry_v(0, Count)
Entry(1, Count) = Entry_v(1, Count)
next count
i = Count
For Count = i To 3
Entry(0, Count) = Entry_s(0, Count-i+1)
Entry(1, Count) = Entry_s(1, Count-i+1)
next count
For Count = 1 To 3
oSheet.getCellByposition(29 -count, zeile).setformula((Entry (0,Count))
oSheet.getCellByposition(33 -count, zeile).setformula((Entry (1,Count))
Next
next zeile
end sub
Hier ist auch der screenshot davon
http://lshdackel.ls.funpic.de/Demo/screenshot.gif
Kann mir jemand sagen woran das liegt??
Schon ma THX im vorraus
MFG LSH_Dackel
Verfasst: Mi, 27.09.2006 13:20
von Mihilist
Ohne den Code genauer betrachtet zu haben würde ich sagen, dass du die Werte irgendwo als String ausliest und bearbeitest. Dann werden die "Zahlen" lexikographisch geordnet, sprich: Erst die erste (Text-)Stelle verglichen, dann erst die zweite, dann die dritte, ...
Und nach dieser Ordnung ist natürlich 15 < 2
(So wie Aal < B im Lexikon)

Verfasst: Mi, 27.09.2006 22:59
von LSH_Dackel
Ich habn den code jetz umgeschrieben aber ich bekomme immer einen fehler wenn i9ch das makro ausführe
kann mir jemand sagen woran das liegt???
http://lshdackel.ls.funpic.de/Demo/screenshot2.gif
die datei ist hier
http://lshdackel.ls.funpic.de/Demo/Kolegstufe.ods
MFG LSH_Dackel
Verfasst: Di, 03.10.2006 18:01
von Stephan
kann mir jemand sagen woran das liegt???
nach der Fehlermeldung in der Abbildung existiert entry_v(0,k) nicht was mutmaßlich daran liegt das das Array zu klein dimensioniert ist.
Ich weiß nicht wie das kommt, aber die Größe von entry_v() ist ebend nicht ausreichend i.S. ist entry_v() dimensioniertt mit:
Dim entry_v(0,0)
führt ein Schreiben in entry_v(0,k) natürlich zu einem Fehler wenn k größer 0 ist.
Gruß
Stephan
Verfasst: Di, 03.10.2006 19:05
von LSH_Dackel
Hallo Stephan
Mein problem ist nun leider nur das das entry_v bei egal welcher definition
[ Dim Entry_v(1, 1) , Dim Entry_v(1, 2) , Dim Entry_v(1, 3) , Dim Entry_v(1, 4) ]
einen fehler verursacht.
Naja und mich verwundert halt das es in diesem makro fehler verursacht da sich der code nicht wesentlich von
diesem makro das ich von dir hab unterscheidet
Code: Alles auswählen
sub ranking
Dim oSheets as Object
Dim oSheet as Object
Dim zelle as Object
Dim Entry(1, 4)
Dim Count As Double
Dim Count2 As Double
Dim Temp As Double
Dim Entry_s(1, 1)
Dim Entry_v(1, 1)
oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("HJLübersicht")
For zeile = 6 to 16
j = 1
k = 1
for i = 1 to 4
Cell = oSheet.getCellByposition(i,zeile)
Select Case Cell.Type
Case com.sun.star.table.CellContentType.VALUE
Entry_v(0,j) = oSheet.getCellByposition(i,zeile).Value
Entry_v(1,j) = oSheet.getCellByposition(i,0).String
j = j + 1
Redim Preserve Entry_v(1,j)
Case Else
Entry_s(0,k) = oSheet.getCellByposition(i,zeile).String
Entry_s(1,k) = oSheet.getCellByposition(i,0).String
k = k + 1
Redim Preserve Entry_s(1,k)
End Select
Next i
Redim Preserve Entry_v(1,j-1)
Redim Preserve Entry_s(1,k-1)
'*
For Count = 1 To UBOUND(Entry_v(),2)
For Count2 = Count + 1 To UBOUND(Entry_v(),2)
If Entry_v(0,Count) < Entry_v(0,Count2) Then
Temp = Entry_v(0,Count)
Temp2 = Entry_v(1,Count)
Entry_v(0,Count) = Entry_v(0,Count2)
Entry_v(1,Count) = Entry_v(1,Count2)
Entry_v(0,Count2) = Temp
Entry_v(1,Count2) = Temp2
End If
Next Count2
Next Count
'**
For Count = 1 To UBOUND(Entry_s(),2)
For Count2 = Count + 1 To UBOUND(Entry_s(),2)
If Entry_s(0,Count) < Entry_s(0,Count2) Then
Temp = Entry_s(0,Count)
Temp2 = Entry_s(1,Count)
Entry_s(0,Count) = Entry_s(0,Count2)
Entry_s(1,Count) = Entry_s(1,Count2)
Entry_s(0,Count2) = Temp
Entry_s(1,Count2) = Temp2
End If
Next Count2
Next Count
For Count = 1 To UBOUND(Entry_v(),2)
Entry(0, Count) = Entry_v(0, Count)
Entry(1, Count) = Entry_v(1, Count)
next count
i = Count
For Count = i To 4
Entry(0, Count) = Entry_s(0, Count-i+1)
Entry(1, Count) = Entry_s(1, Count-i+1)
next count
For Count = 1 To 4
oSheet.getCellByposition(30 -count, zeile).setformula((Entry (0,Count))
oSheet.getCellByposition(34 -count, zeile).setformula((Entry (1,Count))
Next
next zeile
end sub
hoffentlich kann mir bald jemand helfen
schon ma THX
MFG LSH_Dackel
Verfasst: Do, 05.10.2006 10:17
von hoefri55
Hallo LSH_Dackel
nachdem ich mir dein Makro und vor allem deine Datei angesehen habe, gehe ich davon aus, dass dein Problem durch die unterschiedlichen Werte und davon abhängig die unterschiedlich genutzten Variablen entsteht.
In deiner Datei in der Zeile 5 steht unter 12_1 der Wert 11. Das wird in die Variable Entry_v() eingetragen und dann die Dimensionierung erhöht. In der nächsten Spalte unter 12_2 steht dann aber "keine Note". Für diesen Wert benutzt du die Variable Entry_s(). Die wurde aber vorher nicht auf die Dimensionierung von Entry_v() erhöht.
Mir ist dann aber auch schleierhaft, wie du eine Sortierung mit Werten, die in verschiedenen Variablen gespeichert sind, hinbekommen willst.
Wäre es da nicht sinnvoller, nur die Variable Entry_v zu benutzen und im Falle von "keine Note" den Wert 0 einzusetzen?
Hoffentlich hilfts.
Gruß, Friedhelm
Verfasst: Do, 05.10.2006 10:31
von Stephan
nachdem ich mir dein Makro und vor allem deine Datei angesehen habe, gehe ich davon aus, dass dein Problem durch die unterschiedlichen Werte und davon abhängig die unterschiedlich genutzten Variablen entsteht.
Nee, ich hatte es bereits hingeschrieben, die Probleme entstehen dadurch das versucht wird in ein nicht existierendes Feld des Arrays zu schreiben, weil das Array zu klein dimensioniert ist. Konkret tritt das auf wenn beim Durchlauf der Hauptschleife eines der Arrays keine Werte enthält und dann hier:
Code: Alles auswählen
Redim Preserve Entry_v(1,j-1)
Redim Preserve Entry_s(1,k-1)
die zweite Array-Dimension auf 0 gesetzt wird.
Mir ist dann aber auch schleierhaft, wie du eine Sortierung mit Werten, die in verschiedenen Variablen gespeichert sind, hinbekommen willst.
da sind zwei Arrays die getrennt sortiert:
Code: Alles auswählen
'*
For Count = 1 To UBOUND(Entry_v(),2)
For Count2 = Count + 1 To UBOUND(Entry_v(),2)
If Entry_v(0,Count) < Entry_v(0,Count2) Then
Temp = Entry_v(0,Count)
Temp2 = Entry_v(1,Count)
Entry_v(0,Count) = Entry_v(0,Count2)
Entry_v(1,Count) = Entry_v(1,Count2)
Entry_v(0,Count2) = Temp
Entry_v(1,Count2) = Temp2
End If
Next Count2
Next Count
'**
For Count = 1 To UBOUND(Entry_s(),2)
For Count2 = Count + 1 To UBOUND(Entry_s(),2)
If Entry_s(0,Count) < Entry_s(0,Count2) Then
Temp = Entry_s(0,Count)
Temp2 = Entry_s(1,Count)
Entry_s(0,Count) = Entry_s(0,Count2)
Entry_s(1,Count) = Entry_s(1,Count2)
Entry_s(0,Count2) = Temp
Entry_s(1,Count2) = Temp2
End If
Next Count2
Next Count
und nach der Sortierung in ein gemeinsames Array geschrieben werden:
Code: Alles auswählen
For Count = 1 To UBOUND(Entry_v(),2)
Entry(0, Count) = Entry_v(0, Count)
Entry(1, Count) = Entry_v(1, Count)
next count
i = Count
For Count = i To 4
Entry(0, Count) = Entry_s(0, Count-i+1)
Entry(1, Count) = Entry_s(1, Count-i+1)
next count
Gruß
Stephan
Verfasst: Do, 05.10.2006 11:11
von hoefri55
Hallo nochmal,
ich habe bemerkt, dass ich doch wohl nicht tief genug eingestiegen bin. Sorry.
Mir ist nach nochmaligem hinsehen aufgefallen, dass in der ersten Schleife die Variable j für das Array Entry_s() und k für Entry_v().
In den darauffolgenden Zeilen:
Redim Preserve Entry_v(1,j-1)
Redim Preserve Entry_s(1,k-1)
werden diese aber genau vertauscht um eins zurückdimensioniert!
Evtl könnte das ein Fehler sein.
Dann taucht allerdings noch eine weitere Fehlermeldung auf.
Um das Ganze zum Laufen zu bringen habe ich mal die erste Schleife wie folgt geändert:
j = 0
k = 0
for i = 1 to 3
Cell = oSheet.getCellByposition(i,zeile)
Select Case Cell.String
Case = "keine Note"
j = j + 1
Redim Preserve Entry_s(1,j)
Entry_s(0,j) = oSheet.getCellByposition(i,zeile).String
Entry_s(1,j) = oSheet.getCellByposition(i,0).String
Case Else
k = k + 1
Redim Preserve Entry_v(1,k)
Entry_v(0,k) = oSheet.getCellByposition(i,zeile).Value
Entry_v(1,k) = oSheet.getCellByposition(i,0).String
End Select
Next i
Dann ist es nicht mehr erforderlich, die Dimensionierung zurückzusetzen. Bei mir hat das Makro dann funktioniert.
Gruß, Friedhelm
Verfasst: So, 08.10.2006 19:48
von LSH_Dackel
Danke hoefri55 für den tipp mit den vertauschten variablen
Die umgeänderte version von dir läuft zwar jedoch erfüllt sie nicht ihre Aufgabe.
Da es mir beim sortieren fast nur nullen ausgibt obwohl andere werte eingelesen werden.
Ich bin auch weiterhin für alle tipp dankbar die mir helfen könnten dieses problem zu lösen.
MFG LSH_Dackel