PDA

Vollständige Version anzeigen : VBA -- Formel ausrichten


C-J
11.08.2009, 11:00
Hallo zusammen,
ich habe ein Problem mit der Ausrichtung von Formeln innerhalb einer Tabelle ..

Ich erklär erst mal kurz das Makro:
Je nachdem, was auf einer Userform ausgewählt wurde ("links" oder "zentriert"), wird eine Tabelle (2 Reihen und 2 ODER 3 Spalten) erzeugt.
Das Problem ist, wenn ich eine neue Formel mit dem Makro einfügen möchte und "zentriert" wähle, werden ALLE Formeln im ganzen Dokument zentriert gesetzt.
Wenn ich die nächste Formel "linksbündig" mit dem Makro einfüge, werden ALLE Formeln im Dokument linksbündig :(

Diese beiden Zeilen sind der jeweilige Übeltäter:
'Formeloptionen auf Zentriert als Gruppe setzen
ActiveDocument.OMathJc = wdOMathJcCenterGroup
'Formeloptionen auf Links setzen
ActiveDocument.OMathJc = wdOMathJcLeft

Und zwar "ActiveDocument" ist einfach zu global :D aber ich weiß nicht, wie ich das nur auf die letzte (aktuelle) Formel beschränken kann ...

Ich habe mal so was hier versucht .. aber bin da nicht weitergekommen.
.ParentOMath.Justification = wdOMathJcLeft


Ach ja, bitte nicht wundern, es könnte sein, dass im Code überflüssiges steht. Ich bin das Makro auf meine Bedürfnisse am anpassen.


Hier die Konstanten:
Const conRest = ": "
Const conFVREF2000 = "STYLEREF ""Überschrift 1"" \n "
Const conFieldFormel = "SEQ Formel \s1"
Const conStyleFormel = "Formel"

Hier der Code:
Private Sub HandleFormel()
Dim tblT1 As Table
Dim borderTmp As Border
Dim cellTmp As Cell
Dim W As Double
Dim L As Double
Dim R As Double
Dim Bundsteg As Double
Dim RTMarg As Double
Dim intRightCell As Integer
Dim sect As Section

On Error GoTo bye

' Überprüft ob Eingabemarke in Tabelle steht
If Selection.Information(wdWithInTable) Then
MsgBox "Die Eingabemarke befindet sich innerhalb einer Tabelle. " _
& "Bewegen Sie sie aus der Tabelle heraus, um das Makro zu " _
& "starten.", vbInformation
GoTo bye
End If

With Selection
.InsertParagraphAfter
.Collapse (wdCollapseEnd)

On Error Resume Next
.ParagraphFormat.Style = "FormelTabelle"
On Error GoTo 0

W = .Sections.Last.PageSetup.PageWidth
L = .Sections.Last.PageSetup.LeftMargin
R = .Sections.Last.PageSetup.RightMargin
Bundsteg = .Sections.Last.PageSetup.Gutter
RTMarg = W - R - L - Bundsteg
If optFormelZentriert Then
Set tblT1 = .Tables.Add(Selection.Range, 2, 3)
'Formeloptionen auf Zentriert als Gruppe setzen
ActiveDocument.OMathJc = wdOMathJcCenterGroup
Else
Set tblT1 = .Tables.Add(Selection.Range, 2, 2)
'Formeloptionen auf Links setzen
ActiveDocument.OMathJc = wdOMathJcLeft
End If
End With
tblT1.Select
With Selection
If optFormelZentriert Then
.Columns(1).Cells.Width = 50.4
.Columns(3).Cells.Width = 50.4
.Columns(2).Cells.Width = RTMarg - 100.8
intRightCell = 3

Else
.Columns(2).Cells.Width = 50.4
.Columns(1).Cells.Width = RTMarg - 50.4
intRightCell = 2
End If

.Rows(1).Select
For Each borderTmp In Selection.Borders
borderTmp.LineStyle = wdLineStyleNone
Next
.Borders.shadow = False
.ParagraphFormat.Alignment = wdAlignParagraphRight
.Rows(1).Select
For Each cellTmp In .Cells
cellTmp.VerticalAlignment = wdCellAlignVerticalCenter
Next
End With
tblT1.Select
With Selection
.Rows(2).Select
'.Rows(2).Cells(intRightCell).Select
.Cells.Merge
EinfügenFormelNummmer
End With
tblT1.Select
With Selection
.Rows(1).Select
.Cells(intRightCell - 1).Select
If optFormelZentriert Then
.ParagraphFormat.Alignment = wdAlignParagraphCenter
Else
.ParagraphFormat.Alignment = wdAlignParagraphLeft
End If
On Error GoTo err_
End With

WordBasic.ShowTableGridlines

'Zuweisung der Formatvorlage
On Error GoTo errFormel
Selection.Style = ActiveDocument.Styles(conStyleFormel)
errFormel:

Selection.MoveLeft Unit:=wdCharacter, count:=1, Extend:=wdExtend

WordBasic.EquationEdit

bye:
Unload NrFormel
Exit Sub

err_:
MsgBox Err.Number & " - " & Err.Description
Resume Next
End Sub

Vielleicht kann mir da ja jemand bei weiterhelfen :)

Bin für alle Antworten dankbar!

Gruß,
CJ

C-J
11.08.2009, 12:54
So, nachdem ich jetzt weitere drei Stunden herumexperimentiert habe, ist mir eine halbwegs akzeptable Lösung gelungen ..

Option Explicit

Const conRest = ": "
Const conFVREF2000 = "STYLEREF ""Überschrift 1"" \n "
Const conFieldFormel = "SEQ Formel \s1"
Const conStyleFormel = "Formel"



Private Sub cmdCancel_Click()
Unload NrFormel
End Sub

Private Sub cmdOK_Click()
If optFormelLinks Or optFormelZentriert Then
Call HandleFormel

End If
Unload NrFormel
End Sub

Private Sub HandleFormel()
Dim tblT1 As Table
Dim borderTmp As Border
Dim cellTmp As Cell
Dim W As Double
Dim L As Double
Dim R As Double
Dim Bundsteg As Double
Dim RTMarg As Double
Dim intRightCell As Integer
Dim sect As Section
Dim oCl As Word.Cell

On Error GoTo bye

' Überprüft ob Eingabemarke in Tabelle steht
If Selection.Information(wdWithInTable) Then
MsgBox "Die Eingabemarke befindet sich innerhalb einer Tabelle. " _
& "Bewegen Sie sie aus der Tabelle heraus, um das Makro zu " _
& "starten.", vbInformation
GoTo bye
End If

With Selection
.InsertParagraphAfter
.Collapse (wdCollapseEnd)

On Error Resume Next
.ParagraphFormat.Style = "FormelBeschriftung"
On Error GoTo 0

W = .Sections.Last.PageSetup.PageWidth
L = .Sections.Last.PageSetup.LeftMargin
R = .Sections.Last.PageSetup.RightMargin
Bundsteg = .Sections.Last.PageSetup.Gutter
RTMarg = W - R - L - Bundsteg
If optFormelZentriert Then
Set tblT1 = .Tables.Add(Selection.Range, 2, 3)
'Formeloptionen auf Zentriert als Gruppe setzen
For Each oCl In Selection.Cells
oCl.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
Next
'ActiveDocument.OMathJc = wdOMathJcCenterGroup
Else
Set tblT1 = .Tables.Add(Selection.Range, 2, 2)
'Formeloptionen auf Links setzen
For Each oCl In Selection.Cells
oCl.Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
Next
'ActiveDocument.OMathJc = wdOMathJcLeft
End If
End With
tblT1.Select
With Selection

If optFormelZentriert Then
.Columns(1).Cells.Width = 50.4
.Columns(3).Cells.Width = 50.4
.Columns(2).Cells.Width = RTMarg - 100.8
intRightCell = 3
For Each oCl In Selection.Cells
oCl.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
Next
Else
.Columns(2).Cells.Width = 50.4
.Columns(1).Cells.Width = RTMarg - 50.4
intRightCell = 2
For Each oCl In Selection.Cells
oCl.Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
Next

End If

.Rows(1).Select
For Each borderTmp In Selection.Borders
borderTmp.LineStyle = wdLineStyleNone
Next
.Borders.shadow = False
.ParagraphFormat.Alignment = wdAlignParagraphRight
.Rows(1).Select
For Each cellTmp In .Cells
cellTmp.VerticalAlignment = wdCellAlignVerticalCenter
Next
End With
tblT1.Select
With Selection
.Rows(2).Select
'.Rows(2).Cells(intRightCell).Select
.Cells.Merge
EinfügenFormelNummmer
End With
tblT1.Select
With Selection
.Rows(1).Select
.Cells(intRightCell - 1).Select
If optFormelZentriert Then
.ParagraphFormat.Alignment = wdAlignParagraphCenter
Else
.ParagraphFormat.Alignment = wdAlignParagraphLeft
'.OMaths(1).ParentOMath.type = wdOMathInline
End If
On Error GoTo err_
End With

WordBasic.ShowTableGridlines

'Zuweisung der Formatvorlage
On Error GoTo errFormel
Selection.Style = ActiveDocument.Styles(conStyleFormel)
errFormel:

Selection.MoveLeft Unit:=wdCharacter, count:=1, Extend:=wdExtend

WordBasic.EquationEdit
If optFormelLinks Then
Selection.OMaths(1).ParentOMath.type = wdOMathInline
End If
bye:
Unload NrFormel
Exit Sub

err_:
MsgBox Err.Number & " - " & Err.Description
Resume Next
End Sub

Sub EinfügenFormelNummmer()
Dim strTmp As String
Dim bTmp As Boolean
Dim cap As CaptionLabel
Dim intStelle As Integer

With Selection

.TypeText Text:=""

intStelle = InStr(Application.Version, ".")
Select Case CInt(Left(Application.Version, intStelle - 1))
Case 8
' .Fields.Add Range:=.Range, Type:=wdFieldEmpty, Text:= _
' conFVREF, PreserveFormatting:=True
Case Else
'.Fields.Add Range:=.Range, type:=wdFieldEmpty, Text:= _
' conFVREF2000, PreserveFormatting:=True
End Select

.EndKey Unit:=wdLine
.TypeText Text:="Formel: "

strTmp = conFieldFormel


.Fields.Add Range:=.Range, type:=wdFieldEmpty, Text:= _
strTmp, PreserveFormatting:=True
'.TypeText Text:=conRestFormel

End With
End Sub



Private Sub DeactivateBeschriftung()
' lblPrefix.visible = False
' txtBeschriftung.visible = False
End Sub

Private Sub ActivateBeschriftung()
' lblPrefix.visible = True
' txtBeschriftung.visible = True
End Sub

Private Sub optFormelLinks_Click()
Call DeactivateBeschriftung
End Sub

Private Sub optFormelZentriert_Click()
Call DeactivateBeschriftung
End Sub





und zwar wird die Formal in ein Inline-irgendwas verwandelt und dann klappt auch die Zellausrichtung .. das ganze habe ich mir mehr oder weniger zusammengeklickt ..
Erklärungen wieso, weshalb, warum und Codeverbesserungen sind immer wilkommen! :)

Bei mir wird die Formelbeschriftung allerdings UNTER der Formel angelegt, dass kann man aber im Code anpassen ... normalerweise sollen die Formelbschriftungen ja NEBEN der Formel stehen ..

Gruß,
CJ