Seite 1 von 1
Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: So, 31.05.2009 13:51
von Carlos
Hallo Zusammen,
ich habe ein ganz einfaches Makro erstellt, dass auch unter 'normalen' Bedingungen einwandfrei funktioniert.
Das Makro erzeugt einfach einen bestimmten Abstand über einem Absatz per Tastendruck.
Nun habe ich eine lange Tabelle mit drei Spalten. In diese Tabelle schreibe ich viel rein. Ich habe das Makro erzeugt, damit das Geschriebene innerhalb der Tabelle optisch besser gegliedert ist.
Aber innerhalb der Tabelle funktioniert es nicht.
Befindet sich der Cursor innerhalb (!) der Tabelle und führe ich das Makro aus, wird der Abstand zum Absatz ganz oben am Anfang des Dokuments, also außerhalb der Tabelle, erzeugt.
Komisch, da ja auch innerhalb der Tabelle Absätze existieren (ich schreibe innerhalb der Tabelle ganz normal mit Absätzen).
Weiß jemand Rat?
Herzlichen Dank!
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: So, 31.05.2009 19:18
von manese
Hallo Carlos,
um dir helfen zu können, müsste man dein Makro kennen.
Kopiere es doch mal, dann lässt sich Genaueres sagen!
Alles Gute
matthias
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: So, 31.05.2009 21:12
von Carlos
Hallo Matthias,
danke für Deine Antwort.
Hier ist es:
sub Absatz
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(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "TopBottomMargin.TopMargin"
args1(0).Value = 101
args1(1).Name = "TopBottomMargin.BottomMargin"
args1(1).Value = 0
args1(2).Name = "TopBottomMargin.TopRelMargin"
args1(2).Value = 100
args1(3).Name = "TopBottomMargin.BottomRelMargin"
args1(3).Value = 100
dispatcher.executeDispatch(document, ".uno:TopBottomMargin", "", 0, args1())
end sub
Ich muss dazu sagen, dass ich keine eigentliche Programmierarbeit mache. Ich drücke auf Start, mache die Schritte per Maus und drücke auf 'Makro beenden'.
Wenn ich mir aber als Laie das Makro anschaue, fällt mir 'TopBottomMargin' auf. Ich weiß nicht wie das reinkommt. Mit dem Cursor war ich jedenfalls immer innerhalb (!) der Tabelle.
Vielleicht kann jemand etwas damit anfangen.
Vielen Dank!
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: So, 31.05.2009 23:30
von turtle47
Hallo Carlos,
Carlos hat geschrieben:Aber innerhalb der Tabelle funktioniert es nicht.
Man muss den Cursor zunächst per Code in die Tabelle setzen, dann mit dem Cursor den Text markieren und dann das Format zuweisen.
Versuche mal folgenden Code:
Code: Alles auswählen
Sub Absatz_Formatierung_Tab
Dim oDoc as Object
Dim oAlleTabellen as Object, oEinzeleneTab as Object
oDoc=ThisComponent
If Not oDoc.SupportsService("com.sun.star.text.TextDocument") then exit sub
oAlleTabellen=oDoc.getTextTables 'alle Tabellen "holen"
for iAnzTab = 0 to oAlleTabellen.Count-1 'Schleife für die Tabellen setzen
oEinzeleneTab = oAlleTabellen.getByIndex(iAnzTab)'Tabelle per Index ansprechen
oTableCurs = oEinzeleneTab.createCursorByCellName("A1")'Cursor in Zelle setzen
oTableCurs.gotostart (False) 'Cursor gehe zum Anfang
oTableCurs.gotoend(True) 'Cursor gehe zum Ende und markiere den Inhalt
oTableCurs.ParaTopMargin = 100 'zuweisen Format vor Absatz
oTableCurs.ParaBottomMargin = 0 'zuweisen Format nach Absatz
next iAnzTab 'Schleife nächste Tabelle
msgbox "Es wurde(n) " & iAnzTab & " Tabelle(n) aktualisiert",64, "Absatzformat Tabelle"
End Sub
Dieser durchläuft
alle Tabellen in einem Dokument und setzt den eingestellten Abstand.
Wenn Du nur den Inhalt
einer Tabelle formatieren willst, dann setze den Cursor in die Tabelle und starte folgendes Makro:
Code: Alles auswählen
Sub Absatz_Formatierung_Tab1
oDoc = ThisComponent
oVC = oDoc.CurrentController.getViewCursor
If Not isEmpty(oVC.TextTable) then
TableName = oVC.TextTable.Name
oAlleTabellen=oDoc.getTextTables
oEinzeleneTab = oAlleTabellen.getByName(TableName)
oTableCurs = oEinzeleneTab.createCursorByCellName("A1")
oTableCurs.gotostart (False)
oTableCurs.gotoend(True)
oTableCurs.ParaTopMargin = 100 'vor Absatz
oTableCurs.ParaBottomMargin = 0 'nach Absatz
end if
End Sub
Hilft das weiter?
Jürgen
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: Mo, 01.06.2009 10:11
von Carlos
Hallo Jürgen,
erst einmal sehr herzlichen Dank für Deine Mühe!
Leider hat es nicht ganz geklappt. Das liegt aber wahrscheinlich daran, dass ich versuchen sollte die Zielsetzung vom Makro genauer zu beschreiben.
Das Dokument besteht aus einer (!) Tabelle. Die Tabelle ist sehr groß (hat drei Spalten), sie geht über mehrere Seiten, hat also viele Zeilen.
Innerhalb der Spalten und Zeilen schreibe ich viel rein, mit kleiner Schrift und sehr eng zusammengedrückt (kaum Zeilenabstand).
Um die Masse an Geschriebenem besser visuell zu strukturieren, sollen bestimmte, nicht alle Zeilen einen größeren Abstand zur Zeile drüber erhalten, der vom Makro erzeugt werden soll.
Dein Makro (ich habe das zweite verwendet, weil ich ja nur eine Tabelle im Dokument habe) hat insofern funktioniert, da es den Abstand erzeugt hat. Jedoch leider für alle Zeilen.
Zielsetzung wäre also, mit dem Cursor in die betreffende Zeile reinzuspringen, die einen größeren Abstand erhalten soll und nur in dieser Zeile erzeugt das Makro den größeren Abstand. Ist dies möglich?
Herzlichen Dank!
Gruß, Carlos
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: Di, 02.06.2009 09:59
von turtle47
Hi Carlos,
Carlos hat geschrieben:Zielsetzung wäre also, mit dem Cursor in die betreffende Zeile reinzuspringen, die einen größeren Abstand erhalten soll und nur in dieser Zeile erzeugt das Makro den größeren Abstand. Ist dies möglich?
Sollte so funktionieren:
Code: Alles auswählen
Sub Absatz_Formatierung_Tab2
Dim oAlleTabellen as Object, oEinzeleneTab as Object, oDoc as Object
Dim oVCurs, oTable, oCurCell
Dim i as integer, CellRow as integer
Dim myCell as String
oDoc = thisComponent
oAlleTabellen=oDoc.getTextTables
oVCurs = ThisComponent.getCurrentController().getViewCursor()
If IsEmpty(oVCurs.TextTable) Then
msgbox "Der Cursor befindet sich nicht innerhalb einer Zelle!", 48, "Absatz formatieren"
Else
oTable = oVCurs.TextTable
MyTable = oTable.name
oAll_Tables = oDoc.getTextTables
oAll_Tables=oDoc.getTextTables
oEinzeleneTab = oAll_Tables.getByName(MyTable)
myColumns=oEinzeleneTab.columns
Anz_Columns = myColumns.count
oCurCell = oVCurs.Cell
myCell = oCurCell.CellName
TabRows = CInt(Right(myCell, Len(myCell)-1)) -1
End If
If Not isEmpty(oTable) then
for i = 0 to Anz_Columns -1
oTableCurs = oTable.getCellByPosition(i,TabRows).createTextCursor()
oTableCurs.ParaTopMargin = 200 'vor Absatz
oTableCurs.ParaBottomMargin = 0 'nach Absatz
next i
end if
End Sub
Das Makro ist so umfangreich weil zunächst abgefragt wird ob sich der Cursor überhaupt in einer Tabelle befindet und dann noch in welcher. Es können sich also auch mehrere Tabellen im Dokument befinden. Ausserdem wird auch die Anzahl der Spalten berücksichtigt.
Viel Spass damit.
Jürgen
Re: Makro funktioniert nicht innerhalb einer Tabelle
Verfasst: Di, 02.06.2009 21:30
von Carlos
Hallo Jürgen,
vielen Dank für Deine nochmalige Mühe.
Leider funktioniert es nicht richtig. Es wird nicht ein größerer Abstand erzeugt für die Zeile in der der Cusor steht, sondern für die erste Zeile innerhalb einer Spalte.
Jetzt hätte ich aber ein schlechtes Gewissen dich nochmals um Hilfe zu bitten.
Ich denke, dass ich hier einfach manuell arbeite, das ist wirklich kein Drama.
Nochmals herzlichen Dank für deine Arbeit.
Gruß, Carlos