[Gelöst] Laufzeitfehler nach Verlagerung in Subroutine

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

Moderator: Moderatoren

peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

[Gelöst] Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Hallo!
Den folgenden Code eines umfangreicheren Makros in LibreOffice habe ich zur Vereinfachung in eine Subroutine gepackt:

Code: Alles auswählen

Sub Formatieren (oSheet)
Dim oCell As Object

oCell = oSheet.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX

oCell.CharFontName="Cambria"
oCell.CharHeight="15"
oSheet.Columns(0).Width="7200"
oSheet.Columns(0).VertJustify=com.sun.star.table.CellVertJustify.CENTER
oSheet.Columns(1).Width="6000"
oSheet.Columns(1).VertJustify=com.sun.star.table.CellVertJustify.CENTER
oSheet.Columns(2).Width="1200"
oSheet.Columns(2).VertJustify=com.sun.star.table.CellVertJustify.CENTER
oSheet.Columns(3).CharHeight=10
oSheet.Columns(3).Width="3000"
oSheet.Columns(4).Width="12000"


For N=2 To 50
    oSheet.Rows(N).Height="1300"
Next N
End Sub
Lief vorher im Hauptprogramm einwandfrei, jetzt im Unterprogramm kommt in der Zeile XXXXX die Fehlermeldung "BASIC Laufzeitfehler Argument nicht optional"

Bin ratlos, vorher kein Fehler, jetzt aber weil....???

VG
peter
Zuletzt geändert von peter999999 am Fr, 20.10.2023 15:23, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7442
Registriert: Mo, 02.01.2006 19:48

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von Karolus »

peter999999 hat geschrieben: Di, 17.10.2023 22:16 Lief vorher im Hauptprogramm einwandfrei, jetzt im Unterprogramm kommt in der Zeile XXXXX die Fehlermeldung "BASIC Laufzeitfehler Argument nicht optional"

Bin ratlos, vorher kein Fehler, jetzt aber weil....???

VG
peter
Weil du im »Hauptprogramm« einfach

Code: Alles auswählen

…
formatieren
…
ohne Argument aufrufst?!!

Im übrigen ist »oCell« ein schlechter Name für einen Zellbereich, die literalen Zahlenwerte müssen nicht in Anführungszeichen gesetzt werden, und die for-Schleife am Ende kannst du ersetzen durch:

Code: Alles auswählen

oSheet.getCellRangeByPosition(0, 2, 0, 50).Rows.Height = 1300
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Hi!

Danke für die Tipps!
Der Aufruf ist aber ok:

Code: Alles auswählen

...
REM 	oSheetx.Rows(N).Height="1300"
REM Next N


BildEinfuegen(oSheetx)
Formatieren(oSheetx)

oDoc2 = StarDesktop.loadComponentFromUrl("private:factory/scalc", "_blank", 0, Args())
oDoc2.StoreAsURL("file:///I:/Bereich2.ods", noArgs())
...

VG
peter
Karolus
********
Beiträge: 7442
Registriert: Mo, 02.01.2006 19:48

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von Karolus »

peter999999 hat geschrieben: Mi, 18.10.2023 11:22 Der Aufruf ist aber ok:
...
BASIC ist aber anderer Meinung!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Tell me more ! 🤔

Außerdem tritt der Fehler in folgender Zeile auf:

Code: Alles auswählen

oCell = oSheet.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
Exakt bder selbe Code funktioniert innerhalb des Hauptprogramms einwadndfrei!

Thx
peter
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von mikeleb »

Hallo,
da bleibt die Frage, was sich hinter der Variablen oSheet verbirgt.
Dazu wäre hilfreich, nicht nur das Unterprogramm zu kennen, sondern auch die aufrufende Routine. Sind die Variablen ggf. global definiert?

Code: Alles auswählen

.getCellRangeByPosition(0, 0, 3, 50)
verlangt nach 4 Parametern, die da sind. Also muss es an oSheet liegen ...
Gruß,
mikeleb
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von mikeleb »

Hallo,
anbei mal ein minimale Testdatei.
Der von dir beschrieben Fehler taucht bei mir (natürlich auch) auf, wenn ich versuche die Sub formatieren direkt aufzurufen.
Dateianhänge
minitest_makro.ods
(8.03 KiB) 62-mal heruntergeladen
Gruß,
mikeleb
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Ja, danke1 Und wenn ich den selbven Aufruf nach oben in das Hauptprogramm verlege läuft es.

Code: Alles auswählen

Sub Main
	odoc=thiscomponent
	otab=odoc.Sheets(0)
oCell = otab.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
End Sub

Sub Formatieren (oSheet)
	Dim oCell As Object
	oCell = oSheet.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
end sub
Aber warum???
Karolus
********
Beiträge: 7442
Registriert: Mo, 02.01.2006 19:48

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von Karolus »

Hallo
Aber warum
Falls du »formatieren« direkt in der BASIC-ide aufrufst, rufst du die Routine OHNE ARGUMENTE AUF
Du musst die schon aus der Hauptroutine heraus mit dem gewünschten Argument aufrufen
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Hallo!
Irgendwie verstehe ich jetzt nicht, was du meinst. ich habe mit deiner Testtdatei jetzt zwei Durchläufe gemacht, gestartet wird natürlich immer Sub MAIN:

der hier funktioniert:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
	odoc=thiscomponent
	otab=odoc.Sheets(0)
oCell = otab.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
REM Formatieren(otab)
MsgBox "Fertig!"
End Sub

REM Sub Formatieren (oSheet)
REM	Dim oCell As Object
REM MsgBox "Hier bin ich!"
REM	oCell = oSheet.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
REM end sub

... und der hier nicht, der Laufzeitfehler tritt nach der Dialogbox "Hier bin ich!" auf:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
	odoc=thiscomponent
	otab=odoc.Sheets(0)
oCell = otab.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
Formatieren(otab)
MsgBox "Fertig!"
End Sub

Sub Formatieren (oSheet)
Dim oCell As Object
MsgBox "Hier bin ich!"
oCell = oSheet.getCellRangeByPosition(0, 0, 3, 50) 'XXXXX
end sub

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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von mikeleb »

Hallo,
den Fehler kann ich nicht nachvollziehen. Bei mir laufen beide Varianten fehlerfrei.
Mit welchem System/Programm/Version arbeitest du?
Gruß,
mikeleb
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Version: 7.4.1.2 (x64) / LibreOffice Community
Build ID: 3c58a8f3a960df8bc8fd77b461821e42c061c5f0
CPU threads: 8; OS: Windows 10.0 Build 19045; UI render: Skia/Raster; VCL: win
Locale: de-DE (de_DE); UI: de-DE
Calc: CL
peter999999
Beiträge: 7
Registriert: Di, 17.10.2023 21:29

Re: Laufzeitfehler nach Verlagerung in Subroutine

Beitrag von peter999999 »

Heureka! 😀

Ich habe jetzt mal sämtliche Libreofficedateien, die noch offen waren, geschlossen und nur die Datei mit dem Makro geöffnet: Es rennt jetzt!

Die Ursache war, dass ich irgendwann mal das XrayTool mal zum Test geöffnet hatte und das immer noch geöffnet war. Starte dich das wieder, tritt auch der Fehler wieder auf.

Die eigentliche Ursache kenne ich zwar immer noch nicht, aber wenigstens den Auslöser 😁

Danke für deine Tipps und deine Geduld!

VG
peter
Antworten