DrPagel-FavIcon
« »

Verfasst am 01.03.2008 01:07:36 Uhr
Beispiel einer Übertragung eines Excel/VBA-Codes nach Staroffice/StarBasic Teil2
Fortsetzung v.29.2.2008

Ich bin längst noch nicht fertig. Zunächst konnten die VBA-Tabellenzell-"Eigenschaften" zum Paste-Vorgang geklärt werden.
VBAbedeuted
Paste:=xlPasteValues nur die nackten Zahlen oder Strings werden übernommen, die Formateigenschaften (wie Hintergrundfarbe, Schriftfont, Rahmen, usw.) dagegen nicht (Lit.1)
Paste:=xlPasteFormatsnur die Formateigenschaften zu den Zellinhalten werden übernommen (Lit.1)
Operation:=xlNonees wird keine (Rechen-)Operation durchgeführt
Operation:=xlAddes wird eine Additionsoperation durchgeführt (Lit.2)
Operation:=xlSubtractes wird eine Subtraktionsoperation durchgeführt (Lit.3)
Operation:=xlMultiplyes wird eine Multiplikationsoperation durchgeführt (Lit.4)
Operation:=xlDividees wird eine Divisionsoperation durchgeführt (Lit.5)
SkipBlanks:=Falseschreibt die Zellinhalte (z.B.: Funktionen, Zahlen oder Strings) linksbündig, füllt sie nicht mit Blanks (Leerstellen) auf
SkipBlanks:=Trueschreibt die Zellinhalte (z.B.: Bilder, Funktionen, Zahlen oder Strings) rechtsbündig, füllt sie also mit Blanks (Leerstellen) auf (Lit.4)
Transpose:=Falsefügt die Zellinhalte (z.B. Daten) senkrecht ein (Lit.6)
Transpose:=Truefügt die Zellinhalte (z.B. Daten) waagrecht ein (Lit.6)
Die Literaturangaben sind nur exemplarisch und noch nicht verlinkt:
Lit.1: http://www.herber.de/forum/archiv/212to216/t214019.htm
Lit.2: http://www.herber.de/forum/messages/698374.html
Lit.3: http://www.vbaexpress.com/kb/getarticle.php?kb_id=50
Lit.4: http://www.vba-beispiele.de/office.php?was=1307
Lit.5: http://www.herber.de/forum/archiv/664to668/t667676.htm
Lit.6: http://www.office-loesung.de/ftopic119243_0_0_asc.php

Nun steht wieder die sogenannte "Roadmap" für eine den VBA-Eigenschaften anzupassende Zellkonfiguration in StarBasic fest.

Die komplette Zelle "mit Kind und Kegel" samt Eigenschaften und Methoden wurde im Teil1 kopiert. Nun möchte man nur die Funktionen ohne die Zellformatierung kopieren. Genug Platz auf dem CurTiPot-Datenblatt "pH_calc" findet man z.B. ab der Tabellenzelle AA23 bis AG30 :

Sub CopyAll2Formel
Dim oSheet as Object, oCell as Object
Dim oRangeOrg as Object, oRangeCopy as Object
rem
oSheet = ThisComponent.CurrentController.ActiveSheet
rem
oSheet1 = oSheet
oSheet2 = oSheet
rem
oRangeOrg = oSheet1.getCellRangeByName("AA3:AG10")
oRangeCopy= oSheet2.getCellRangeByName("AA23:AG30")
oRangeCopy.setFormulaArray(oRangeOrg.getFormulaArray)
End Sub


Bevor ich es vergesse, hier noch der Übertrag von den nackten Zahlen und Strings ohne ihre Funktionen und Zellformatierung. Genug Platz auf dem CurTiPot-Datenblatt "pH_calc" findet man z.B. ab der Tabellenzelle AA33 bis AG40 :

Sub CopyAll2Daten
Dim oSheet as Object, oCell as Object
Dim oRangeOrg as Object, oRangeCopy as Object
rem
oSheet = ThisComponent.CurrentController.ActiveSheet
rem
oSheet1 = oSheet
oSheet2 = oSheet
rem
oRangeOrg = oSheet1.getCellRangeByName("AA3:AG10")
oRangeCopy= oSheet2.getCellRangeByName("AA33:AG40")
oRangeCopy.setDataArray(oRangeOrg.getDataArray)
End Sub


Und falls bereits die reinen Formeln ohne die Formatierung in den Tabellenzellen (z.B. von AA23 bis AG30) angelegt sind, dann kann man daraus auch die Daten in einen freien Tabellenzellbereich von AA43 bis AG50 extrahieren:

Sub CopyFormel2Daten
Dim oSheet as Object, oCell as Object
Dim oRangeOrg as Object, oRangeCopy as Object
rem
oSheet = ThisComponent.CurrentController.ActiveSheet
rem
oSheet1 = oSheet
oSheet2 = oSheet
rem
oRangeOrg = oSheet1.getCellRangeByName("AA23:AG30")
oRangeCopy= oSheet2.getCellRangeByName("AA43:AG50")
oRangeCopy.setDataArray(oRangeOrg.getDataArray)
End Sub


Für die Extraktion von der Formatierung aus der "Vollständigen Zelle" fehlen mir noch die Ideen. Vielleicht muss man dazu erst die "Vollständige Zelle" duplizieren und sie dann von der Funktion befreien? (dp) (1,5h + 2h(04:45-06:45))

Nachtrag_1 am 5.3.2008 um 19.40Uhr:
Soeben habe ich das pH_calc-Datenblatt vom CurTiPot-Programm (Visual Basic für Excel, Prof.Dr.Gutz, Sao Paulo) unter Staroffice zum Laufen gebracht. Das heisst aber noch nicht, dass es bei mir richtig rechnet.

Vorher waren noch einige StarBasic-Tricks anzuwenden:
  • Unter der Bezeichnung Output mag die Daten-Ausgabeprozedur unter Visual-Basic laufen; bei mir musste ich sie zu oOutput umbenennen, weil vermutlich Output bereits für andere mir unbekannte Staroffice-Zwecke reserviert ist.
  • Ich weiß nicht, ob Visual-Basic so robust entworfen wurde, dass es die Rechenoperationen Division durch Null oder Logarithmus von Null einfach ignoriert und weitermacht, als wäre nichts passiert? Unter Staroffice musste ich diese Fälle mit einer zusätzlichen IF-Bedingung abfangen.
(dp) (0,75h)

Nachtrag_2 am 6.3.2008 um 16.40Uhr:
Neue Unkenntnis habe ich bei mir aufgedeckt. Ob die entsprechenden Passagen in VBA richtig funktionieren, kann ich nicht beurteilen. Aber unter StarBasic geht es nicht, in einer IF-Bedingung zwei Bedingungen simultan mit AND verknüpft abzufragen, während bei der Überprüfung einer der Bedingungen auf ein verbotenes Datenfeld zugegriffen werden soll. Daher habe ich den Code von VBA

IF Bedingung1 AND Bedingung2 THEN ...
so in einen sukzessiven Code für Starbasic entflochten:
IF Bedingung1 THEN
IF Bedingung2 THEN ...
END IF


Vermutlich ist bei StarBasic der Begriff "line" bereits reserviert. Diesen konnte ich nicht einfach aus VBA übernehmen, sondern musste ihn zunächst mal zu "oline" umbenennen.
(dp) (0,25h)

Nachtrag_3 am 6.3.2008 um 22.10Uhr:
Während in einer VBA-Vorlage kühn programiert wird:
Range("A" & line + 41).Value =MyValue
funktioniert diese Methode in StarBasic nur, falls man
oSheet.getCellRangeByName( "A"&Cstr(oline+41) ).getCellByPosition( relativeZellspaltenPositon, relativeZellreihenPosition ).Value=MyValue
umcodiert. Falls man in StarBasic die interne Methode str() anstelle von Cstr() benutzt, wird die Integerzahl 41 in den String " 41" mit einer führenden Leerstelle anstatt in "41" konvertiert. (dp) (0,25h)

Nachtrag_4 am 09.3.2008 um 01.10Uhr:
Vermutlich habe ich wieder etwas durch "Learning by Doing" gelernt: offiziell heißt es, brauchen die Variablen nur irgendwo im Basic-Modul erklärt zu werden, damit sie im gesamten Modul bekannt seien. Damit bedeutet ein Modul unter Basic sinngemäß so etwas wie ein Hauptprogramm in einer anderen Software. Das Modul erkennt man (zumindest in Staroffice) daran, dass es mit "REM ***** BASIC *****" in der ersten Modulzeile eingeleitet wird. Wenn man vor der ersten Prozedur (bzw. Subroutine) "SUB ..." die Felder mit DIM MyArray(myArrayDimension) As Double, MySecondArray(mySecondArrayDimension) As Integer, ..." deklariert, wobei "myArrayDimension, mySecondArrayDimension" natürliche Zahlen sind, dann sollten diese Felder in allen Prozeduren bekannt sein. Es empfiehlt sich jedoch, diese Deklaration als Erinnerungsstütze mit der Anmerkung "Rem" in den entsprechend benötigten Prozeduren zu archivieren. Ebenso habe ich erfahren, dass es zwecks leichterer Überprüfung und Fehlersuche vorteilhaft ist, die Namen der Variablen in diesen Deklarationen oder in den Übergabelisten beim Aufruf der Prozeduren und Funktionen alphabetisch geordnet zu halten. (dp) (0,25h)

archiviert (tbid1982.378): (dp) 18.05.2009 (+0,1h (+flagcounter +home.icon +w3c_LiCh +4navi))
Haftungsausschluss
free counters
© drpagel.de Alle Rechte vorbehalten.