Seite 1 von 1

makro führt aufgezeichnete schritte nicht richtig aus

Verfasst: Sa, 17.02.2007 08:35
von byteeater
guten morgen,

hab mich mal bissl mit makros beschäftigt und bin dank eurer hilfe schon etwas weiter als ich ursprünglich vor hatte :-)


jetzt aber stoße ich schon wieder an die grenzen (meine).

ich habe ein makro aufgezeichnet mit dem ein neues tabellenblatt entstehen soll. das soll so passieren:

ein existierendes tabellenblatt namens "1_1" soll kopiert werden.
die kopie soll VOR dem kopierten Tabellenblatteingefügt werden.
die kopie soll auch in "NEU" umbenannt werden.


wenn ich auf makro ausführen klicke wird aber nur das existierende tabellenblatt umbenannt aber es entsteht keine kopie. Woran könnte das liegen?

hier mal der code des aufgezeichneten makros :




sub neu2
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(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "DocName"
args2(0).Value = "schlagkarte2.ods"
args2(1).Name = "Index"
args2(1).Value = 2
args2(2).Name = "Copy"
args2(2).Value = true

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

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Name"
args3(0).Value = "NEU"

dispatcher.executeDispatch(document, ".uno:RenameTable", "", 0, args3())

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

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


end sub



könnt ihr daraus vielleicht einen fehler erkennen?
wäre euch sehr verbunden!

lg bernd

Verfasst: Sa, 17.02.2007 10:11
von Karolus
Hallo Bernd

Hättest du doch gleich bei Dannenhöfer reingeschaut:
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig152

Da findest du die Lösung als 2-zeiler:

Code: Alles auswählen

Sub Tabblattcopy
myDoc = thisComponent
myDoc.Sheets.CopyByName("1_1","NEU",1)
'braucht 3 Parameter "Blattname","neuerBlattname",index des neuen Tabellenblatts
End Sub
Gruß Karo

Verfasst: Sa, 17.02.2007 14:11
von byteeater
Ja das geht. SUPER.
:D
Der link ist sehr hilfreich habe schon bissle gestöbert.


nur wenn das makro mehrere male hintereinander ausführe kommt ein Laufzeitfehler.

könnte man den befehl so gestalten, daß mit jedem weiteren klick ein weiteres blatt zugefügt wird eventuell mit einer fortlaufenden nummer ( also Neu1 Neu2 Neu3 Neu4 usw.)

Verfasst: Sa, 17.02.2007 22:47
von byteeater
also jetzt hab ich nochmal probiert und es will einfach nicht klappen, wie im vorigen post beschrieben.

leider fehlen mir die kenntnisse welche befehle diese funktion auslösen.

wäre sehr nett, wenn ihr mir nochmals auf die sprünge helfen könntet.
vielen dank und schönen abend noch.

Verfasst: So, 18.02.2007 12:21
von byteeater
ich habe noch eine bessere Idee.

wie stelle ich das an:

ich habe in tabelle 1 in spalte A

1
2
3
4
5
6
7
8

stehen.
ist es möglich je nach dem wie viele Zeilen in Spalte A belegt sind die gleiche anzahl Tabellenblätter zu erstellen? und wäre es auch möglich, die namen bzw. zahlen in Spalte A gleich als Name für die Tabellenblätter eintragen zu lassen.

lg bernd

Verfasst: So, 18.02.2007 18:35
von Karolus
Hallo Bernd

Ginge es mit folgendem :
(Ausgangsvoraussetzung ist ein Tabellendokument mit zwei Blättern das zweite Blatt mit den Namen "Schlag 1")

Code: Alles auswählen

Sub blaetterkopieren
myDoc = thisComponent
for b = 0 to 30  'kopiert 31 mal
myDoc.Sheets.CopyByName("Schlag " & b+1,"Schlag " & b+2, b+2)
next
End Sub
Gruß Karo

Verfasst: Mo, 19.02.2007 07:52
von byteeater
mein tabellendokument:

blatt1 : "EINGABE"
blatt2 : "1_1" (also für schlag 1)
und weitere 3 hilfstabellenblätter die nicht weiter stören sollten.

so habe ich jetzt deinen code umgeändert:

sub neu3

myDoc = thisComponent
for b = 0 to 30 'kopiert 31 mal
myDoc.Sheets.CopyByName("1_1 " & b+1,"1_1" & b+2, b+2)
next

end sub


es wir d ein fehler angezeigt:

Basic Laufzeitfehler.
Es ist eine Exception aufgetreten.
Type:com.sun.star.uno RuntimException
Massage: .


ich hab bestimmt was falsches eingetragen?

Verfasst: Mo, 19.02.2007 08:56
von Toxitom
Hey Byteeater,
ich hab bestimmt was falsches eingetragen?
Na ja, wie man es nimmt. Deine Stringverkettung funktioniert so nicht.
...CopyByName("1_1 " & b+1,"1_1" & b+2, b+2)
Setz mal für die erste Schleife b=0 ein, dann kommt heraus:

Code: Alles auswählen

..CopyByName("1_10 " ,"1_12", 2) 
d.h. dein Arbeitsblatt mit Namen "1_10" wird kopiert und als Arbeitsblatt mit dem Namen "1_12" an der dritten Position eingefügt.
Also, ich glaube nicht, dass es das ist, was du willst. Und ein Blatt "1_10" hast du auch nicht, daher also der Fehler.
Es müsste heissen:

Code: Alles auswählen

myDoc.Sheets.CopyByName("1_" & b+1,"1_" & b+2, b+2)
dann sollte es funktionieren.

Gruss
Thomas

Verfasst: Mo, 19.02.2007 10:10
von byteeater
die sache funktioniert wohl wie sie soll.

allerdings wird mir nicht jedesmal beim makro auslösen 1 tabellenblatt erstellt sondern halt 31.ich brauche aber pro auslösung nur 1 NEUES tabellenblatt. geht das irgendwie einzurichten?

Was ich noch bemerkt habe: die neuen blätter werden HINTER das Blatt 1_1 geschrieben. Das wäre ja schön, WENN da nicht alle bezüge meines blattes 1_1 nichtmehr funktionieren würden.

Komischerweise: kopiere ich das blatt 1_1 vor sich selbst bleiben alle bezüge richtig erhalten.

kann man da noch was einstellen was ich bis jetzt nicht mitbekommen habe? :oops:

lg bernd

Verfasst: Mo, 19.02.2007 12:55
von Toxitom
Hey Bernd,
beim makro auslösen 1 tabellenblatt erstellt sondern halt 31.
Klar, da ist ja auch eine Schleife mit 31 Durchläufen. Ich denke, so war es mal gewünscht?
Na egal, dann pass halt die Schleife an bzw, nimm sie ganz raus, um nur einen Durchlauf zu erhalten.
Bann musst du halt die Variable "b" andersweitig bestimmen, entweder über einen Zähler im Tabellenblatt oser durch extrahieren des letzten Zeichends der aktuellen Tabelle etc.
..die neuen blätter werden HINTER das Blatt 1_1 geschrieben.
Klar, auch das war wohl so gewollt. Der dritte Parameter des Kopie-Befehls gibt die Position an, an der das Tabellenbaltt eingefügt wird (Index, beginnt bei 0!). Da kannst du jaa mit rumspielen.
WENN da nicht alle bezüge meines blattes 1_1 nichtmehr funktionieren würden
?? Bezüge haben den Namen des Tabellenblattes in der Formel, und der funktioniert, unabhängig davon, wo sich die Tabelle befindet. wahrscheinlich jedoch hast du ein anders Problem: Beim Kopieren werden Bezüge relativ angepasst, wenn sie nicht mit dem "$" absolut fixiert wurden. Das gilt natürlich auch für Tabellen. Kopierst du also eine Tabelle mit Bezügen (ohne Fxierung) auf die rechts nächste Tabelle, so werden diese Bezüge ebenfalls um Index 1 erhöht.

Viele Grüße
Thomas

Verfasst: Mo, 19.02.2007 15:26
von byteeater
Ja du hattest recht :oops:
jetzt hab ich erstmal alle relevanten bezüge mit $ zeichen versehen. jetzt sehen die neu erstellten blätter exakt so aus wie sie sollen.

(Ich hoffe meine fragen sind nicht zu dumm oder nerven(

ich habe jetzt einen Zähler in mein tabellenblatt in Zeile B31 des blattes EINGABE eingebaut der alle zeilen zählt, die ich möchte. als augabe erscheint ja eine Zahl.

wie muß ich jetzt im makro den Bezug zum Zähler herstellen, damit genau diese Anzahl an Blättern erstellt wird?


lg bernd

Verfasst: Mo, 19.02.2007 16:52
von Toxitom
Hey Bernd,
wie muß ich jetzt im makro den Bezug zum Zähler herstellen, damit genau diese Anzahl an Blättern erstellt wird?
Na ja, du liest den Inhalt der Zelle im Makro aus:

Code: Alles auswählen

b = thisComponet.sheets.getByName("DeinTabelenName").getCellRangeByName("B31").value
b hat jetzt den Wert des Zählers (die Zahl), und die nutzt du jetzt entweder als Schleifensteuerung oder - falls du nur eine Tabelle erzeugen willst - direkt im Aufruf. Eventuell musst du den Wert halt noch "bereinigen", das hängt ahlt von deinen Zielen etc ab.

Gruss
Thomas

Verfasst: Mo, 19.02.2007 20:56
von byteeater

Code: Alles auswählen

sub neu3

myDoc = thisComponent
for b = 0 to myDoc.sheets.getByName("EINGABE").getCellRangeByName("B31").value
' myDoc.Sheets.CopyByName("1_1","NEU" & b+2, b+2)
myDoc.Sheets.CopyByName("1_1","N" & b+1, b+2)
next

end sub

so hab ich das jetzt hingefummelt.:-) hattest ja noch nen stolperstein eingebaut :lol:

was tut es jetzt:

je nachdem wieiele zeilen im tabellenblatt "EINGABE" sind genauso viele neue blätter werden generiert (dabei werden diese "N1"; "N2"; und so weiter benannt ) ich brauche ihnen dann nur noch das gewünschte kürzel zu verpassen.

das heißt für meinen konkreten fall: wenn ich 25 Feldstücken im blatt "EINGABE" hab generiert mir das makro 24 neue Blätter um inklusive dem ersten blatt 1_1 25 zu ergeben. und ich muß nicht nachzählen und 24 mal kopieren drücken :idea: SUPER


habt vielen DANK.

jetzt muß ichs doch mal loswerden. Das hier ist das kompetenteste Forum, was ich kenne und was mich vor allem erstaunt, wie ruhig und freundlich auch anfängern wie mir gegenüber geholfen wird ( was hier fehlt, aber was ich !!! GARNICHT !!!vermisse ist dieses "von oben herab" > fragt die FAQ - NICHT UNS - getue). DAS ZEICHNET EUCH AUS !!!

nochmals herzlichen Dank und liebe Grüße
bernd

Re: makro führt aufgezeichnete schritte nicht richtig aus

Verfasst: Mo, 06.08.2007 16:26
von byteeater
hallo,
leider muß ich an das thema nochmal anknüpfen. gerade habe ich folgendes makro aufgezeichnet

Code: Alles auswählen


sub test
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())

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

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


end sub
damit wollte ich erreichen, daß das gesamte dokument gespeichert wird , dann die datenpilottabelle per knopfdruck aktualisiert und am ende nochmals gespeichert wird.

nun, speichern tuts einmal, aber die tabelle wird nicht NICHT aktualisiert. es ist auch nichts auskommentiert.

ich könnte mir auch vorstellen, vielleicht kann man ja irgendwie in den befehl einflechten daß das ganze tabellenblatt mit der datenpilottabelle aktualisiert wird.

wie immer dankbar auf hilfe hoffend
bernd