Makro von SO5.2 nach OOo

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Mo, 02.08.2004 13:11

Hallo,
ich stelle mich mit dieser Frage als neuer Benutzer vor.
Programmierkenntnisse sind nicht vorhanden.

Mein Problem:
StarWreiter 5,2 Tabellen-Makro nach Open Office umschreiben.

Ich möchte die kopierte Zeile unter der letzten vorhandenen Zeile eintragen.

Für folgenden Makrotext von SO5.2
wird eine Entsprechung in OOo gesucht.

Code: Alles auswählen

ActiveWindow.GoToCell( "$A$4:$H$4" )
Selection.Copy()
ActiveWindow.GoToEndOfData()
ActiveWindow.GoToStartOfRow()
ActiveWindow.GoDown(1,False)
Selection.Paste()
ActiveWindow.JumpToTable( 1 )
Wer kann helfen?
vanglio

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly » Mo, 02.08.2004 16:57

Hallo Vanglio!

Die Makrosprache im OOo ist komplizierter geworden. Ich habe mal versucht deine Zeile umzusetzen.
Hier der Code:

Code: Alles auswählen

Sub KopiereZeile

Dim AktBuch as object
Dim AktZelle as Object
Dim BlattNr as integer
Dim AktBlatt as object
Dim Start as object
Dim Ouelle as object
Dim Cursor as object
Dim Zeile as Integer
Dim Zielbereich as object
Dim Ziel as object

AktBuch = ThisComponent
AktZelle = AktBuch.currentSelection
BlattNr = AktZelle.getCellAddress().Sheet
AktBlatt = AktBuch.sheets(BlattNr)

Startbereich = AktBlatt.getCellRangeByName("A4:H4")
Quelle =Startbereich.getRangeAddress()

Cursor = AktBlatt.createCursor()
Cursor.gotoEndOfUsedArea (0)
Zeile = Cursor.getRangeAddress().StartRow + 1
Zielbereich = AktBlatt.getCellByPosition(0,Zeile)
Ziel = Zielbereich.getCellAddress()

AktBlatt.copyrange(Ziel, Quelle) 

AktBlatt = AktBuch.sheets(0)
AktBuch.CurrentController.activeSheet= AktBlatt

End Sub

Ich hoffe dies hilft dir.

Gruß
Charly

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Di, 03.08.2004 12:15

Hallo Charly,

danke für Deine Antwort.

Ich habe versucht Deinen Vorschlag in meine Makros zu integrieren, jedoch es tut sich garnichts. Wenn ich mir den Aufbau ansehe, könnte ich vermuten, dass Dein Entwurf in einer Anderen Sprache verfaßt ist.

Ich habe jetzt noch mal den Makrorecorder bemüht, um das aufzuzeichnen, was ich tun will. Jedoch anstatt der fixen Zelle $A$130 (bzw "dim args4()") benötige ich eine entsprechende Formulierung für den Auftrag:
Gehe ans Ende der Daten,
gehe an den Anfang der Zeile,
gehe eine Zelle tiefer.

Code: Alles auswählen

sub speichern22
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$5:$AH$5"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())




rem ----------Dieser Abschnitt müßte geändert werden-------------

dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$A$130"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())





rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVDT"
args5(1).Name = "FormulaCommand"
args5(1).Value = 0
args5(2).Name = "SkipEmptyCells"
args5(2).Value = false
args5(3).Name = "Transpose"
args5(3).Value = false
args5(4).Name = "AsLink"
args5(4).Value = false
args5(5).Name = "MoveMode"
args5(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args5())


end sub
Hast Du noch eine Idee?
Gruß vanglio

Stephan
********
Beiträge: 11029
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan » Di, 03.08.2004 12:53

Hallo vanglio,

ich hatte gestern auf einen post verzichtet, weil Du schon eine Antwort von Charly hattest (habe diese aber nicht genau gelesen).

Ich würde das so machen:

Code: Alles auswählen

sub kopieren
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
Dim CellAddress As New com.sun.star.table.CellAddress
Doc = StarDesktop.CurrentComponent
'aktives Blatt hat Index 0
'Sheet = Doc.Sheets.GetByIndex(0)
'oder mittels Tabellenname
Sheet = Doc.Sheets.GetByName("Tabelle1")
'Bereich $A$4:$H$4
CellRangeAddress.StartColumn = 0
CellRangeAddress.StartRow = 3
CellRangeAddress.EndColumn = 7
CellRangeAddress.EndRow = 3
oCellCursor = Sheet.createCursor() 
oCellCursor.GotoEndOfUsedArea(True) 
CellAddress.Row = oCellCursor.getRangeAddress.EndRow + 1 
Sheet.copyRange(CellAddress, CellRangeAddress)
end sub
Gehe ans Ende der Daten,
gehe an den Anfang der Zeile,
gehe eine Zelle tiefer.
Die Codezeile:
oCellCursor.GotoEndOfUsedArea(True)
ist der Kern dessen was Du suchst.

Gruß
Stephan

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly » Di, 03.08.2004 14:50

Hallo Stephan!

Ich bin nicht so ein Basic-Experte wie du und so habe ich noch eine Zusatzfrage.

In deiner Version hast du laut Handbuch ein paar Felder wie CellRangeAddress.sheet bzw. CellAddress.Sheet und CellAddress.Column nicht belegt. Meine Frage ist, mit was werden diese Felder beim Befehl sheet.copyrange gefüllt, insbesondere wenn ich davon ausgehe, dass Vanglio nicht mit Blattindex 0 arbeitet, da er zu diesem Blatt anschließend erst springen will und man mit dem Befehl auch blattübergreifend kopieren kann.

Meine Version habe ich übrigens auf meinem Computer getestet. Sie funktioniert einwandfrei. Ich bin nur den umgekehrten Weg wie du gegangen, denn ich habe festgestellt, dass die im Handbuch beschriebenen Variablenobjekte mit den durch den Befehl Zellbereich.getRangeAddress() bzw. Zell.getCellAddress() erhaltenen Objekte identisch sind. Dadurch brauche ich nicht mehr die Einzelwerte übergeben.

Der Befehl Cursor.GotoEndofUsedArea funktioniert bei mir nur mit (0). Bei Eingabe von True erhalte ich eine Fehlermeldung. Deswegen verwende ich für True immer (0) und für False(1)


gruß

Charly

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly » Di, 03.08.2004 16:46

Hallo Vanglio

Ich habe mir in der Zwischenzeit dein Recorder-Programm- angeschaut. In der hast du als ersten Befehl „zum Tabellenblatt zwei springen“. Dies habe ich in meinem Makro nicht berücksichtigt. Mein Makro arbeitet nur mit dem aktuellen Tabellenblatt, macht dort die Kopien und springt am Schluss zum ersten Tabellenblatt. In deiner ursprünglichen Vorlage war das nicht enthalten. Da müsste ich mein Programm umschreiben oder du verwendest das von Stephan.
Falls du mit beiden Programmen nicht zurecht kommst:

Die für den Makrorecorder fehlenden Befehle lauten:

Code: Alles auswählen

dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Sel"
args4(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args4())

dispatcher.executeDispatch(document, ".uno:GoToStartOfRow", "", 0, args4())

dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "By"
args6(0).Value = 1      Rem = Anzahl der nötigen Zeilen hier eine Zeile
args6(1).Name = "Sel"
args6(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args6())

Gruss Charly

Stephan
********
Beiträge: 11029
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan » Di, 03.08.2004 19:11

Hallo Charly,
Ich bin nicht so ein Basic-Experte wie du und so habe ich noch eine Zusatzfrage
bin ich auch nicht unbedingt
In deiner Version hast du laut Handbuch ein paar Felder wie CellRangeAddress.sheet bzw. CellAddress.Sheet und CellAddress.Column nicht belegt. Meine Frage ist, mit was werden diese Felder beim Befehl sheet.copyrange gefüllt
Ja, der Hintergrund Deines Einwurfs ist völlig berechtigt. Was soll ich sagen: Ich habe gestern den post von vanglio gelesen und schnell etwas zusammengeschoben habe dann zwischenzeitlich etwas anderes gemacht und irgendwann festgestellt das Du schon gepostet hattest. Ich habe Deinen Code nicht gelesen und als ich heute in den Thread schaute hatte ich eigentlich nur erwartet das vanglio sich bedankt das alles funktioniert. Da das nicht der Fall war habe ich das "halbfertige Zeug" von gestern gepostet (ein schneller Test ergab das es funktionierte)... so ist das gelaufen.
insbesondere wenn ich davon ausgehe, dass Vanglio nicht mit Blattindex 0 arbeitet, da er zu diesem Blatt anschließend erst springen will und man mit dem Befehl auch blattübergreifend kopieren kann.
Ja, ich sehe das:

ActiveWindow.GoToCell( "$A$4:$H$4" )
ActiveWindow.JumpToTable( 1 )


Ich war unaufmerksam und habe ohne nachzudenken etwas unfertiges gepostet (siehe oben). Dein Einwurf ist auch hier berechtigt...
Der Befehl Cursor.GotoEndofUsedArea funktioniert bei mir nur mit (0). Bei Eingabe von True erhalte ich eine Fehlermeldung. Deswegen verwende ich für True immer (0) und für False(1)
Also eine Fehlermeldung bekomme ich in keinem Fall und ich fand es etwas merkwürdig das True=0 und False=1 sein sollte, ich habe Folgendes gefunden:
Dein Orginal-Code ist:
Cursor.gotoEndOfUsedArea (0)
Zeile = Cursor.getRangeAddress().StartRow + 1
Zielbereich = AktBlatt.getCellByPosition(0,Zeile)
Ziel = Zielbereich.getCellAddress()


Ich war bisher der Meinung das .gotoEndOfUsedArea ein "Äquivalent" (inhaltlich keine schöne Formulierung an dieser Stelle) für STRG+ENDE ist jedoch finde ich jetzt das alles (u.a.) von .StartRow (das verwendest Du) oder .EndRow (das verwende ich) abhängt. Dein obenstehender Code arbeitet nicht mit True, aber:
(a)ersetze 0 durch False (wenn False=0 ist auch meine Weltsicht wieder in Ordnung) und es funktioniert.
(b)ersetze 0 durch True UND ersetze .StartRow durch .EndRow und es funktioniert
aber
(c)ersetze 0 durch True oder 1, belasse jedoch .StartRow und es funktioniert nicht -->die zu kopierende Zeile wird in Zeile 2 kopiert (Row=1)

Ich habe noch nicht ausgiebig über die Gesamtsituation nachgedacht, unser Code ist in Details verschieden, aber ich würde zunächst folgende Interpretation geben:

(*)
gotoEndOfUsedArea bedeutet:
"nimm" die Enden des genutzten Bereichs
(**)
gotoEndOfUsedArea (x) bedeutet:
"nimm" Dir ein Ende des genutzten Bereichs wobei x darüber entscheidet welches Ende, ist x=True dann das hintere ("rechte untere Ecke") ist x=False dann das vordere ("linke obere Ecke") - denn so würde sich das Verhalten erklären was ich unter (c) beschreibe
(***)
.StartRow bzw. .EndRow regeln wo der Zugriff auf den Bereich gemäß (*) beginnt

Das Ganze ist eine Frage der Selection, auch wenn diese hier nur "virtuell" ist und kein wirkliches ".Select" ... das wiederum ist eine Problematik zu der Andrew Pitonyak in dem Dokument http://www.pitonyak.org/AndrewMacro.sxw einiges bezüglich Textdokumenten ausführt. Ein Buch basierend auf diesem Dokument ist am 1.August erschienen (USA) und ich hoffe das ich es noch diese Woche in Händen halten werde (habe es gestern bestellt), ich hoffe das ich dort bessere Erklärungen finden kann denn in dem Dokument bleibt einiges offen.

Ich habe jetzt sehr viel geschrieben, aber vielleicht trotzdem nicht den Kern des Problems erkannt (oder verkannt). Wie denkst Du darüber? Und da Du schreibst das Du einer Fehlermeldung erhältst poste doch bitte mal den genauen Inhalt Selbiger und Dein System! Bei mir läuft das auf SO7 PP2 und Windows 2000 SP4 so wie beschrieben.

Ich danke für die interessante Anregung.

Herzlichen Gruß
Stephan

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Di, 03.08.2004 22:47

Hallo Charly,
Bingo, Dein Code vom Di, 03.08.04 14:50 hat mir geholfen, mein Makro funktioniert wieder unter OOo. Hab Dank.

Hallo Stephan,
sei auch Du mir herzlich begrüßt.

Ich, als Greenhorn, erkenne doch die Schönheit, die Kürze und die Genialität Eurer Entwürfe. Kein Material bzw. keine Floskel unnötig verschwendet.

Nur leider gelingt es mir nicht, sie in meine Tabelle zu integrieren. Eigentlich nicht mehr notwendig, aber es interessiert mich trotzdem.
Ich brauchte also zunächst mal eine genaue Anweisung, wie ich Euer Progrämmchen mit Hilfe eines Schaltbottens auslösen kann.
Der Makrorekorder scheint Euren Dialekt nicht zu verstehen. Aber vielleicht mache ich auch blos irgend etwas falsch.

Es grüßt Euch herzlich vanglio

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Mi, 04.08.2004 07:30

Hallo Charly,
ich bin schon wieder an einem Punkt, den ich nicht formulieren kann. Für ein weiteres Makro benötige ich anschließend nach Deiner Version vom Di, 03.08.04 16:46 (GoToEndOfData) die Makroformulierung für:

Gehe 2 Zellen (oder Schritte) nach rechts, gehe 20 Cellen (oder Schritte) nach oben, copy.

Das sind die Formulierungen, die man mit dem Makrorekorder nicht erfassen kann.

Kannst Du noch mal helfen?

Herzlichen Gruß und Danke
vanglio

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly » Mi, 04.08.2004 07:37

Hallo Stephan!


Ich bin jetzt beim Befehl gotoEndOfUsedArea zum selben Ergebnis gekommen wie du. Meine Aussage mit der Fehlermeldung stimmt nicht. Ich hatte diese nur so im Hinterkopf auf Grund eines früheren Falles, wo ich nur mit (0) weitergekommen bin. Jetzt hatte ich die Variante mit (true) gar nicht mehr versucht.

Der Befehl scheint bei (0) die letzte Zelle des benutzten Bereiches zu selektieren. Da ist dann StartRow und EndRow natürlich identisch.

Bei (True) selektiert er den ganzen genutzten Bereich. StartRow ist dann 0 und da mein Be-fehl lautete Startrow + 1, schreibt das Makro den Text logischerweise in Zeile 2. Die ge-wünschte Zeile erhalte ich also nur mit EndRow+1.

Danke für deine Ausführungen. Sie haben mir beim künftigen Umgang mit den Booleans sehr geholfen.

Gruß
Charly

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly » Mi, 04.08.2004 07:53

Hallo Vanglio!

Ich bin jetzt leider nicht an meinem Computer zu Hause, auf dem ich OOo installiert habe. Die Befehle schauen so aus, wie der Befehl GoDown den ich dir schon gepostet habe, nur jetzt mit GoLeft, GoRight oder GoUp.

Aber du kannst die Befehle leicht mit dem Makrorecorder selber machen.
Gehe auf Aufzeichnen, klicke auf das Feld, wo dein Ausgangspunkt sein soll, und gehe mit den Pfeiltasten zu dem Feld dass du brauchst.
Du kannst anschließend die aufgezeichneten Befehle verkürzen, indem du alle hintereinander stehenden doppelten Befehle mit den dazugehörigen Argumenten löscht und bei dem verbliebenen Befehl im entsprechenden Argument statt 1 die gewünschte Anzahl der Zellen schreibst.

Gruß
Charly

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Mi, 04.08.2004 17:17

Hallo Charly,
Dein Tip hat geholfen, alles läuft jetzt auf OOo.

Ein kleiner Schönheitsfehler ist da noch.

Ich habe in meinem Calk-Tabellen-Dokument einzelne Zellen verschiedener Tabellenblätter mit " = " verbunden, sodaß die gleichen Werte angezeigt werden.
Mit Text formatiert erscheint in der kommunizierenden Zelle eine lästige Null, wenn die Ursprungszelle keinen Entrag hat.
Mit Datum formatiert erscheint in der kommunizierenden Zelle 30.12.1899,
wenn die Ursprungszelle keinen Entrag hat.
Kann man dieses Phänomen umgehen, oder muß man es hinnehmen?

Ansonsten hoff ich, dass es Dir gut geht und dass ich Dich mit meinen Fragen nicht allzusehr belästige.

Gruss vanglio

Stephan
********
Beiträge: 11029
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan » Mi, 04.08.2004 19:04

Hallo vanglio,

Mittels Formatierung weiß ich gerade nichts, aber das geht:
schreibst Du für:
=A3 einfach =WENN(A3="";"";A3)
das hilft in jedem Fall wenn A3 tatsächlich leer ist, falls A3=0 ist ist der Wert in der Zielzelle auch 0, wenn das stört dann schreiben =WENN(A3<>"";WENN(A3=0;"";A3);""). Wenn A3 einen Wert enthält ist eventuell die Formatierung der Zielzelle anzupassen.

Gruß
Stephan

vanglio
Beiträge: 8
Registriert: Mo, 02.08.2004 11:40
Wohnort: Berlin

Makro von SO5.2 nach OOo

Beitrag von vanglio » Do, 05.08.2004 13:00

Hallo Stephan,

Dein Vorschlag funktioniert gut auf dem gleichen Blatt.
Ich habe Deine Formel auf meine Bedürfnisse umgeschrieben, z.B. zwischen Formular- und Speichertabelle
In der Transferzelle steht : =$Formular.$B$15


Müßte also so aussehen:

=WENN($Formular.$B$15<>"";WENN($Formular.$B$15=0;"";$Formular.$B$15);"")

Funktioniert aber nicht.

Ich bin über´s Wochenende verreist.

Hab Dank, herzlich
vanglio

Antworten