Sortier fehler ( 15 kleiner als 2 ?!?!? )

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Sortier fehler ( 15 kleiner als 2 ?!?!? )

Beitrag 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
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag 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)

:)
LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Beitrag 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
hoefri55
**
Beiträge: 37
Registriert: Do, 16.09.2004 10:16
Wohnort: Meppen

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
hoefri55
**
Beiträge: 37
Registriert: Do, 16.09.2004 10:16
Wohnort: Meppen

Beitrag 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
LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Beitrag von LSH_Dackel »

Danke hoefri55 für den tipp mit den vertauschten variablen :oops:

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
Antworten