Macro kopiert Formel fehlerhaft

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Macro kopiert Formel fehlerhaft

Re: Macro kopiert Formel fehlerhaft

von theindless » So, 22.04.2012 13:26

Hallo Balu,

DANKE!!!!

Natürlich... deine Erklärungen sind sowas von logisch.

Ich werde das morgen mal ausprobieren (Macro ist im Betrieb).

Danke!

P.S.: Das auch Leute mit mehr Erfahrung das nicht auf den ersten Blick den Fehler finden beruhigt mich :-)

Re: Macro kopiert Formel fehlerhaft

von balu » So, 22.04.2012 12:29

Hallo theindless,

oooohhhhh mannoooo! Was für eine schwere Geburt das war um deinen Denkfehler rauszubekommen, erklär ich jetzt lieber nicht. Ich werd dir jetzt lieber deinen Denkfehler anhand deines Verfahrens- und/oder Ablauffehler vorführen.

Also, wenn ich das jetzt richtig sehe ist folgende Situation gegeben.
Tabellenblattindexnummer 0 = Übersicht. Spalte B ist dort der "Quellbereich". Spalte F ist dort der "Zielbereich" wohin die Daten aus dem Quellbereich kopiert werden.

Tabellenblattindexnummern 1 bis 4 sind deine 'Problemblätter'. -{Die anderen lassen wir nun mal außen vor.}- Dort, in den Blättern 1 bis 4, steht z.B. in D3 folgender Zellbezug.

Code: Alles auswählen

=Übersicht.B$3
Das ist die Ausgangssituation. Und nun knöpfen wir uns mal dein Makro vor, und zwar Blockweise.
1. Block

Code: Alles auswählen

For i = 1 to 4
   oSheet=oDoc.Sheets(i)
   myColumn=oSheet.getColumns
   myColumn.insertByIndex(7,1)
   oQuellRange = oSheet.GetCellRangeByPosition(3,0,3,100)
   oQuellRangeAdresse = oQuellRange.getRangeAddress
   oZiel = oSheet.getCellByPosition(7,0)
   oZielCellAdresse = oZiel.getCellAddress
   
   oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)
Next i
In Sheets(i) wird bei Spalte H (Index 7) eine zusätzliche Spalte eingefügt.
Nun wird der Zellbereich "D1:D101" -[GetCellRangeByPosition(3,0,3,100)]- nach "H1" -[GetCellRangeByPosition(7,0)]- kopiert. Macht also 4 Spalten nach Rechts.
Die Zelle D3, als Beispiel, mit dem Zellbezug =Übersicht.B$3 wird durch die Kopieraktion nach H3 kopiert. Und dabei passt sich der Zellbezug vollkommen korrekt zu =Übersicht.F$3 an.

Den 2. Block -[For i = 6 to 7]- überspringen wir.

3. Block

Code: Alles auswählen

oSheet=oDoc.Sheets(0)
myColumn=oSheet.getColumns
myColumn.insertByIndex(5,1)
oQuellRange = oSheet.GetCellRangeByPosition(1,0,1,100)
oQuellRangeAdresse = oQuellRange.getRangeAddress
oZiel = oSheet.getCellByPosition(5,0)
oZielCellAdresse = oZiel.getCellAddress
   
oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)
Jetzt befinden wir uns im Blatt Übersicht.
Bei der Spalte F (Index 5) wird jetzt eine weitere Spalte eingefügt.

H A L T ! ! ! S T O P ! ! !

Genau an dieser Stelle kommt es zu deinem eigentlichem Hauptproblem.
Und warum?
Ganz einfach!
Weil sich nämlich jetzt alle Zellbezüge in den anderen Tabellenblättern mit =Übersicht.F$3 automatisch zu =Übersicht.G$3 anpassen. Denn die Bezugszelle wird von einer Position zu einer anderen Position verschoben, und Calc passt dann automatisch die Zelladressierung an.

Also, deine Fehler sind:
  • Du kopierst erst Zellen mit einem bestimmten Zellbezug.
  • Dann verschiebst Du die Zellen auf die sich die vorher kopierten Zellen beziehen.
  • Du denkst, das die zu erst kopierten Zellen ihre Zelladressierung beibehalten, was aber einfach Falsch ist. Denn sie passen den Zellbezug automatisch an.
Jetzt kannst Du ja selber mal probieren ob es nicht vielleicht besser wäre erst den 3. Block abzuarbeiten, also die Aktionen im Blatt Übersicht durchzuführen, und danach dann die anderen Blöcke.

Ich hoffe Du hast alles verstanden.



Gruß
balu

Re: Macro kopiert Formel fehlerhaft

von balu » So, 22.04.2012 03:36

Hallo theindless,
Wenn ich aber in Calc die Formel "=Übersicht.B$3" in der Zelle D3 habe und in H3 kopiere, lautet diese "=Übersicht.F$3" (getestet!).
Das Macro kopiert auch von D3 nach H3, aber dann lautet die Formel in H3 "=Übersicht.F$3".
Sprichst Du hier von ein und demselben Tabellenblatt?
Bedenke, und das spielt widerum eine extrem wichtige Rolle, das Absolute und Relative Adressierung auch für die Tabellenblätter gilt!!

Was hälst Du denn vom folgenden geänderten Code? Ist nur ein Vorschlag.

Code: Alles auswählen

Public odoc as object, oSheet as object
Public anf as integer, ende as integer, idx1 as integer, idx2 as integer
Public sBereich as string, sZielAddy as string
'*****************************************************************************
Sub Main
oDoc=ThisComponent

anf = 1
ende = 4
idx1 = 7
idx2 = 1
sBereich = "D1:D101"
sZielAddy = "H1"
kopieren
'
anf = 6
ende = 7
idx1 = 7
idx2 = 1
sBereich = "D1:D101"
sZielAddy = "H1"
kopieren
'
anf = 0
ende = 0
idx1 = 5
idx2 = 1
sBereich = "B1:B101"
sZielAddy = "F1"
kopieren
'
anf = 5
ende = 5
idx1 = 7
idx2 = 1
sBereich = "G32:G101"
sZielAddy = "H32"
kopieren
'
end sub
'*****************************************************************************
Sub kopieren
For i = anf to ende
   oSheet=oDoc.Sheets(i)
   myColumn=oSheet.getColumns
   myColumn.insertByIndex(idx1,idx2)
   oQuellRange = oSheet.getCellRangeByName(sBereich)
   oQuellRangeAdresse = oQuellRange.getRangeAddress
   oZiel = oSheet.getCellRangeByName(sZielAddy)
   oZielCellAdresse = oZiel.getCellAddress   
   oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)
Next i
End Sub

Gruß
balu

Re: Macro kopiert Formel fehlerhaft

von Karolus » So, 22.04.2012 02:40

Hallo
@theindless:
Was genau verstehst du nicht an http://www.ooowiki.de/AbsoluteAdresse

?
Karo

Re: Macro kopiert Formel fehlerhaft

von theindless » Sa, 21.04.2012 23:28

Hallo balu,

erstmal danke für den Hinweis mit getCellRangeByName.

Das mit der Adressierung ist mir allerdings ein Rätsel.
Ich dachte schon, dass es wie normales kopieren funktioniert.

Wenn ich aber in Calc die Formel "=Übersicht.B$3" in der Zelle D3 habe und in H3 kopiere, lautet diese "=Übersicht.F$3" (getestet!).
Das Macro kopiert auch von D3 nach H3, aber dann lautet die Formel in H3 "=Übersicht.F$3".

Genau das verstehe ich ja nicht!

Re: Macro kopiert Formel fehlerhaft

von balu » Sa, 21.04.2012 20:47

Hallo theindless,
Nachdem sowohl im Blatt "Übersicht" als auch in den weiteren Blättern die Daten des Vor-Quartals um 4 Spalten nach rechts kopiert werden, müsste doch eigentlich die Formel weiter funktionieren, oder?
Die Formel funktioniert doch, nur die Adressierung hat sich wegen Copy&Paste geändert. Und ich glaube Du hast wohl noch Verständigungsprobleme mit der
Absoluten und relativen Adressierung. Ja, das spielt auch in diesem Falle ein bedeutende Rolle! Denn es heißt ja nicht, das durch die Kopieraktion mittels Makro andere Gesetze gelten, als wenn Du von Hand kopierst. Also musst Du gleich im Vorfeld dafür sorgen das sich die Zellbezüge nicht ändern, sprich, Du musst die Formeln dementsprechend anpassen.

Aber eine Frage hab ich dazu noch.
Musst Du überhaupt die Formeln mitkopieren, oder wäre es nicht vielleicht besser wenn Du nur die Werte ohne Formeln kopierst?


Jetzt was anderes.
Es ist wohl jedem selber überlassen wie im Makro die Zellen/Zellbereiche angesprochen werden, aber wäre es nicht vorteilhafter wenn man sich das Leben etwas leichter macht?
Also anstatt

Code: Alles auswählen

GetCellRangeByPosition(1,0,1,100)
dann halt einfach

Code: Alles auswählen

getCellRangeByName("B1:B101")
Der Vorteil liegt ja darin, das man sich nicht so schnell verzählen kann. Natürlich kann man es sich nicht in allen Situationen so einfach machen, aber wenn möglich dann doch lieber einfach.
Ist ja nur so eine Idee.



Gruß
balu

Re: Macro kopiert Formel fehlerhaft

von theindless » Sa, 21.04.2012 13:25

Keiner eine Idee?

Macro kopiert Formel fehlerhaft

von theindless » Do, 19.04.2012 15:09

Hallo,

ich habe folgendes Macro geschrieben:

Code: Alles auswählen

oDoc=ThisComponent

For i = 1 to 4
	oSheet=oDoc.Sheets(i)
	myColumn=oSheet.getColumns
	myColumn.insertByIndex(7,1)
	oQuellRange = oSheet.GetCellRangeByPosition(3,0,3,100)
	oQuellRangeAdresse = oQuellRange.getRangeAddress
	oZiel = oSheet.getCellByPosition(7,0)
	oZielCellAdresse = oZiel.getCellAddress
	
	oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)
Next i

For i = 6 to 7
	oSheet=oDoc.Sheets(i)
	myColumn=oSheet.getColumns
	myColumn.insertByIndex(7,1)
	oQuellRange = oSheet.GetCellRangeByPosition(3,0,3,100)
	oQuellRangeAdresse = oQuellRange.getRangeAddress
	oZiel = oSheet.getCellByPosition(7,0)
	oZielCellAdresse = oZiel.getCellAddress
	
	oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)
Next i

oSheet=oDoc.Sheets(0)
myColumn=oSheet.getColumns
myColumn.insertByIndex(5,1)
oQuellRange = oSheet.GetCellRangeByPosition(1,0,1,100)
oQuellRangeAdresse = oQuellRange.getRangeAddress
oZiel = oSheet.getCellByPosition(5,0)
oZielCellAdresse = oZiel.getCellAddress
	
oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)

oSheet=oDoc.Sheets(5)
myColumn=oSheet.getColumns
myColumn.insertByIndex(7,1)
oQuellRange = oSheet.GetCellRangeByPosition(6,31,6,100)
oQuellRangeAdresse = oQuellRange.getRangeAddress
oZiel = oSheet.getCellByPosition(7,31)
oZielCellAdresse = oZiel.getCellAddress
	
oSheet.copyRange(oZielCellAdresse,oQuellRangeAdresse)


End Sub
Es handelt sich um eine Aufstellung, welche jedes Quartal zum Ultimo (also 30.03., 30.06., 30.09. und 30.12.) erstellt wird.
Zuerst soll bei den Blättern 1-4 und 6-7 in Spalte H eine neue Spalte (bei den anderen Blätter an anderer Stelle) eingefügt werden.
Die Daten des Vor-Quartals, welche in Spalte D stehen, sollen dann in Spalte H kopiert werden.
Das klappt soweit auch sehr gut, mit einer Ausnahme:

Im Arbeitsblatt 0 ("Übersicht")ist das aktuelle Quartal in der Spalte B hinterlegt.
Über den separaten Teil des Macros wird hier in Spalte F (also 4 Spalten nach rechts) eine Spalte eingefügt und die Daten aus Spalte B werden nach F kopiert.
In der Zelle B3 (bzw. F3 nach kopieren) steht immer der aktuelle Stichtag.
Diese Zelle ist auch in den anderen Blättern in den Zellen D3 (bzw. H3 nach kopieren) verformelt über +Übersicht.B$3.

Nachdem sowohl im Blatt "Übersicht" als auch in den weiteren Blättern die Daten des Vor-Quartals um 4 Spalten nach rechts kopiert werden, müsste doch eigentlich die Formel weiter funktionieren, oder?
Tatsächlich jedoch lautet die Formel in den Blättern 1-4 und 6-7 nach kopieren "+Übersicht.G$3", so dass der falsche Stichtag übernommen wird.

Nach oben