Seite 1 von 1
Zellbereiche ausfüllen
Verfasst: So, 26.11.2006 13:48
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
Verfasst: So, 26.11.2006 14:16
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
Verfasst: So, 26.11.2006 14:39
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
Fast die Lösung
Verfasst: So, 26.11.2006 16:01
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
Verfasst: Mo, 27.11.2006 08:51
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
Verfasst: Mo, 27.11.2006 19:05
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