2016-05-02 16 views
1

Bei der Konvertierung eines VBA-Makros in ein in C# codiertes Plug-in bin ich in die folgende Sackgasse geraten.C# Konvertieren eines VBA-Makros in C# mit benutzerdefinierter RGB-Farbe

Der ursprüngliche VBA-Code ist:

Selection.Font.Name = "Times New Roman" 
Selection.Font.Size = 14 
Selection.Font.Bold = True 
Selection.Font.BoldBi = True 
Selection.Shading.Texture = wdTextureNone 
Selection.Shading.ForegroundPatternColor = wdColorAutomatic 
Selection.Shading.BackgroundPatternColor = RGB(173, 216, 230) 

mit dem Office.Interop Namespace C# konvertiert:

using Microsoft.Office; 
using Microsoft.Office.Interop; 
using Word = Microsoft.Office.Interop.Word; 

Word.Document oWordDoc = new Word.Document(); 
var Selection = oWordDoc.ActiveWindow.Selection; 

Selection.Font.Name = "Times New Roman"; 
Selection.Font.Size = 14; 
Selection.Shading.Texture = Word.WdTextureIndex.wdTextureNone; 
Selection.Shading.ForegroundPatternColor = Word.WdColor.wdColorAutomatic; 
Selection.Shading.BackgroundPatternColor = Word.ColorFormat.RGB(173, 216, 230); 

Dieser Code wird nicht kompiliert als die RGB keine Methode ist. Ich versuche herauszufinden, wie ich das mit den verfügbaren Methoden machen kann, aber bisher kein Glück.

Ich würde mich über jeden Hinweis auf diese oder irgendeine Beschreibung freuen, die die Umwandlung erklären würde.

Update:

Eigentlich sieht es aus wie die folgenden Werke:

Color mycolor = Color.FromArgb(173, 216, 230); 
Selection.Shading.BackgroundPatternColor = (Word.WdColor)(mycolor.R + 0x100 * mycolor.G + 0x10000 * mycolor.B); 

This question den gleichen Ansatz verwendet. Aber es sieht immer noch zu komplex ...

Update 2:

Mit den Vorschlägen unten scheint die glatte Ansatz zu sein:

Selection.Shading.BackgroundPatternColor = RGB(172,216,230); 

private Word.WdColor RGB(int p1, int p2, int p3) 
{ 
    return (Word.WdColor)p1 + (0x100 * p2) + (0x10000 * p3); 
} 
+1

Sie könnten versuchen die 'Color.ToArgb()' Methode und sehen, ob das Ihnen die gleiche Farbe gibt. – TyCobb

Antwort

1

Die RGB Funktion sind Sie eigentlich Aufruf in Ihr VBA-Code befindet sich in der VBA-Standardbibliothek im Modul Information - zumindest gemäß der kontextabhängigen Statusleiste Rubberduck 2.0 (Disclaimer: Ich habe dieses Feature geschrieben):

Rubberduck 2.0's context-sensitive status bar

Die RGB Funktion tut wirklich nichts mehr als 3 Zahlen aufzunehmen und einen entsprechenden RGB Hex-Wert auszugeben.

This question fragt speziell, wie man von System.Drawing.Color in einen WdColor Wert umwandelt - und die angenommene Antwort sieht ziemlich genau wie Ihr "zu komplexer" Code aus. Eine andere Lösung wäre, Microsoft.VisualBasic zu importieren und die gleiche Information.RGB Funktion zu verwenden ... aber ich schaudere, wann immer ich die Microsoft.VisualBasic irgendwo in einem .NET-Projekt importiert sehe - es riecht nach etwas, das falsch gemacht wird.

Stattdessen könnten Sie eine einfache Erweiterung Methode machen:

using System.Drawing; 
using Microsoft.Interop.Word; 

static class ColorExtensions 
{ 
    public static WdColor ToWdColor(this Color color) 
    { 
     return (WdColor)(color.R + 0x100 * color.G + 0x10000 * color.B); 
    } 
} 

Welches ist Ihr Code diese verwandelt sich:

var color = Color.FromArgb(173, 216, 230).ToWdColor(); 
+0

Das klingt wirklich gut. Bisher hatte ich nur eine Zeile, aber sobald ich die nächste getroffen habe, werde ich das tun. Zu "Ich schaudere, wann immer ich die Microsoft.VisualBasic irgendwo importiere" - genau das ist mein Punkt, deshalb habe ich mich nie darum gekümmert, so zu versuchen. – ib11

1

Um die Farbe von RGB dezimal eingestellt:

Selection.Shading.BackgroundPatternColor = (Word.WdColor)(173 + 216 * 256 + 230 * 65536); 

Und von RGB hexadezimal:

Selection.Shading.BackgroundPatternColor = (Word.WdColor)0x00E6D8AD;