Makro mit Fehlermeldung

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

Moderator: Moderatoren

martin11
***
Beiträge: 98
Registriert: Do, 30.03.2017 16:07

Makro mit Fehlermeldung

Beitrag von martin11 » Mi, 09.10.2019 13:20

Das folgende Makro bringt eine Fehlermeldung.
Wie kann ich bearbeiten?
Wie ich jetzt entdeckt habe, könnte es daran liegen, dass manchmal noch keine Textrahmen angelegt wurden.

Code: Alles auswählen

Sub kopftexte
	oDoc=Thiscomponent
	'lösche alle alten Kopfrahmen
	oFrames=odoc.getTextFrames()
	for i=oframes.count-1 to 0 step -1
		if left(oFrames.getbyindex(i).name,10)="Kopfrahmen" then 'lösche alten Rahmen
			oDoc.Text.removeTextContent(oFrames.getbyindex(i))
		end if
	next
	'öffne Calc
	sUrl=Thiscomponent.getUrl()
	for k=1 to len(sUrl)
		if mid(sUrl,k,1)="/" then slash=k
		if mid(sUrl,k,1)="." then punkt=k
	next k
	sPfad=left(sUrl,slash)
	sCalc=sPfad & "Kopfzeilen_Texte_Breit.ods"
	Dim myFileProp() as new com.sun.star.beans.PropertyValue
	oCalcDoc = StarDesktop.loadComponentFromURL(sCalc, "_blank", 0, myFileProp() )
	'Auslesen der Informationen
	aTexte=oCalcDoc.Sheets(0).getCellRangeByname("A2:D100").getDataArray
	oCalcDoc.Close(false)
	oView=oDoc.getcurrentcontroller().getviewcursor()
	'gehe zur ersten Seite
	oView.jumptofirstpage()
	' Vorbereitung Tabulator im Textrahmen
	Dim tab(0) As New com.sun.star.style.TabStop
	tab(0).Alignment = com.sun.star.style.TabAlign.RIGHT
	'Linienstil für Textrahmen
	Dim oLinie0 as New com.sun.star.table.BorderLine
	Dim oLinie1 as New com.sun.star.table.BorderLine
	oLinie0.innerLineWidth=0
	oLinie0.outerLineWidth=0
	'Ermittlung des Seitenformats
	formatname=oView.PageDescName
	StyleFamilies = oDoc.StyleFamilies
    PageStyles = StyleFamilies.getByName("PageStyles")
    if isempty(formatname) then     
	    PageFormat = PageStyles.getByName("Standard")
	  else
	    PageFormat = PageStyles.getByName(formatname)
	end if
	'Ermittlung der Seitenbreite und -ränder
	s_breite=PageFormat.width
	randl=PageFormat.Leftmargin
	randr=PageFormat.rightmargin
	oView.jumptolastpage()
	'Anzahl der Seiten?
	n=oDoc.getcurrentcontroller().pageCount
	z=0	'Zähler für aktuelles Kopftextepaar
	'Durchlauf durch alle Seiten
	for i=1 to n
		'erzeuge textrahmen
		oFrame = oDoc.createInstance("com.sun.star.text.TextFrame")
		with oFrame
			.name="Kopfrahmen" & i
			.width = s_breite-randl-randr
			.height=500	'Hier wird die Höhe der Textfelder festgelegt 500=5mm
			.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
			.HoriOrient=0
			.HoriOrientrelation=7
			.HoriOrientPosition =randl	'wie linker Rand
			.VertOrient=0
			.VertOrientRelation=7
			.VertOrientPosition = 700	'Position von oben: 7 mm
			'Umrandung
			.rightBorder=oLinie0
			.leftBorder=oLinie0
			.topBorder=oLinie0
			.bottomBorder=oLinie0
			.LeftBorderDistance=0
			.RightBorderDistance=0
			.Surround=com.sun.star.text.WrapTextMode.THROUGH
		end with
		oDoc.Text.insertTextContent(oview, oFrame, FALSE) 'oTextC
		'setze Anker auf richtige Seite
		oFrame.AnchorPageNo=i
		'Schreibe Text in Rahmen
		oFrameCursor=oFrame.createTextCursor()
		oFrameCursor.ParaStyleName="_Gl_Kopf-8-links"
		If int(i/2)=i/2 Then 'linke Seite
			oFrameCursor.ParaStyleName="_Gl_Kopf-8-rechts"
		End If
		If i=1 or i=n Then
			oFrameCursor.ParaStyleName="_Gl_Kopf-8-zentriert"
		End If
		'Text aus Calctabelle entnehmen
		If i>aTexte(z)(2) then z=z+1
		If int(i/2)=i/2 Then 'gerade Seite
			sKopf=aTexte(z)(0)
		Else
			sKopf=aTexte(z)(3)
		End If
		oFrameCursor.String=sKopf
	Next
End Sub
Makro_Fehler.jpg
Makro_Fehler.jpg (23.02 KiB) 443 mal betrachtet

Stephan
********
Beiträge: 11233
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro mit Fehlermeldung

Beitrag von Stephan » Mi, 09.10.2019 14:18

ersetze im Code:

Code: Alles auswählen

	oFrames=odoc.getTextFrames()
	for i=oframes.count-1 to 0 step -1
		if left(oFrames.getbyindex(i).name,10)="Kopfrahmen" then 'lösche alten Rahmen
			oDoc.Text.removeTextContent(oFrames.getbyindex(i))
		end if
	next

durch:

Code: Alles auswählen

	If HasUnoInterfaces(oDoc, "com.sun.star.uno.XInterface") Then
		If oDoc.supportsService("com.sun.star.text.TextDocument") Then
			oFrames=odoc.getTextFrames()
			for i=oframes.count-1 to 0 step -1
				if left(oFrames.getbyindex(i).name,10)="Kopfrahmen" then 'lösche alten Rahmen
					oDoc.Text.removeTextContent(oFrames.getbyindex(i))
				end if
			next i
		End If
	End if

Gruß
Stephan

martin11
***
Beiträge: 98
Registriert: Do, 30.03.2017 16:07

Re: Makro mit Fehlermeldung

Beitrag von martin11 » Mi, 09.10.2019 14:59

jetzt kommt die Fehlermeldung En Sub fehlt.
Schreibe ich vor next end sub kommt außerhalb der Prozedur
Nehme ich next weg, kommt hier der Fehler

oView=oDoc.getcurrentcontroller().getviewcursor()
oder auch mal dieses
sUrl=Thiscomponent.getUrl()
Martin

mikeleb
******
Beiträge: 811
Registriert: Fr, 09.12.2011 16:50

Re: Makro mit Fehlermeldung

Beitrag von mikeleb » Mi, 09.10.2019 17:14

Hallo,
das Makro ist dazu gedacht auf eine odt-Datei (writer) angewendet zu werden.
Gruß,
mikeleb

martin11
***
Beiträge: 98
Registriert: Do, 30.03.2017 16:07

Re: Makro mit Fehlermeldung

Beitrag von martin11 » Mi, 09.10.2019 17:48

hallo Mikelib,
deinen Hinweis verstehe ich nicht.
Alles ist doch eine Writer Datei.
Würdest du mir schreiben, wo auf Faches verwiesen wird.
Martin

mikeleb
******
Beiträge: 811
Registriert: Fr, 09.12.2011 16:50

Re: Makro mit Fehlermeldung

Beitrag von mikeleb » Mi, 09.10.2019 21:37

Hallo,
wenn gerade eine Calc-Datei aktiv ist, wenn das Makto aufgerufen wird, versagt es.
Gruß,
mikeleb

Stephan
********
Beiträge: 11233
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro mit Fehlermeldung

Beitrag von Stephan » Mi, 09.10.2019 21:47

jetzt kommt die Fehlermeldung En Sub fehlt.
für mich nicht nachvollziehbar:

Code: Alles auswählen

Sub kopftexte
	oDoc=Thiscomponent
	'lösche alle alten Kopfrahmen
	If HasUnoInterfaces(oDoc, "com.sun.star.uno.XInterface") Then
		If oDoc.supportsService("com.sun.star.text.TextDocument") Then
			oFrames=odoc.getTextFrames()
			for i=oframes.count-1 to 0 step -1
				if left(oFrames.getbyindex(i).name,10)="Kopfrahmen" then 'lösche alten Rahmen
					oDoc.Text.removeTextContent(oFrames.getbyindex(i))
				end if
			next i
		End If
	End if

	'öffne Calc
	sUrl=Thiscomponent.getUrl()
	for k=1 to len(sUrl)
		if mid(sUrl,k,1)="/" then slash=k
		if mid(sUrl,k,1)="." then punkt=k
	next k
	sPfad=left(sUrl,slash)
	sCalc=sPfad & "Kopfzeilen_Texte_Breit.ods"
	Dim myFileProp() as new com.sun.star.beans.PropertyValue
	oCalcDoc = StarDesktop.loadComponentFromURL(sCalc, "_blank", 0, myFileProp() )
	'Auslesen der Informationen
	aTexte=oCalcDoc.Sheets(0).getCellRangeByname("A2:D100").getDataArray
	oCalcDoc.Close(false)
	oView=oDoc.getcurrentcontroller().getviewcursor()
	'gehe zur ersten Seite
	oView.jumptofirstpage()
	' Vorbereitung Tabulator im Textrahmen
	Dim tab(0) As New com.sun.star.style.TabStop
	tab(0).Alignment = com.sun.star.style.TabAlign.RIGHT
	'Linienstil für Textrahmen
	Dim oLinie0 as New com.sun.star.table.BorderLine
	Dim oLinie1 as New com.sun.star.table.BorderLine
	oLinie0.innerLineWidth=0
	oLinie0.outerLineWidth=0
	'Ermittlung des Seitenformats
	formatname=oView.PageDescName
	StyleFamilies = oDoc.StyleFamilies
    PageStyles = StyleFamilies.getByName("PageStyles")
    if isempty(formatname) then     
	    PageFormat = PageStyles.getByName("Standard")
	  else
	    PageFormat = PageStyles.getByName(formatname)
	end if
	'Ermittlung der Seitenbreite und -ränder
	s_breite=PageFormat.width
	randl=PageFormat.Leftmargin
	randr=PageFormat.rightmargin
	oView.jumptolastpage()
	'Anzahl der Seiten?
	n=oDoc.getcurrentcontroller().pageCount
	z=0	'Zähler für aktuelles Kopftextepaar
	'Durchlauf durch alle Seiten
	for i=1 to n
		'erzeuge textrahmen
		oFrame = oDoc.createInstance("com.sun.star.text.TextFrame")
		with oFrame
			.name="Kopfrahmen" & i
			.width = s_breite-randl-randr
			.height=500	'Hier wird die Höhe der Textfelder festgelegt 500=5mm
			.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
			.HoriOrient=0
			.HoriOrientrelation=7
			.HoriOrientPosition =randl	'wie linker Rand
			.VertOrient=0
			.VertOrientRelation=7
			.VertOrientPosition = 700	'Position von oben: 7 mm
			'Umrandung
			.rightBorder=oLinie0
			.leftBorder=oLinie0
			.topBorder=oLinie0
			.bottomBorder=oLinie0
			.LeftBorderDistance=0
			.RightBorderDistance=0
			.Surround=com.sun.star.text.WrapTextMode.THROUGH
		end with
		oDoc.Text.insertTextContent(oview, oFrame, FALSE) 'oTextC
		'setze Anker auf richtige Seite
		oFrame.AnchorPageNo=i
		'Schreibe Text in Rahmen
		oFrameCursor=oFrame.createTextCursor()
		oFrameCursor.ParaStyleName="_Gl_Kopf-8-links"
		If int(i/2)=i/2 Then 'linke Seite
			oFrameCursor.ParaStyleName="_Gl_Kopf-8-rechts"
		End If
		If i=1 or i=n Then
			oFrameCursor.ParaStyleName="_Gl_Kopf-8-zentriert"
		End If
		'Text aus Calctabelle entnehmen
		If i>aTexte(z)(2) then z=z+1
		If int(i/2)=i/2 Then 'gerade Seite
			sKopf=aTexte(z)(0)
		Else
			sKopf=aTexte(z)(3)
		End If
		oFrameCursor.String=sKopf
	Next
End Sub

Gruß
Stephan

Antworten