🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
holdrio76
Beiträge: 5
Registriert: Fr 24. Feb 2017, 10:16

Laufzeitfehler nach Dokumentenübernahme aus OpenOffice

Beitrag von holdrio76 » Fr 24. Feb 2017, 11:22

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

holdrio76
Beiträge: 5
Registriert: Fr 24. Feb 2017, 10:16

Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice

Beitrag von holdrio76 » Fr 24. Feb 2017, 12:30

Hallo,

sorry für die ungenaue Fragestellung, leider erstelle ich solche Makros äußerst selten und bin daher nur blutiger Laie. :oops:

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
Danke.

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice

Beitrag von RobertG » Fr 24. Feb 2017, 13:13

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
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

holdrio76
Beiträge: 5
Registriert: Fr 24. Feb 2017, 10:16

Re: Laufzeitfehler nach Dokumentenübernahme aus OpenOffice

Beitrag von holdrio76 » Fr 24. Feb 2017, 13:46

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. :roll:

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.



Antworten