Zellbereiche ausfüllen

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

Moderator: Moderatoren

frank33649
Beiträge: 9
Registriert: Di, 21.11.2006 01:21

Zellbereiche ausfüllen

Beitrag von frank33649 »

Hallo,
ich habe mal versucht, mein in einem anderen Thread gestelltes Problem zu lösen, komme da aber nicht Recht weiter. Ich bin jetzt soweit, dass ich einen Block von Zellen (AnzahlZellenMinute = 120) mit einem Wert aus einer Spalte D ausfülllt. Nun möchte ich aber, dass wenn ich in der Do-Schleife den Wert erhöhe im nächsten Block einen anderen Wert aus Spalte D nimmt und diesen in den Block schreibt usw. Kann mir da jemand einen Tip geben. Zur Info: Ein Messgerät greift immer auf insgesamt 6000 Zellen zu, wobei Blöcke in Abhängigkeit von der Messzeit gebildet werden. Je länger die Zeit, desto geringer die Blockgröße pro Messung.

Code: Alles auswählen

sub Lichtfile

myDoc = thisComponent
mysheet = myDoc.sheets().getByName("Lichtdatei")
mysheet1 = myDoc.sheets().getByName("Messung")

Dim k as Integer

AnzahlZellenMinute = mysheet1.getCellRangeByName("$C$13").value

k = 1

Do

	For i = k to k + AnzahlZellenMinute -1

		mysheet.getCellRangeByName("a"& i).value = Volt
		Volt =  mysheet.getCellRangeByName("d"& 3).value

	Next i

k = k + AnzahlZellenMinute

Loop While k < 100

end sub
Vielen Dank

Frank
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Frank,

alos - so ganz verstehe ich deine Aufgabenstellung nicht. Etwas aber fällt mir auf:

Code: Alles auswählen

     mysheet.getCellRangeByName("a"& i).value = Volt
      Volt =  mysheet.getCellRangeByName("d"& 3).value 
die erste Zeile sollte direkt zum fehler führen, da "Volt" noch nicht definiert ist. Das geschieht ja erst in der zweiten Zeile - und somit steht "Volt" erst im zweiten Schleifendurchgang zur Verfügung. Wahrscheinlich musst du diese Zeilen einfach rumdrehen.
Wenn du nun bei jedem Schleifendurchgang einen anderen Wert ausd der Spalte "D" haben willst, musst du halt auch den Zeilenwert (bei dir "3" variabel gestalten, also Zum Beispiel "3+i".
Sollte das zufällig geschehen, so musst du halt eine Zufallszahl erzeugen und diese dann nehmen - aber da weiss ich nicht genau, was du willst.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
frank33649
Beiträge: 9
Registriert: Di, 21.11.2006 01:21

Beitrag von frank33649 »

Danke Thomas,
aber der Code läuft so auch durch. Vertauscht eben auch, mit dem gleichen Ergebnis. Nochmal zum Problem:
Ich berechne auf dem Arbeitsblatt Messung die Blockgröße (hier 120 zusammenhängende Zellen) In diesem Block soll er mir den Wert aus D3 hineinschreiben. (Soweit so gut, dass klappt) Jetzt soll das Makro die nächsten 120 Zellen nehmen und dort den Wert aus D4 reinschreiben usw...
Das D3 derzeit konstant ist liegt daran, dass ich erstmal testen will. Am Ende soll dort eine Schleife stehen, die Werte von D1 bis D10 oder so durchläuft. Dabei ist die Schleifengröße D1 bis Dx von der Anzahl Blöcke abhängig. In dem jetzigen Fall gäbe es 6000/120 = 50 verschiedene Werte in D1 bis D50, wobei jeder 120 mal in A stehen soll (A1-A120 -> A121-A240 ... usw.). Ich hoffe das war jetzt verständlicher.

Mein Problem ist jetzt, dass ich bis A120 mit Wert D3 komme, aber die Schleife dann nicht in den nächsten Block A121-A240 springt und dort D4 (oder zum Testen D3) einträgt. Was mache ich falsch??

Viele Grüße

Frank
frank33649
Beiträge: 9
Registriert: Di, 21.11.2006 01:21

Fast die Lösung

Beitrag von frank33649 »

Hallo nochmal,
jetzt habe ich fast die Lösung

Code: Alles auswählen

sub Lichtfile

myDoc = thisComponent
mysheet = myDoc.sheets().getByName("Lichtdatei")
mysheet1 = myDoc.sheets().getByName("Messung")

Dim k as Integer

AnzahlZellenMinute = mysheet1.getCellRangeByName("$C$13").value

k = 1
For j = 1 to 51
Volt =  mysheet.getCellRangeByName("d"& j).value

Do

	For i = k to k + AnzahlZellenMinute -1
		mysheet.getCellRangeByName("a"& i).value = Volt
	Next i	

k = k + AnzahlZellenMinute

Loop While k < 120 
next j
end sub
Nun durchläuft das Makro jeweils 120 Zellen in Spalte A und trägt dort den entsprechenden Wert aus dem Bereich D1:D50 ein. Aber normalerweise sollte die Loop Bedingung doch für einen Abbruch sorgen, wenn wie im Beispiel k < 120 wird. Also sollte eigentlich doch nur ein Block von 120 Zellen durchlaufen werden und dort der Wert aus B1 eingetragen werden. Leider läuft das Makro solange durch bis B51 erreicht wurde also bis Zelle A6120.
Kann mir dazu jemand etwas sagen???

Danke Frank
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Frank,

es empfiehlt sich anzugewöhnen, Schleifen einzurücken - dann wird es übersichtlicher.
Nun zu deiner letzten Frage:
Das Makro verhält sich korrekt, es sind ja drei ineinander verschachtelte Schleifen:

Code: Alles auswählen

for  j = 1 to 51
    Do 
          for  i =....
               ....
          next i
     loop  while k < 120
next j
Im Extremfall durchläufst du also Range1 (j) * Range2 (k) * Range3 (i) Runden, also das könnte schon passen (51 * 120 = 6120).

Was steht denn in "AnzahlZellenMinute"? 1 ? Dann wäre der Wert korrekt.

Deine Abbruchbedingung der Loop-Schleife heissst übrigens nicht
einen Abbruch sorgen, wenn wie im Beispiel k < 120 wird
sondern: "Abbruch, sobald k > oder = 120 wird - es werden also mindestens 120 Durchläufe gestartet, bei AnzahlZellenMinute = 1.
Im Übrigen solltest du für diesen Zweck keine "Endlosschleife" (Do...loop" ) wählen, sondern ebenfalls eine "For-Schleife". Dannkannst du exakter steuern. Eine Loop-Schleife ist hier gar nicht nötig und birgt nur unnötiges Fehlerpotential :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
frank33649
Beiträge: 9
Registriert: Di, 21.11.2006 01:21

Beitrag von frank33649 »

Hi,
nochmals Danke. Das mit dem Einrücken werde ich beherzigen, hast ja Recht.
In AnzahlZellenMinute steht die jeweilige Blockgröße, also in wieviele Zellen der Wert von D(j) untereinander geschrieben wird. Wenn dort 1 drin steht, schreibt das Makro die Werte aus D(1) - D(irgendwas) jeweils in A(1)-A(irgendwas) untereinander. Wenn AnzahlZellenMinute 2 ist, dann schreibt es jeden Wert aus (D1)-(Dirgendwas) zweimal in A, d. h. A(1) und A(2) = (D1); A(3) und A(4) = D(2).......

Mir ist nun aber aufgefallen, dass das ganze auch funktioniert, wenn loop while k < 1 ist. Irgendwie sehe ich da im Moment nicht durch.

Wie würde man das Ganze denn mit einer weiteren for-Schleife realisieren. Ich hab das bisher noch nicht hingekriegt :( .

Viele Grüße

Frank
Antworten