Seite 1 von 1
Dialog "DateField" -array
Verfasst: Fr, 03.02.2017 18:55
von Jörg
Hallo Fachleute,
sicher könnt Ihr mir dabei helfen.
Mit einem Dialog möchte ich Datumsangaben in Zellen eintragen.
Er enthält 10 DateFields (DateField1 bis DateField10)
Die zu befüllenden Zellen: Spalte Y,letzte Zeile bis Spalte AH,letzte Zeile
Die letzte Zeile wird in Spalte A ermittelt.
Code: Alles auswählen
sub Behandlungsdaten_Speichern '11-20
'oDialog9.endExecute()
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress(0).endRow
'msgbox nRow
Zelle = osheet.getCellRangebyName("Y" & nRow +1)
oZelle = osheet.getCellRangebyName("Z" & nRow +1)
Zelle.formulalocal = oDialog9.getControl("DateField1").text
oZelle.formulalocal = oDialog9.getControl("DateField2").text
'usw.
End Sub
Der Code funktioniert soweit, aber ich kriegs nicht als Array hin, sondern nur für jede Zelle einzeln.
Danke!
Re: Dialog "DateField" -array
Verfasst: Fr, 03.02.2017 20:13
von F3K Total
Hi,
du sprichst nicht von einem Array, sondern von einer Schleife, nehme ich an.
Aus dem Kopf, versuche es mal hiermit:
Code: Alles auswählen
sub Behandlungsdaten_Speichern '11-20
'oDialog9.endExecute()
osheet = ThisComponent.Sheets.GetByName("Tabelle1")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress(0).endRow
for i = 1 to 10
Zelle = osheet.getCellbyPosition(23+i, nRow)
Zelle.formulalocal = oDialog9.getControl("DateField"+i).text
next i
End Sub
Gruß R
Re: Dialog "DateField" -array
Verfasst: Sa, 04.02.2017 10:59
von Jörg
Hallo F3K Total,
ich danke Dir. Funktioniert wie gewünscht. Hatte ich in ähnlicherweise auch probiert, aber irgendwo einen Fehler gehabt.
Schönes Wochenende.
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 17:31
von Jörg
Hallo Fachleute,
würde doch noch einmal gern auf das Thema zurückkommen und beziehe mich auf meine Ausgangsfrage.
Der Code von R funktioniert, aber leider ist die Performance nicht so toll, da ja jede Zelle nacheinander befüllt wird.
Das dumme ist, dass ich bereits ähnliche Macros zu laufen habe, allerdings mit TextFields oder NumericFields.
Es scheint als müßten DateFields anders deklariert werden.
Aus Dannenhöfer (Besonderheiten von...) werd ich nicht schlauer.
Mein Code:
Code: Alles auswählen
sub Letzte_Zeile
Dim array_1 (10)
oDoc = thisComponent
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress().endRow
for ta = 1 to 11
array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
next ta
array_1 = Array(array_1())
osheet.getCellRangeByPosition(24, nRow+1, 33, nRow+1).setDataArray(array_1())
'msgbox ocell
end sub
Hier krieg ich die Fehlermeldung: Objectvariable nicht belegt.
Code: Alles auswählen
array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
.text kommt mir ja komisch vor, aber value oder Date klappen ebenfalls nicht.
Eine zweite Frage, aus aktuellem Anlass:
Wie können die Inhalte der Datefields gelöscht werden (für neuerliche Eingaben),
ohne den Dialog neu zu starten?
Würd mich freuen!!
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 17:39
von F3K Total
Wie wäre es, wenn du mal eine ggf. verfremdete Datei, die aber Makro und Dialog enthält, hochladen würdest?
Um sicher helfen zu können, müssten wir uns sonst deine Datei nachbauen, das erwartest du nicht wirklich.
Gruß R
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 17:59
von balu
Hallo Jörg,
Hier krieg ich die Fehlermeldung: Objectvariable nicht belegt.
Im günstigsten Falle ist die Variable
oDialog9 nicht Ordnungsgemäß von dir deklariert worden. Das heißt, Du hast wahrscheinlich folgende Deklaration vorgenommen,
aber dies hast Du
innerhalb einer Sub gemacht, anstatt am Modulanfang
vor einer Sub.
Aber R hat schon Recht, wenn er nach einer Beispieldatei fragt. Denn dann kann man sich das zur Not besser anschauen, für den Fall das mein Hinweis nicht fruchtet.
Gruß
balu
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 18:28
von Jörg
Hallo,
@Balu ne leider nich so.
Habe:
Public oDialog9 as Object
aber ich pack mal Bsp. ran.
Tabelle1: Schaltfläche.
Tabelle16: Die Spalten A - X werden vorab "befüllt"
erst dann kommt u.U. der Dialog zum Einsatz (in meiner Orginal-Eingabemaske, ist aufgrund vieler anderer Eingaben kein Platz mehr und Tabelle16 hat ca. 4000 Zeilen, so dass die direkte Eingabe nicht so toll ist).
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 18:41
von Jörg
Dieser Code gehört natürlich rein.
Der im Modul ist der von R.
Code: Alles auswählen
sub Letzte_Zeile
Dim array_1 (10)
oDoc = thisComponent
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress().endRow
for ta = 1 to 11
array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
next ta
array_1 = Array(array_1())
osheet.getCellRangeByPosition(24, nRow+1, 33, nRow+1).setDataArray(array_1())
'msgbox ocell
end sub
Re: Dialog "DateField" -array
Verfasst: Mo, 06.02.2017 19:08
von F3K Total
So sollte es klappen,
das Makro Dialog9 habe ich umbenannt.
Das Makro Behandlungsdaten_Loeschen an einen neuen Button zum Löschen der Eingabe hängen.
Code: Alles auswählen
Public oDialog9 as Object
Sub Behandlungsdaten_Eingeben
odoc = ThisComponent
DialogLibraries.loadLibrary("Standard")
oDialog9 = CreateUnoDialog(DialogLibraries.Standard.Dialog9)
oForm = DialogLibraries.Standard.Dialog9
oDialog9 = CreateUnoDialog( oForm )
oDialog9.execute
end sub
Sub Behandlungsdaten_Speichern
dim lDate as Long
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.RangeAddress.endRow
oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
aData = oRange.getdataArray
aRow = aData(0)
for i = 1 to 10
odatefield = oDialog9.getcontrol("DateField"+i)
if odatefield.date = 0 then
aRow(i-1) = ""
else
lDate = cdatefromIso(odatefield.Date)
aRow(i-1) = lDate
endif
next i
aData(0) = aRow
oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
oRange.SetDataArray(aData)
End Sub
Sub Behandlungsdaten_Loeschen
for i = 1 to 10
odatefield = oDialog9.getcontrol("DateField"+i)
odatefield.Text = ""
next i
End Sub
Gruß R
Re: Dialog "DateField" -array
Verfasst: Di, 07.02.2017 12:45
von Jörg
hallo F3K Total,
vielen Dank für Deine Hilfe. habe allerdings das "+1" bei nRow rausgenommen, weil ich in die letzte beschriebene Zeile muß.
Eine Frage hätte ich noch.
Wie Du in der Bsp.-Datei sehen konntest, können event. noch weitere Termine hinzukommen (21. - 30.)
das Makro dementsprechend anzupassen und auf einen weiteren Button zu legen ist kein Problem. Ebenso könnte ich ja in den Dialog weitere DateFields einbauen.
Mir schwebt allerdings eine andere Variante vor:
Ich wollte die Zelle (33,nRow) auslesen ob leer oder nicht.
Code: Alles auswählen
Sub Behandlungsdaten_Speichern
dim lDate as Long
Dim Zelle as Object
Zelle = osheet.getCellByPosition (33, nRow)
if Zelle <> "" then
Mein angepaßter Code
else
Dein Code
end if
....................
end sub
Aber so einfach, wie ich mir´s vorstelle, geht es nicht.
Re: Dialog "DateField" -array
Verfasst: Di, 07.02.2017 17:00
von F3K Total
So langsam kostet das was!
Code: Alles auswählen
Sub Behandlungsdaten_Speichern
dim lDate as Long
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
oCellCursor = osheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.RangeAddress.endRow
oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
aData = oRange.getdataArray
aRow = aData(0)
for i = 1 to 10
odatefield = oDialog9.getcontrol("DateField"+i)
if odatefield.date = 0 then
aRow(i-1) = ""
else
lDate = cdatefromIso(odatefield.Date)
aRow(i-1) = lDate
endif
next i
aData(0) = aRow
a = 24
Do Until osheet.getcellbyposition(a,nRow).Value = 0
a = a + 1
Loop
oRange = osheet.getcellrangebyPosition(a,nRow,a+9,nRow)
oRange.SetDataArray(aData)
End Sub
R
Re: Dialog "DateField" -array
Verfasst: Di, 07.02.2017 18:15
von Jörg
Hallo R,
ich danke Dir sehr. Unbezahlbar !!
Hab ans Ende noch das rangehängt:
Code: Alles auswählen
Sub Behandlungsdaten_speichern
'................
antwort = msgbox ("Sollen weitere Termine erfasst werden" ,36,"Verordnung abrechnen?")
if antwort = 7 then
oDialog9.endexecute
elseif antwort = 6 then
Behandlungsdaten_Loeschen ' Dein Makro zum Löschen der Einträge
end if
end sub
Jörg hat geschrieben: Di, 07.02.2017 12:45
habe allerdings das "+1" bei nRow rausgenommen
Ist wieder drin. Muß sich irgendwas in meine Testtabelle eingeschlichen haben.
Also nochmals vielen Dank und nen schönen Abend.
Re: Dialog "DateField" -array
Verfasst: Di, 07.02.2017 18:20
von Thomas Mc Kie
F3K Total hat geschrieben: Di, 07.02.2017 17:00
So langsam kostet das was!
Kleine Spende:
