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