2016-08-17 4 views
1

Ich versuche ein Makro zu erstellen, das die Schriftfarbe von Text in einer Zelle auf Weiß und den Zellhintergrund auf Schwarz unter Verwendung von VBA in Publisher setzt.Wie kann ich die Hintergrundfarbe der ausgewählten Zelle im Publisher festlegen

Bis jetzt habe ich es geschafft, die Schriftfarbe zu ändern, aber ich habe wirklich Schwierigkeiten mit dem Hintergrund - ich kann nicht den richtigen Wert finden, um zu ändern.

Hier ist, was ich bisher:

Sub set_to_clue() 

Selection.TextRange.Font.Color.RGB = RGB(255, 255, 255) 
Selection.TextRange.Font.Fill.BackColor.RGB = RGB(0, 0, 0) 

End Sub 

Fortschritt Mit etwas weiteren Versuch und Irrtum ich gearbeitet habe, wie Zellhintergründe zu bekommen, aber zu ändern, zur Zeit kann ich es nur durch Spezifizieren einer Artikelnummer für die CellRange. Dies bedeutet, dass die Zelle, die ihre Farbe ändert, fest codiert ist und nicht die ausgewählte. Wie kann ich die Artikelnummer berechnen?

Sub set_to_clue() 

Selection.TextRange.Font.Color.RGB = RGB(255, 255, 255) 
Selection.TableCellRange.Item(10).Fill.ForeColor.RGB = RGB(0, 255, 0) 

End Sub 

Antwort

0

Ich habe jetzt eine funktionierende Version, obwohl ich sicher bin, dass es nicht die richtige oder eleganteste Möglichkeit ist, das Ziel zu erreichen.

Es funktioniert auch nur dann, wenn die Zelle selbst vollständig markiert ist und nicht nur der Text darin oder nur der Cursor in der Zelle ist. Ich kann daran arbeiten, das später zu verbessern.

Arbeitscode in Publisher 2016:

Sub invert_square() 

For Each square In Selection.TableCellRange 
    If square.Selected = True Then 
     square.Fill.ForeColor.RGB = RGB(0, 0, 0) 
     square.TextRange.Font.Color.RGB = RGB(255, 255, 255) 
     Exit For 
    End If 
    Next 

End Sub 
0

Dieser Code erweitert, so dass es für die gesamte Tabelle funktioniert, wenn die Tabelle als Ganzes ausgewählt (Auswahl Typ pbSelectionShape und Formtyp pbTable) und für die gesamte Zelle, wenn die Auswahl vom Typ pbSelectionText ist.

Der Trick für die letztere Funktionalität besteht darin, dass sich das .ContainingObject auf die gesamte Form bezieht und dass jede Tabellenform aus einem Story-Objekt besteht. Die Eigenschaften .Start und .End eines TextRange-Objekts beziehen sich auf seine Position innerhalb des Story-Objekts. Durch den Vergleich dieser beiden Eigenschaften können wir identifizieren, zu welcher Zelle der ausgewählte Text gehört (in Publisher ist es nicht möglich, gleichzeitig ein wenig Text in mehreren verschiedenen Zellen auszuwählen).

Bevor ich diesen Ansatz herausgefunden habe, habe ich versucht, .Parent aufzurufen, bis TypeName() gleich "Cell" ist, aber das würde nicht funktionieren, weil das .Parent für Selection.TextRange Selection ist (und nicht das Parent in der Dokument selbst als I)

Option Explicit 

Sub InvertSquare() 
    ActiveDocument.BeginCustomUndoAction "Invert square" 

    Dim oCell As Cell 
    Dim oShape As Shape 

    If selection.Type = pbSelectionTableCells Then 
     Debug.Print "Table cells" 

     For Each oCell In selection.TableCellRange 
      SetInvertedColors oCell 
     Next oCell 

    ElseIf selection.Type = pbSelectionText Then 
     Debug.Print "Text" 

     Dim selText As TextRange 
     Dim x As Variant 

     Set selText = selection.TextRange 
     Set x = selText.ContainingObject 

     If TypeName(x) = "Shape" Then 
      If x.Type = pbTable Then 
       For Each oCell In x.Table.Cells 
        If oCell.HasText Then 
         If oCell.TextRange.Start <= selText.Start Then 
          If oCell.TextRange.End >= selText.End Then 
           SetInvertedColors oCell 
           Exit For 
          End If 
         End If 
        End If 

       Next oCell 
      End If 
     End If 

    ElseIf selection.Type = pbSelectionShape Then 
     Debug.Print "ShapeRange" 

     Dim oShapes As ShapeRange 

     Set oShapes = selection.ShapeRange 
     For Each oShape In oShapes 
      If oShape.Type = pbTable Then 
       For Each oCell In selection.TableCellRange 
        SetInvertedColors oCell 
       Next oCell 
       Exit For 
      End If 
     Next oShape 
     Debug.Print "Shape" 
    End If 

    ActiveDocument.BeginCustomUndoAction "Invert square" 
End Sub 


Sub SetInvertedColors(oCell As Cell) 
    Debug.Print oCell.TextRange.Text 
    oCell.TextRange.Font.Color = RGB(255, 255, 255) 
    ''oCell.Fill.ForeColor.RGB = RGB(0, 0, 0) ''Out of memory error for whatever reason 
End Sub 

aus irgendeinem Grund hatte gehofft, erhalte ich eine außerhalb des Speicherfehler, wenn ich versuche, die .ForeColor.RGB in Publisher zu setzen, aber dies geschieht mit Ihrem Code auch für mich, so dass ich Ich hoffe, dass es für dich sowieso funktioniert, wenn du die vorletzte Zeile kommst.

Verwandte Themen