Seite 1 von 1

[Gelöst] Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Di, 17.10.2023 22:16
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Mi, 18.10.2023 00:15
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Mi, 18.10.2023 11:22
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Mi, 18.10.2023 18:25
von Karolus
peter999999 hat geschrieben: Mi, 18.10.2023 11:22 Der Aufruf ist aber ok:
...
BASIC ist aber anderer Meinung!

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 12:09
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 13:04
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 ...

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 13:17
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.

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 13:39
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???

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 13:52
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 16:08
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:

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 17:40
von mikeleb
Hallo,
den Fehler kann ich nicht nachvollziehen. Bei mir laufen beide Varianten fehlerfrei.
Mit welchem System/Programm/Version arbeitest du?

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 19:24
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

Re: Laufzeitfehler nach Verlagerung in Subroutine

Verfasst: Do, 19.10.2023 20:13
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