Hallo,
ich habe folgendes Problem. Ein Dokument "Fahrtkostenrechner", welches ich in OpenOffice Calc erstellt habe, wollte ich in Libre Office übernehmen. Beim ausführen des Makros erhalte den Fehler Basic Laufzeitfehler: Objektvariable nicht belegt. Dieser erscheint beim Füllen eines Maskenfeldes mit dem aktuellen Datum:
eM1 ist dabei als Object deklariert.
REM Datumsfelder mit aktuellem Datum befüllen
Sub Heute
Dim dh as Date
dh = date
eM1.getControl("Datum1").date=CDateToIso(dh)
eM1.getControl("Datum2").date=CDateToIso(dh)
eM1.getControl("Datum3").date=CDateToIso(dh)
REM Fokus in erstes Datumsfeld setzten
eM1.getcontrol("Datum1").setFocus
end Sub
Was kann hier der Fehler sein.
Vielen Dank für Eure Hilfe.
Holger
🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Laufzeitfehler nach Dokumentenübernahme aus OpenOffice
Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice
Hallo,
sorry für die ungenaue Fragestellung, leider erstelle ich solche Makros äußerst selten und bin daher nur blutiger Laie.
Sollte mein Post im falschen Thema platziert sein bitte ich diesen ins richtige zu verschieben.
Ich habe eine Calc Datei, welche in einem Tabellenblatt Vorgabewerte bereit stellt. Unsere Mitarbeiter können Ihre Betrieblichen Fahrten in dieses Dokument eintragen. Hierzu klicken sie auf einen Button, welcher das angehängte Makro ausführt. Dabei wird zuerst eine Maske mit Daten befüllt und der Mitarbeiter kann dann die restlichen Felder befüllen und danach abspeichern. Unter OpenOffice Calc hat dies problemlos funktioniert. Hier in LibreOffice Calc bricht das Makro wie gesagt beim befüllen der Datumsfelder ab.
Hier der komplette Code:
Danke.
sorry für die ungenaue Fragestellung, leider erstelle ich solche Makros äußerst selten und bin daher nur blutiger Laie.

Sollte mein Post im falschen Thema platziert sein bitte ich diesen ins richtige zu verschieben.
Ich habe eine Calc Datei, welche in einem Tabellenblatt Vorgabewerte bereit stellt. Unsere Mitarbeiter können Ihre Betrieblichen Fahrten in dieses Dokument eintragen. Hierzu klicken sie auf einen Button, welcher das angehängte Makro ausführt. Dabei wird zuerst eine Maske mit Daten befüllt und der Mitarbeiter kann dann die restlichen Felder befüllen und danach abspeichern. Unter OpenOffice Calc hat dies problemlos funktioniert. Hier in LibreOffice Calc bricht das Makro wie gesagt beim befüllen der Datumsfelder ab.
Hier der komplette Code:
Code: Alles auswählen
Dim eM1 as Object 'Eingabemaske
Dim myDoc as Object 'das aktuelle Dokument
Dim oT1 as Object, oT2 as Object, oT3 as Object, oT4 as Object 'die Datenblätter 2, 3, 4 und 5
Dim nNeuerDatensatzKilometer as integer 'fortlaufende Nummer eingetragene km
Dim nNeuerDatensatzBeleg as integer 'fortlaufende Nummer eingetragene Belege
Dim dZeitCh as date 'Zeitspanne bei Änderung
Dim dZeitAnk as date 'Differenz bei automatischer Ankunftszeit
'---------
'---------
Sub Main
REM grundsätzliche Zuweisungen
myDoc = thisComponent
oT1 = myDoc.sheets(1)
oT2 = myDoc.sheets(2)
oT3 = myDoc.sheets(3)
oT4 = myDoc.sheets(4)
REM Eingabeaske initialisieren
DialogLibraries.LoadLibrary("Standard")
eM1 = CreateUnoDialog( DialogLibraries.Standard.Maske )
initMaske
eM1.Execute()
End Sub
Sub initMaske
REM Maske initialisieren (aus Sub Main gestartet)
REM Hier alle Felder für die Fahrtabrechnung
REM Neue Zeilennummer
nNeuerDatensatzKilometer = oT4.getCellRangeByName("b1").value+3
REM Zeitspanne eintragen
dZeitCH = oT4.getCellRangeByName("b9").value
REM Zietdifferenz eintragen
dZeitAnk = oT4.getCellRangeByName("b10").value
REM Datensaztnummer Fahrt eintragen
eM1.getcontrol("lfdNr").text = nNeuerDatensatzKilometer -2
REM Letzte Fahrt (lF) eintragen
eM1.getcontrol("lfdNrHis").value = oT2.getCellRangeByName("A"&nNeuerDatensatzKilometer-1).value
REM lF Datum
eM1.getcontrol("DatumHis").text = oT2.getCellRangeByName("C"&nNeuerDatensatzKilometer-1).string
REM lF Grund
eM1.getcontrol("GrundHis").text = oT2.getCellRangeByName("B"&nNeuerDatensatzKilometer-1).string
REM lf Gefahrene km
eM1.getcontrol("kmHis").value = oT2.getCellRangeByName("I"&nNeuerDatensatzKilometer-1).value
REM Dropdownlisten füllen
FuellListe("Grund","e",2,20)
FuellListe("Abfahrt","g",2,20)
FuellListe("Ziel","i",2,20)
REM Datum füllen und Felder leeren
heute
eM1.getControl("Grund").text=""
eM1.getControl("Abfahrt").text=""
eM1.getControl("Ziel").text=""
eM1.getControl("km").text=""
eM1.getControl("Beginn").text=""
eM1.getControl("Ende").text=""
REM Hier alle Felder für die Belegabrechnung
REM Neue Zeilennummer
nNeuerDatensatzBeleg = oT4.getCellRangeByName("b2").value+3
REM Datensaztnummer Fahrt eintragen
eM1.getcontrol("lfdNrBeleg").text = nNeuerDatensatzBeleg -2
REM den letzten Beleg (lB) eintragen
REM lB laufende Nummer
eM1.getcontrol("lfdNrBelegHis").value = oT3.getCellRangeByName("A"&nNeuerDatensatzBeleg-1).value
REM lF Datum
eM1.getcontrol("Datum3His").text = oT3.getCellRangeByName("B"&nNeuerDatensatzBeleg-1).string
REM lF Grund
eM1.getcontrol("BelegHis").text = oT3.getCellRangeByName("C"&nNeuerDatensatzBeleg-1).string
REM lf Gefahrene km
eM1.getcontrol("BetragHis").value = oT3.getCellRangeByName("D"&nNeuerDatensatzBeleg-1).value
REM Dropdownlisten füllen
FuellListe("Belege","l",2,20)
FuellListe("MwSt","p",2,3)
REM Felder leeren
eM1.getControl("Belege").text=""
eM1.getControl("Betrag").text=""
eM1.getControl("MwSt").text=""
End Sub
REM Datumsfelder mit aktuellem Datum befüllen
Sub Heute
Dim dh as Date
dh = date
eM1.getControl("Datum1").date=CDateToIso(dh)
eM1.getControl("Datum2").date=CDateToIso(dh)
eM1.getControl("Datum3").date=CDateToIso(dh)
REM Fokus in erstes Datumsfeld setzten
eM1.getcontrol("Datum1").setFocus
end Sub
REM Füllen der Dropdownfelder in der Eingabemaske mit den Werten aus der Tabelle Daten
Sub FuellListe(Liste, spalte, zeile, eNr)
FFeld=eM1.getControl(Liste)
FFeld.removeitems(0, eNr)
for i=0 to eNr
adr="$"+spalte+"$"+(i+zeile)
inhalt=oT4.getCellRangeByName(adr).string
FFeld.additem(inhalt,i)
next
FFeld.additem("",0)
End Sub
REM Button Zeit + Abfahrt
Sub ZeitPlusAbf
Dim dStd as long
dStd = eM1.getcontrol("Beginn").time
if dStd = 0 then
dStd = 08000000
end if
dStd = ZeitAnd(dStd, 1)
eM1.getcontrol("Beginn").time = dStd
eM1.getcontrol("Beginn").setFocus()
end Sub
REM Button Zeit - Abfahrt
Sub ZeitMinusAbf
Dim dStd as long
dStd = eM1.getcontrol("Beginn").time
if dStd = 0 then
dStd = 08000000
end if
dStd = ZeitAnd(dStd, -1)
eM1.getcontrol("Beginn").time = dStd
eM1.getcontrol("Beginn").setFocus()
end Sub
REM Button Zeit + Ankunft
Sub ZeitPlusAnk
Dim dStd as long
dStd = eM1.getcontrol("Ende").time
if dStd = 0 then
dStd = 18000000
end if
dStd = ZeitAnd(dStd, 1)
eM1.getcontrol("Ende").time = dStd
eM1.getcontrol("Ende").setFocus()
end Sub
REM Button Zeit - Abfahrt
Sub ZeitMinusAnk
Dim dStd as long
dStd = eM1.getcontrol("Ende").time
if dStd = 0 then
dStd = 18000000
end if
dStd = ZeitAnd(dStd, -1)
eM1.getcontrol("Ende").time = dStd
eM1.getcontrol("Ende").setFocus()
end Sub
REM DatenbankbereichKilometer neu festlegen (Tabelle Fahrten ab A3 ... muss nach jedem Eintrag einer Autofahrt vergrößert werden)
Sub DatenBereichKilometer
Dim aPos1 as new com.sun.star.table.CellAddress
oBereich = ThisComponent.NamedRanges
oBereich.removebyname("Datenbank")
obereich.addNewbyName("Datenbank","$Fahrten.$A$2:$J$"&nNeuerDatensatzKilometer,aPos1,0)
end Sub
REM DatenbankbereichBeleg neu festlegen (Tabelle Belege ab A2 ... muss nach jedem Eintrag eines Beleges vergrößert werden)
Sub DatenBereichBeleg
Dim aPos2 as new com.sun.star.table.CellAddress
oBereich = ThisComponent.NamedRanges
oBereich.removebyname("Belege")
obereich.addNewbyName("Belege","$Belege.$A$2:$N$"&nNeuerDatensatzBeleg,aPos2,0)
end Sub
REM Datenadresse des neuen Datensatzes Fahrt bestimmen
function dat_adrF(sp)
zeile1 = nNeuerDatensatzKilometer
dat_adrF="$"+sp+"$"&zeile1
end function
REM Datenadresse des neuen Datensatzes Beleg bestimmen
function dat_adrB(sp)
zeile2 = nNeuerDatensatzBeleg
dat_adrB="$"+sp+"$"&zeile2
end function
REM Zeit korrekt verarbeiten
function ZWertF(Zeit as string)
Dim ZeitF as long
ZeitF= left(Zeit, 2)& Mid(Zeit, 4, 2) & Mid(Zeit, 7,2) & "00"
zWertF=ZeitF
end Function
REM Zeit korrekt verarbeiten
function ZWert(ZDat)
if ZDat = 0 then
zDat = 100
end if
sZDat=Format(ZDat,"00000000")
ZWert=left(sZDat,2)&":"&Mid(sZDat,3,2)&":"&Mid(sZDat,5,2)
end function
function ZeitAnd(zeit, vorz)
Dim sT1 as date
sT1 = Timevalue(ZWert(zeit))
sT1 = sT1+(vorz * dZeitCH)
ZeitAnd=zWertF(sT1)
end function
REM Button Fahrt Hinzufügen mit Funktion versehen
REM erts Fehlerkontrolle
sub AddSatzFahrt
if eM1.getControl("Datum1").date=0 then
msgbox "Das Abfahrtsdatum muss eingegeben werden!"
eM1.getControl("Datum1").setFocus()
elseif eM1.getControl("Beginn").time=0 then
msgbox "Die Abfahrtszeit muss eingegeben werden!"
eM1.getControl("Beginn").setFocus()
elseif eM1.getControl("Datum2").date=0 then
msgbox "Das Ankunftsdatumatum muss eingegeben werden!"
eM1.getControl("Datum2").setFocus()
elseif eM1.getControl("Ende").time=0 then
msgbox "Die Ankunftszeit muss eingegeben werden!"
eM1.getControl("Ende").setFocus()
elseif eM1.getControl("Grund").text="" then
msgbox "Der Fahrtgrund muss eingetragen werden!"
eM1.getControl("Grund").setFocus()
elseif eM1.getControl("Abfahrt").text="" then
msgbox "Der Abfahrtsort muss eingegeben werden!"
eM1.getControl("Abfahrt").setFocus()
elseif eM1.getControl("Ziel").text="" then
msgbox "Der Zielort muss eingegeben werden!"
eM1.getControl("Ziel").setFocus
elseif eM1.getControl("km").value=0 then
msgbox "Die gefahrenen Kilometer müssen eingetragen werden!"
eM1.getControl("km").setFocus()
else
SatzSpeichernFahrt
end if
end Sub
REM Die eingegebenen Daten werden in die Tabelle eingetragen
Sub SatzSpeichernFahrt
REM geschützten Tabellenbereich zur Änderung freigeben
oT4.unprotect("qrx-10")
REM Datum eintragen
fd1 = eM1.getcontrol("Datum1").date
ad=dat_adrF("c")
oT2.getCellRangeByName(ad).value=CDateFromIso(fd1)
fd2 = eM1.getcontrol("Datum2").date
ad=dat_adrF("f")
oT2.getCellRangeByName(ad).value=CDateFromIso(fd2)
REM Fortlaufende Nummer eintragen
ad=dat_adrF("a")
oT2.getCellRangeByName(ad).value=nNeuerDatensatzKilometer-2
REM Beleg eintragen
gr = eM1.getcontrol("Grund").text
ad=dat_adrF("b")
oT2.getCellRangeByName(ad).string=gr
REM Betrag eintragen
abf = eM1.getcontrol("Abfahrt").text
ad=dat_adrF("d")
oT2.getCellRangeByName(ad).string=abf
REM Fahrtziel eintragen
ziel = eM1.getcontrol("Ziel").text
ad=dat_adrF("g")
oT2.getCellRangeByName(ad).string=ziel
REM Abfahrtszeit eintragen
zAbf1 = ZWert(eM1.getControl("Beginn").time)
ad=dat_adrF("e")
oT2.getCellRangeByName(ad).value=TimeValue(zAbf1)
REM Ankunftszeit eintragen
zAnk = ZWert(eM1.getControl("Ende").time)
ad=dat_adrF("h")
oT2.getCellRangeByName(ad).value=TimeValue(zAnk)
REM Gefahrene KM eintragen
kms = eM1.getcontrol("km").value
ad=dat_adrF("i")
oT2.getCellRangeByName(ad).value=kms
REM Dienstfahrt wg. Funktion DBSumme eintragen
adf = "Fahrt"
ad=dat_adrF("j")
oT2.getCellRangeByName(ad).string=adf
REM Zähler für fortlaufende Nummer erhöhen
nDatNr = oT4.getCellRangeByName("b1").value+1
oT4.getCellRangeByNAme("b1").value=nDatNr
DatenBereichKilometer
REM Tabellenbereich nach Änderung schützen
oT4.protect("qrx-10")
REM Formular speicher
myDoc.store()
REM Maske neu initialisieren
initMaske
End Sub
REM Button Beleg Hinzufügen mit Funktion versehen
REM erts Fehlerkontrolle
sub AddSatzBeleg
if eM1.getControl("Belege").text=0 then
msgbox "Die Belegart muss eingegeben werden!"
eM1.getControl("Belege").setFocus()
elseif eM1.getControl("Datum2").date="" then
msgbox "Das Datum muss eingetragen werden!"
eM1.getControl("Datum3").setFocus()
elseif eM1.getControl("Betrag").text="" then
msgbox "Der Betrag muss eingegeben werden!"
eM1.getControl("Betrag").setFocus()
elseif eM1.getControl("MwSt").text="" then
msgbox "Der Mehrwertsteuersatz muss eingegeben werden!"
eM1.getControl("MwSt").setFocus()
else
SatzSpeichernBeleg
end if
end Sub
REM Die eingegebenen Daten werden in die Tabelle eingetragen
Sub SatzSpeichernBeleg
REM geschützten Tabellenbereich zur Änderung freigeben
oT4.unprotect("qrx-10")
REM Datum eintragen
fd3 = eM1.getcontrol("Datum3").date
ad=dat_adrB("b")
oT3.getCellRangeByName(ad).value=CDateFromIso(fd3)
REM Fortlaufende Nummer eintragen
ad=dat_adrB("a")
oT3.getCellRangeByName(ad).value=nNeuerDatensatzBeleg-2
REM Fahrtgrund eintragen
gr = eM1.getcontrol("Belege").text
ad=dat_adrB("c")
oT3.getCellRangeByName(ad).string=gr
REM Abfahrtort eintragen
bet = eM1.getcontrol("Betrag").value
ad=dat_adrB("d")
oT3.getCellRangeByName(ad).value=bet
REM Mehrwertsteuer eintragen
mwst = eM1.getcontrol("MwSt").text
ad=dat_adrB("e")
oT3.getCellRangeByName(ad).string=mwst
REM Beleg wg. Funktion DBSumme eintragen
bl = "Beleg"
ad=dat_adrB("f")
oT3.getCellRangeByName(ad).string=bl
REM Zähler für fortlaufende Nummer erhöhen
nDatNrBeleg = oT4.getCellRangeByName("b2").value+1
oT4.getCellRangeByNAme("b2").value=nDatNrBeleg
DatenBereichBeleg
REM Tabellenbereich nach Änderung schützen
oT4.protect("qrx-10")
REM Formular speicher
myDoc.store()
REM Maske neu initialisieren
initMaske
End Sub
REM Prozedur abbrechen
Sub Abbrechen
eM1.EndExecute()
End Sub
REM Rest ist noch ohne Funktion
Sub Daten_entfernen
myDoc = thisComponent
mySheet = myDoc.sheets(1)
mycell = mysheet.getCellRangeByName("B28:EndUp")
flag=com.sun.star.sheet.CellFlags.VALUE+com.sun.star.sheet.CellFlags.STRING+com.sun.star.sheet.CellFlags.DATETIME
mycell.clearcontents(flag)
'oBereich.getControl("Datenbank","$Tabelle.B28:H28")
'ThisComponent.sheets(0).getCellRangeByName(oBereich).clearContents(com.sun.star.sheet.CellFlags.value + com.sun.star.sheet.CellFlags.Datetime + com.sun.star.sheet.CellFlags.String)
'flag = com.sun.star.sheet.CellFlags.VALUE+com.sun.star.sheet.CellFlags.STRING+com.sun.star.sheet.CellFlags.DATETIME
'oBereich.clearcontents(flag)
end sub
Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice
Das Ganze hat etwas mit dem unterschiedlichen Umgang mit Datumswerten in OOo und LO zu tun. Da hat während der 4er-Version von LO eine Änderung stattgefunden. Datumswerte werden vermutlich als
.date.Year
.date.Month
.date.Day
zu erreichen sein.
Ich habe das Base-Handbuch hier leider nicht gerade parat. Darin habe ich das aber auch dokumnetiert - wenn es auch eigentlich ein Basic-Problem ist.
Gruß
Robert
.date.Year
.date.Month
.date.Day
zu erreichen sein.
Ich habe das Base-Handbuch hier leider nicht gerade parat. Darin habe ich das aber auch dokumnetiert - wenn es auch eigentlich ein Basic-Problem ist.
Gruß
Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice
Danke Robert,
der Hinweis hat mich auf die richtige Lösung gebracht.
Über eine Googelsuche mit den genannten Datumswerten habe ich CDateToUnoDate(now) gefunden.
Entschuldigt den Post in diesem Thema nochmal. Ich hatte ein Basic Problem und mein Kopf wollte Basic lesen da war es egal, dass hier BASE steht.
Vielen Dank trotzdem.
Holger
der Hinweis hat mich auf die richtige Lösung gebracht.
Über eine Googelsuche mit den genannten Datumswerten habe ich CDateToUnoDate(now) gefunden.
Entschuldigt den Post in diesem Thema nochmal. Ich hatte ein Basic Problem und mein Kopf wollte Basic lesen da war es egal, dass hier BASE steht.

Vielen Dank trotzdem.
Holger
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.