Seite 1 von 1

[GELÖST] setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 02:11
von howtoman
Hallo, wollte fragen wie man mit setFormulaArray und Datum Werten klar kommt.

Zellen: A2 - C2 haben TEXT FORMAT!! (ganz wichtig)

Code:

Code: Alles auswählen

Dim oSheet
	dim array2d(0,2)
	array2d(0,0) = "05.04.12"
	array2d(0,1) = "15.04.12"
	array2d(0,2) = "105.04.12"
	
	oSheet = ThisComponent.sheets(0)
	cursor = oSheet.createCursorByRange(oSheet.getCellRangeByName("A2:C2"))
	cursor.setFormulaArray(array2d)
Die Werte die tatsächlich in Textformatierte (@) Zeilen eingefügt werden, sind leider zu unterschiedlich. Liegt wahrscheinlich an irgendeine Datumserkennung oder so, weil Werte ab 13.04.12 z.B. sind ok, nicht Datum Zahlen schon nicht ok, und unter 13 auch nicht ok, als Datum aber noch erkennbar, wenn man es konvertiert.

So, die Frage ist eingentlich ob ich die Werte, als Text in eine Zelle die auch als TextZelle formatiert ist, normal übertragen kann? Kann ich vllt irgendwie die Datumkonvertierung abschalten?

*
setFormulaArray muss ich benutzen, da auch verschiedene formulas dazwischen kommen. Das ganze ist um von einem Dokument einige Zeilen in einen anderen Dok zu übertragen.
Danke.

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 03:36
von Stephan
Kann ich vllt irgendwie die Datumkonvertierung abschalten?

Stelle, wie auch bei händischer Eingabe üblich, ein Hochkomma voran:

Code: Alles auswählen

array2d(0,0) = "'05.04.12"
array2d(0,1) = "'15.04.12"
array2d(0,2) = "'105.04.12"


Gruß
Stephan

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 04:11
von howtoman
Stephan hat geschrieben:Kann ich vllt irgendwie die Datumkonvertierung abschalten?

Stelle, wie auch bei händischer Eingabe üblich, ein Hochkomma voran:

Code: Alles auswählen

array2d(0,0) = "'05.04.12"
array2d(0,1) = "'15.04.12"
array2d(0,2) = "'105.04.12"


Gruß
Stephan
Stephan, danke für die Antwort.
Ja, so gehts, leider brauche ich und der Anwender, die Daten ohne Hochkomma, weil die Inhalte danach für Auswertungen und Berechnungen benutzt werden .
Vllt vor dem Kopiervorgangang Hochkommas setzen, danach wieder löschen.. dann wäre es glaube ich leichter gar keine setAFromulaArray Funktion zu benutzen. Nu Zelle bei Zelle einfügen....

Vllt sonst irgendeine möglichkeit so ein Problem zu lösen?

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 08:09
von Karolus
Hallo
1. Du musst das Hochkomma nicht per per Code hinzufügen, ändere einfach die Methode:
  • cursor.setDataArray(array2d)
2.Das Hochkomma dient nur zur Formatierung als Text es ist auch in der Zelle nicht sichtbar

3. wieso erstellst du zuerst:
  • oSheet.createCursorByRange(oSheet.getCellRangeByName("A2:C2"))

du könntest doch direkt:
  • oSheet.getCellRangeByName("A2:C2").setDataArray(array2d)
Alles zusammen dann so:

Code: Alles auswählen

Sub Main
Dim oSheet

   array2d()  = array(array("05.04.12", "15.04.12", "105.04.12"))   
   oSheet = ThisComponent.sheets(0)
   oSheet.getCellRangeByName("A2:C2").setDataArray(array2d)
   
End Sub
Karo

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 10:41
von howtoman
Danke für die Antwort Karolus.

3. danke, ich dachte mir schon dass es irgendwie falsch ist ^^

1,2,
Das mit Formula, ja, das Problem ist, dass die Formeln auch dabei sind, beim Übertragen..

Praktisch ich muss eine vollständige Zeile so wie sie ist in einem anderen Dokument kopieren. Danach nachbearbeiten, auswerten, berechnen per makro. Alle zellen sind als Text formatiert, in beiden Doks.

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 12:42
von Stephan
Ja, so gehts, leider brauche ich und der Anwender, die Daten ohne Hochkomma, weil die Inhalte danach für Auswertungen und Berechnungen benutzt werden .
Vllt vor dem Kopiervorgangang Hochkommas setzen, danach wieder löschen.. dann wäre es glaube ich leichter gar keine setAFromulaArray Funktion zu benutzen. Nu Zelle bei Zelle einfügen....
Leider verstehe ich nicht was mir das sagen soll. Du wolltest:
Die Werte die tatsächlich in Textformatierte (@) Zeilen eingefügt werden, sind leider zu unterschiedlich. Liegt wahrscheinlich an irgendeine Datumserkennung oder so, weil Werte ab 13.04.12 z.B. sind ok, nicht Datum Zahlen schon nicht ok, und unter 13 auch nicht ok, als Datum aber noch erkennbar, wenn man es konvertiert.

So, die Frage ist eingentlich ob ich die Werte, als Text in eine Zelle die auch als TextZelle formatiert ist, normal übertragen kann? Kann ich vllt irgendwie die Datumkonvertierung abschalten?
unter Beachtung von:
setFormulaArray muss ich benutzen
und genau dass macht mein Vorschlag.

Das anschließend, beim Kopieren von Werten aus den Calc-Zellen heraus natürlich NICHT die Hochkommas mit kopiert werden ist Tabellenkalkulations-Grundwissen.

Falls es hingegen stören sollte im Makro selber die Hochkommas getrennt einzutragen, wäre ja auch:

Code: Alles auswählen

Dim oSheet
   dim array2d(0,2)
   array2d(0,0) = "05.04.12"
   array2d(0,1) = "15.04.12"
   array2d(0,2) = "105.04.12"

  For i = 0 To 2
    array2d(0,i) = "'" & array2d(0,i)
  Next i
   
   oSheet = ThisComponent.sheets(0)
   cursor = oSheet.createCursorByRange(oSheet.getCellRangeByName("A2:C2"))
   cursor.setFormulaArray(array2d)
möglich.

Re: setFormulaArray und Datum ...

Verfasst: Di, 12.06.2012 23:14
von howtoman
das mit Hochkommas, wusste ich übrigens nicht dass die werte OHNE übertragen werden.
Das problem ist, dass ich auch manchmal formeln habe.
Ich mach jetzt ein anderes Beispiel.

Das geht übrigens (mit getFormulaArray, setFormulaArray):

Code: Alles auswählen

Dim oSheet, oSheet2, dok1 as object, dok2 as object

	dok1 = getOpenedDocByTitle("dokFrom", 1) 'unwichtig hier, also einfach geoeffnetes dokument.
	dok2 = getOpenedDocByTitle("dokTo", 1)
	
	oSheet = dok1.sheets(0)
	oSheet2 = dok2.sheets(0)
	
	array2d  = oSheet.getCellRangeByName("A2:D2").getFormulaArray()
	'array2d(0)(2) = Cstr("105.04.12") ' falls ich etwas ändern will, wird eine zahl eingesetzt.
	oSheet2.getCellRangeByName("A2:D2").setFormulaArray(array2d)
so, wenn man manuel den Array erstellt, oder etwas ändert, werden Zahlen statt Datumstext eingefügt.

Code: Alles auswählen

'	dim array2d(0,3)
'	array2d(0,0) = "05.04.12"
'	array2d(0,1) = "15.04.12"
'	array2d(0,2) = "105.04.12"
'	array2d(0,3) = "=B2"
Auch als array of arrays

Code: Alles auswählen

array2d= Array((Array( "05.04.12", "15.04.12", "105.04.12", "=B2"))
das sind die Beispielinhalte die ich übertragen will (formeln, datum, texte ...), die zwischendurch in Arrays und Objects ("Type") gespeichert und bearbeitet werden.

Noch etwas habe ich bemerkt, beim getFormulaArray() wird ein Object zuruckgegeben, beim Array Erstellen wird Variant (laut Debugger) zuruckgegeben.
Beim ändern eines Wertes nach dem getFormulaArray(), bleibt die variable "Object" eingefügt wird aber genau das geänderte Wert falsch :/

Kann es sein dass man beim Object das man mit "getFormulaArray()" erhält, irgendwie anders die Daten drin ändern kann?


*Und danke für die Antworten und Lösungsversuche!

Re: setFormulaArray und Datum ...

Verfasst: Mi, 13.06.2012 20:00
von howtoman
Als Lösung, nach dem was Stephan empfohlen hat, habe ich in die Funktion die die Daten einfügt, folgendes hinzugefügt:

Code: Alles auswählen

for i = Lbound(dataArray) to Ubound(dataArray)
	
		on error resume next
			dateVal = Datevalue(dataArray(i))
		On Error GoTo 0
		
		if dateVal > 18264  AND dateVal < 73051 then 'von 01.01.1950 - 01.01.2100 '  kann einfach "<> 0" sein fuer alle moegliche Datumseingaben
			dataArray(i) = "'" & dataArray(i)
		endif
		
		
next i
Da ich nicht weiss welche Zellen welche inhalte haben.

Und erst danach setFormulaArray()

Danke :)

Re: [GELÖST] setFormulaArray und Datum ...

Verfasst: Do, 14.06.2012 20:44
von howtoman
nein, doch nicht perfekt :(
so eine Zahl: "21.5" wird als Datum erkannt >.<
Es gibt kein regEx bei StarBasic, oder?

hab so eine HELP Function geschrieben, die nicht immer, aber schon signifikant ein Datum bestimmt.

Code: Alles auswählen

'prueft ob sDate wirklich ein Datum in format dd.mm.yy oder dd.mm.yyyy ist. (95%)
Function istDatum(sDate as String, optional delimitter as String) as Boolean
	On Error GoTo ErrorHandler
	
	If isDate(sDate) Then
	
		If IsMissing(delimitter) Then delimitter = "."
		Dim aDate as Variant
		aDate = Split(sDate, delimitter)
		
		If Ubound(aDate) = 2 Then
			If Len(aDate(0)) = 2 AND Len(aDate(1)) = 2 AND (Len(aDate(2)) = 2 OR Len(aDate(2)) = 4) Then
				If Cint(aDate(0)) <= 31 AND Cint(aDate(0)) > 0 AND Cint(aDate(1)) <= 12 AND Cint(aDate(1)) > 0 Then
					istDatum = true
				EndIf
			EndIf
		EndIf
	EndIf
	
	Exit Function
	ErrorHandler:
	istDatum = false
End Function

Jemand vllt doch eine mega Idee wie man das Ganze richtig (ohne mehrerer Überprüfungen, extra Functionen und 100%-ig) übertragen kann ?