BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das OpenOffice Forum zu erhalten!

DANKE >><< DANKE

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des OpenOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 🤗

Calc-Makro Bastelhilfe

Alles zur Programmierung im OpenOffice.org
Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Fr 29. Apr 2022, 21:02

Hallo,

ok, mit dieser Info (die ich mir tatsächlich selbst hätte erklären können, aber ich hatte halt 'n Brett vor'm Kopf), hab ich das repariert und es klappt wie gewünscht.

Einen Fehler bekomme ich aber immer noch, jetzt in der letzten Zeile

Code: Alles auswählen

oQuellDocument.close
nämlich:

Code: Alles auswählen

Message: arguments len differ!.
Dementsprechend bleibt auch das Originaldokument offen.

Nächste (und letzte) Frage: wenn ich jetzt mit Blatt1 fertig bin, möchte ich auf Blatt2 mit anderen Feldern, aber nach dem gleichen Prinzip weitermachen.
Was vom Makro muss ich dafür (unterhalb von "Next"?) kopieren? Meine Tests ergeben (erwartungsgemäß) Fehler...
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Sa 30. Apr 2022, 11:03

Hallo,
ja da fehlte ein Parameter

Code: Alles auswählen

oQuellDocument.close(false)
wenn ich jetzt mit Blatt1 fertig bin, möchte ich auf Blatt2 mit anderen Feldern, aber nach dem gleichen Prinzip weitermachen.
Sinnvoll erscheint mir, eine Schleife über alle gewünschten Tabellen laufen zu lassen. (wenn es nur zwei Tabellen sind, dann kann man natürlich auch das bisherige Makro doppeln.
Wie genau sind die Dateien aufgebaut? Magst du sie hier (ggf. anonymisiert) hochladen?
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Sa 30. Apr 2022, 14:01

Hallo,

zwar bin ich mir nicht ganz sicher, was du mit Schleife meinst, aber ich denke, das wird eher schwierig. Es sind 14 Blätter, die ich über das Makro abgrasen möchte und jeweils "nur" die gelben Felder.

Mir reicht es vollkommen zu wissen, wie ich weitere Blätter (und dortige Felder) ergänze, da das vermutlich doch noch einige Arbeit sein wird.

Da die Datei zu groß ist, musste ich einige Blätter rausschmeißen, aber ich denke, du verstehst trotzdem, was ich meine. Natürlich werden da jetzt überall Fehler angezeigt, weil die Verweise fehlen, aber das ist ja egal.
Zuletzt geändert von Xaiorn am Sa 30. Apr 2022, 19:12, insgesamt 1-mal geändert.
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Sa 30. Apr 2022, 17:32

Hallo,
in der Annahme, dass der Dateiname der zu öffnenden Datei immer in Held.FA9 steht und beide Dateien denselben Aufbau (Tabellennamen) haben sollte folgende Variante funktionieren:

Code: Alles auswählen

Sub Main
	'Zugriff auf dieses Dokument
	oDoc=ThisComponent
	'Auslesen des Dateinamens für den Datenimport
	url=convertToUrl(oDoc.Sheets.getByName("Held").getCellRangeByName("FA9").String)
	'Öffnen der Quelldatei, versteckt
	Dim myFileProp(0) as New com.sun.star.beans.PropertyValue
	myFileProp(0).name="Hidden"
	myFileProp(0).value=true 'für die praktische Arbeit kann später True gesetzt werden, um die Datei versteckt zu öffnen
	oQuellDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )
	'Erfassen der Zellbereiche, die Importiert werden sollen
	'als Array von Arrays: für jede Tabelle ein Array
	'das erste Element des Arrays gibt den Tabellennamen an
	'da es eigentlich eine extrem lange Zeile wird, muss am Ende jeder Array-Zeile nach dem Komma ein Unterstich gesetzt werden
	aZellen=Array(_
		Array("Held", "EL3:EL51", "AE3:AE15", "AH1", "B17"),_
		Array("Fähigkeiten", "O16:P31"),_
		)	'Ende des Arrays
	For k=0 to ubound(aZellen)
		'Zugriff auf die Tabelle in Zieldatei 
		oZiel=oDoc.Sheets.getByName(aZellen(k)(0))
		oQuelle=oQuellDocument.Sheets.getByName(aZellen(k)(0))
		'Durchlauf durch alle Bereiche
		For i=1 to ubound(aZellen(k))
			oZiel.getCellRangeByName(aZellen(k)(i)).setDataArray(oQuelle.getCellRangeByName(aZellen(k)(i)).getDataArray)
		Next
	Next
	'Schließen des Quelldokuments
	oQuellDocument.close (false)
    
End Sub
In dem Array aZellen legts du fest, welche Tabellen und welche Bereiche importiert werden sollen.
Wenn es allerdings so ist, wie du abgedeutet hast, könnte folgendes Makro noch effektiver sein:

Code: Alles auswählen

Sub Main2
	'Zugriff auf dieses Dokument
	oDoc=ThisComponent
	'Auslesen des Dateinamens für den Datenimport
	url=convertToUrl(oDoc.Sheets.getByName("Held").getCellRangeByName("FA9").String)
	'Öffnen der Quelldatei, versteckt
	Dim myFileProp(0) as New com.sun.star.beans.PropertyValue
	myFileProp(0).name="Hidden"
	myFileProp(0).value=true 'für die praktische Arbeit kann später True gesetzt werden, um die Datei versteckt zu öffnen
	oQuellDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )

	'Durchlauf durch alle Tabellen
	For k=0 to oDoc.Sheets.Count-1
		'Zugriff auf die Tabelle in Zieldatei 
		oZiel=oDoc.Sheets(k)
		oQuelle=oQuellDocument.Sheets(k)
		'Liste aller Bereiche mit gleicher Formatierung
		obereiche=oZiel.getCellFormatRanges
		'Durchlauf durch alle Bereiche
		For i=0 to obereiche.count-1
			oBereich=obereiche.getbyindex(i)
			'Prüfen, ob Hntergrund gelb und nicht gesperrt
			if obereich.CellBackColor=16777113 and obereich.CellProtection.islocked=False then
				oBereich.setDataArray(oQuelle.getCellRangeByName(oBereich.AbsoluteName).getDataArray)
			end if
		Next
	Next
	'Schließen des Quelldokuments
	oQuellDocument.close (false)
    
End Sub

Hier werden alle Tabellen durchlaufen und in jeder Tabelle die Zellbereiche gesucht, deren Hintergrund gelb ist und die nicht gesperrt sind. In diese werden dann die Daten der anderen Datei importiert.
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Sa 30. Apr 2022, 19:11

Hi,

ja, das 2. Makro klappt, macht genau, was es soll und muss nichtmals angepasst werden, wenn ich noch was ändere (und mich an die Formatierung halte).

Das ist super!
Vielen lieben Dank!
Gruß,
Xaiorn

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » So 1. Mai 2022, 16:32

... und da bin ich wieder.

Beim Test in der kompletten Datei bekomme ich immer den Fehler

Code: Alles auswählen

Unzulässiger Wert oder Datentyp.
Index außerhalb des definierten Bereichs.
In der Befehlszeile

Code: Alles auswählen

oQuelle=oQuellDocument.Sheets(k)
Woran genau er sich verschluckt, kann ich nicht sagen, es sieht aus, als wären alle Werte übertragen. Kommt das Makro evtl. nicht mit Blättern klar, in denen keine gelben, ungeschützten Felder sind, also in denen nichts zu tun ist?

Mir ist aufgefallen, dass Kommentare an den zu befüllenden Feldern gelöscht werden. Kann man die mit kopieren oder schützen?
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » So 1. Mai 2022, 20:24

Hallo,
die Fehlermeldung kann ich mir nur so erklären, dass beide Dokumenten eine unterschiedliche Anzahl an Tabellen enthalten.
Die Kommentare sind ein echtes Problem. Aktuell sehe ich die Option, alle Kommentare der Tabelle auszulesen und nach der Übernahme der Werte wieder neu zu setzen.
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » So 1. Mai 2022, 20:59

Ja, du hast Recht, was das Blatt angeht; meine Test Quelldatei war alt, darauf habe ich nicht geachtet und da fehlte wirklich ein Blatt.

Die Idee mit den Kommentaren finde ich sehr gut. Wie sähe das aus und wo sollte das sinnvollerweise hin (ich vermute vor dem Kopieren das Auslesen und danach wieder drüber legen)?
Gruß,
Xaiorn

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Fr 6. Mai 2022, 18:56

Hi zusammen,

ist das Übernehmen der Kommentare doch komplizierter als gedacht?

Der Punkt ist mir noch recht wichtig, dann geb' ich auch Ruhe ;)
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » So 8. Mai 2022, 16:50

Hallo,
kompliziert nicht, aber es ist nicht immer die Zeit da...
Ich glaube es ist einfacher die Kommentare nicht anzufassen, sondern den Zellinhalt einzeln zu übernehmen. Dabei muss jedoch unterschieden werden, ob es sich um Texte oder Wert (oder Formeln) handelt. Daher geht es nicht so einfach per .getDataArray und .setDataArray

Code: Alles auswählen

Sub Main2
	'Zugriff auf dieses Dokument
	oDoc=ThisComponent
	'Auslesen des Dateinamens für den Datenimport
	url=convertToUrl(oDoc.Sheets.getByName("Held").getCellRangeByName("FA9").String)
	'Öffnen der Quelldatei, versteckt
	Dim myFileProp(0) as New com.sun.star.beans.PropertyValue
	myFileProp(0).name="Hidden"
	myFileProp(0).value=true 'für die praktische Arbeit kann später True gesetzt werden, um die Datei versteckt zu öffnen
	oQuellDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )

	'Durchlauf durch alle Tabellen
	For k=0 to oDoc.Sheets.Count-1
		'Zugriff auf die Tabelle in Zieldatei 
		oZiel=oDoc.Sheets(k)
		oQuelle=oQuellDocument.Sheets(k)
		obereiche=oZiel.getCellFormatRanges
		'Durchlauf durch alle Bereiche
		For i=0 to obereiche.count-1
			oBereich=obereiche.getbyindex(i)
			'Prüfen, ob Hintergrund gelb und nicht gesperrt
			if obereich.CellBackColor=16777113 and obereich.CellProtection.islocked=False then
				'alle Zellen einzeln ansprechen
				for spalte=obereich.RangeAddress.StartColumn to obereich.RangeAddress.EndColumn
					for zeile=obereich.RangeAddress.StartRow to obereich.RangeAddress.EndRow
						ozelle=oZiel.getCellByPosition(spalte,zeile)'obereich.getcellbyposition(spalte, zeile)
						'je nach Zelltype Wert, Text oder Formel übernehmen
						select case ozelle.type
							Case com.sun.star.table.CellContentType.VALUE
								ozelle.Value=oQuelle.getCellByPosition(spalte,zeile).Value
							Case com.sun.star.table.CellContentType.TEXT
								ozelle.String=oQuelle.getCellByPosition(spalte,zeile).String
							Case com.sun.star.table.CellContentType.FORMULA
								ozelle.Formula=oQuelle.getCellByPosition(spalte,zeile).Formula
						end select
					next
				next
			end if
		Next
	Next
	'Schließen des Quelldokuments
	oQuellDocument.close (false)
    
End Sub
Probier' mal, ob es macht was es soll.
Gruß,
mikele

Antworten