Per Makro Werte sortieren und in Zellen eintragen?

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

Moderator: Moderatoren

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

Per Makro Werte sortieren und in Zellen eintragen?

Beitrag von LSH_Dackel »

Hi mein Problem ist ich habe zwar ein Makro mitdem ich den wert auslesen und sortieren kann aber es gibt sie mir nur in einer MsgBox aus.
Und wenn ich versuche sie in Zellen eines OO Calc Documents eintragen zu lassen gibt es mir den wert "4" aus.

Schonmal danke im vorraus

Code: Alles auswählen

Sub Bestenliste
Dim Entry(1 To 10) As String
Dim Count As Integer
Dim Count2 As Integer
Dim Temp As String

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Dackel")

Dim Dackel as Object
Dackel = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Tetzi")

Dim Tetzi as Object
Tetzi = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Kuba")

Dim Kuba as Object
Kuba = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Marion")

Dim Marion as Object
Marion = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Niggo")

Dim Niggo as Object
Niggo = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Paddy")

Dim Paddy as Object
Paddy = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Thomas")

Dim Thomas as Object
Thomas = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Simon")

Dim Simon as Object
Simon = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("Flo")

Dim Flo as Object
Flo = oSheet.getCellByposition(27, 21)

 oSheets = ThisComponent.Sheets
oSheet = oSheets.getByName("David")

Dim David as Object
David = oSheet.getCellByposition(27, 21)


Entry(1) = Dackel.value                           'Beispiel aus dem StarBasic         
Entry(2) = David.value                             '        FAQ
Entry(3) = Flo.value
Entry(4) = Simon.value
Entry(5) = Thomas.value
Entry(6) = Paddy.value
Entry(7) = Niggo.value
Entry(8) = Marion.value
Entry(9) = Kuba.value
Entry(10) = Tetzi.value
For Count = 1 To 10
For Count2 = Count + 1 To 10
If Entry(Count) > Entry(Count2) Then
Temp = Entry(Count)
Entry(Count) = Entry(Count2)
Entry(Count2) = Temp
End If
Next Count2
Next Count
For Count = 1 To 10

oSheet = oSheets.getByName("Bestenliste")
erster = oSheet.getCellByposition(2, 1)
zweiter = oSheet.getCellByposition(2, 2)
dritter = oSheet.getCellByposition(2, 3)
vierter = oSheet.getCellByposition(2, 4)
fuenfter = oSheet.getCellByposition(2, 5)
sechster = oSheet.getCellByposition(2, 6)
siebter = oSheet.getCellByposition(2, 7)
achter = oSheet.getCellByposition(2, 8)
neunter = oSheet.getCellByposition(2, 9)
zehnter = oSheet.getCellByposition(2, 10)


print Entry (Count)                             'so funzt es
'erster.setvalue(Entry (Count))            'aber so net WARUM??
'zweiter.setvalue(Entry (Count))
'dritter.setvalue(Entry (Count))
'vierter.setvalue(Entry (Count))
'fuenfter.setvalue(Entry (Count))
'sechster.setvalue(Entry (Count))
'siebter.setvalue(Entry (Count))
'achter.setvalue(Entry (Count))
'neunter.setvalue(Entry (Count))
'zehnter.setvalue(Entry (Count))

Next Count
End Sub
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey LSH_Dackel,

hmm, nun gut. Schätze, es sind deine ersten Erfahrungen mit Makros (OOo Basic?). Der Code ist ein bischen "holbrig", aber wenn er funktioniert....

Zu deinem Problem: Leider schreibst due nicht genau, was du ausliest und "verwertest". Im Code sind Widersprüche, die möglicherweise dein Problem auslösen.

Code: Alles auswählen

Dim Entry(1 To 10) As String 
Hier erzeugst du ein Array mit 10 Elementen, welche nur Strings - also Texte - aufnehmen können. (Durch die Festlegung als String!)

Code: Alles auswählen

Entry(1) = Dackel.value    
Ansdererseits liest du hier - und in weiterer Folge - die Werte (also Zahlen!) aus der Zelle aus und weist sie dem Arrayelement zu. OOo wird jetzt die Zahlen in Strings umwandeln!

Code: Alles auswählen

print Entry (Count)      
Beim "Print" Befehl werden die Strings gedruckt - das unterscheidet sich nicht von Werten.

Code: Alles auswählen

erster.setvalue(Entry (Count)) 
Jetzt wiederum willst du dem Wert der Zelle einen String zuweisen... das funktioniert nicht.
Also, jetzt hast du mehrere Möglichkeiten:
1. Erzeuge das Array ohne dich auf einen bestimmten Typ festzulegen:

Code: Alles auswählen

Dim Entry(1 to 10)
Jetzt würden Werte gespeichert - und die kannst du auch wieder ausgeben.
2. Bei der Zuweisung der (sortierten) Werte wandelst du den Text erst wieder in einen Wert um - auch das sollte funktionieren:

Code: Alles auswählen

erster.setvalue(CInt(Entry (Count))) 
Jetzt wird der Ausdruck "Entry(Count)" in eine Integer-Zahl umgewandelt und kann setValue() dem Wert einer Zelle zugeordnet werden.
3. Brauchst du gar keine Werte in den Zellen, sondern reichen dir Texte, so kannst du natürlich auch direkt den Text mit "setString()" eingeben:

Code: Alles auswählen

erster.setstring(Entry (Count)) 
Das hängt hat davon ab, was du weiter damit machen willst.

Ich hoffe, es hilft erst einmal.

PS: Zur optimierung des Codes würde ich stärker mit Schleifen Arbeiten!
Beispiel: Einlesen der Werte: Schleife über einen Array der Tabellenblätter.
Schreiben der Zellen: Schleife über die Ausgabe:

Code: Alles auswählen

oSheet = oSheets.getByName("Bestenliste")
For Count = 1 To 10
  oSheet.getCellByposition(2, count).value = CInt(Entry (Count))
Next
   
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Beitrag von LSH_Dackel »

Thx Thomas
Tut mir Leid wegen der ungenauen Angabe ich meinte Zahlen.
Aber ich habe noch immer ein Problem. :(
Ich möchte das jeder Wert nach erster, zweiter, driter,...
sortiert und in die jeweilige Zelle eintragen wird (siehe erster Code von mir) aber es macht die Zahlen in einer Zelle durch und es steht nur der letzte Wert in der Zelle ,das hat ich aber schon mit der MIN bzw. MAX Formel aus OO Calc.
Es soll halt NUR die Werte in der Liste in die die jeweiligen zellen eintrag (erster "2,4" , zweiter "2,6", dritter "2,7" ,....)
Hilfe :([/b]
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey LSH_Dackel,
...jeder Wert nach erster, zweiter, driter,...
sortiert und in die jeweilige Zelle eintragen wird...
Na ja, an sich macht das dein Makro - der Bubble-Sort Algorithmus. Nur - auch hier: Programmiere sauber - sag, dass du Zahlen sortieren willst. Entweder den Array als "Double" definieren (du verwendest ja dezimalzahlen) oder die jeweiligen Ausdrücke in Zahlen umwandeln.

Hier die Kurzfassung deines Makros, die sollte funktionieren. Musst nur noch das Array mit den Tabellennamen entsprechend vervollständigen:

Code: Alles auswählen

Sub Bestenliste
	Dim Entry(1 To 10)
	Dim Count As Integer
	Dim Count2 As Integer
	Dim Temp As String 
	aTab = array("Dackel1", "Tetzi",...)  ' hier vervollständigen!
	for i=1 to 10
		Entry(i) = thisComponent.sheets.getSheetByName(aTab(i-1)).getCellByPosition(27,21).value
	next
		
	For Count = 1 To 10
		For Count2 = Count + 1 To 10
			If CDbl(Entry(Count)) > CDbl(Entry(Count2)) Then
				Temp = Entry(Count)
				Entry(Count) = Entry(Count2)
				Entry(Count2) = Temp

			End If
		Next Count2
	Next Count 

	oSheet = oSheets.getByName("Bestenliste")
	For Count = 1 To 10
	  oSheet.getCellByposition(2, count).value = CInt(Entry (Count))
	Next 
End Sub
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
LSH_Dackel
***
Beiträge: 53
Registriert: Do, 05.01.2006 17:40

Beitrag von LSH_Dackel »

Hey Toxitom du bist ein Gott ,jetzt funzt alles wie ich es wollte vielen Herzlichen Dank.... :D :P :D
Antworten