DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ColorindexとColorの相互変換

環境/言語:[VisualC# 2010 Express]
分類:[.NET]

WordObjectLibrary.dllやOfficeLibrary.dllを利用して、
WordをVC#でオートメーションするソフトを作っています。

かなり枝葉の部分で恐縮ですがよろしくお願いします。

ワード文書内の指定文字列の文字色を指定する場合、
Range.Font.Colorindexを設定することになります。
このColorindexがやや取り扱いし難いのです。

Colorindexをユーザーがビジュアル的に選択できるよう、
ColorDialogをShowしてそのResultをColorindexに入れられたらいいのですが、
System.Drawing.ColorをColorindexに軽やかに変換できません。

皆さんでしたら、このようなケースをどのように解決されますか?
  • 題名: Re[1]: ColorindexとColorの相互変換
  • 著者: 野々村59
  • 日時: 2014/07/08 18:24:25
  • ID: 32435
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
http://d.hatena.ne.jp/ogohnohito/20110512/p2

エクセル等を用いて、

Colorindex  |  RGB値
Colorindex  |  RGB値
Colorindex  |  RGB値
Colorindex  |  RGB値
Colorindex  |  RGB値


のようなファイルを作っておいて、

取得したColorDialog.Result.ColorのRGB値との差分が最も最小となるような
Colorindexを取得する、


ということくらいしか思いつきません。
  • 題名: Re[1]: ColorindexとColorの相互変換
  • 著者: とくま
  • 日時: 2014/07/09 13:39:50
  • ID: 32436
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2014/07/09(Wed) 17:11:27 編集(投稿者)

■No32432に返信(野々村59さんの記事)
Excel2003の時代に自分でEnum作って、それを引数に渡すと対応
する色を返す関数で管理してた事あるわw
でも、あれって、カラーパレット変更したら色変わるんだけどね。
[ツール]-[オプション]-[色]から変更しないと変更できないから
滅多に変更してる人いないんだけど、ごくたまにいて困った事が
ある。つまり作り込むならファイル毎に色が違うのにも対応する
ようにっていうね。

追記:カラーパレットの変更はExcelだけの機能みたいですね。
   本質問はWordに関してのようなので関係なかったです。
   お目汚し失礼しました。
■No32432に返信(野々村59さんの記事)
> ワード文書内の指定文字列の文字色を指定する場合、
> Range.Font.Colorindexを設定することになります。
> 皆さんでしたら、このようなケースをどのように解決されますか?

自分なら TextColor プロパティを使うかな…。(要2010以上)
2014/07/10(Thu) 16:16:24 編集(投稿者)
2014/07/10(Thu) 15:57:17 編集(投稿者)
2014/07/10(Thu) 09:44:39 編集(投稿者)
2014/07/10(Thu) 09:44:29 編集(投稿者)

> 自分なら TextColor プロパティを使うかな…。(要2010以上)

http://stackoverflow.com/questions/17286329/c-sharp-word-interop-automation-2013-set-font-color-to-an-rgb-value

??

TextColor は、読み取り専用なので設定できないです・・・。

http://stackoverflow.com/questions/13075335/convert-system-color-to-microsoft-word-wdcolor

???
■No32440に返信(野々村59さんの記事)
> TextColor は、読み取り専用なので設定できないです・・・。

ListBox.Items だって読み取り専用ですけれども、
Items にデータを追加/削除したり、書き換えたり出来ますよね。

TextColor プロパティが返す「ColorFormat」について調べてみて下さい。
> TextColor プロパティが返す「ColorFormat」について調べてみて下さい。

color = Properties.Settings.Default.図色;
findObject.Replacement.Font.TextColor.RGB = Microsoft.VisualBasic.Information.RGB(color.R,color.G,color.B);//エラーが出ます・・。

わからないです・・・。
■No32446に返信(野々村59さんの記事)

手元の環境では、こんな感じで文字色を設定できました。


using System;
using System.Drawing;
using System.Runtime.InteropServices;

class Sample
{
    static void Main()
    {
        // 任意の色
        Color textColor = Color.DarkMagenta;

        dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
        app.Visible = true;
        dynamic docs = app.Documents;
        dynamic doc = docs.Add();
        dynamic rng = doc.Range;
        rng.Text = "サンプルテキスト";

        dynamic fnt = rng.Font;
        dynamic colorFmt = fnt.TextColor;

        Console.Write("色を変更します。");
        Console.ReadLine();
        colorFmt.RGB = ColorTranslator.ToWin32(textColor) ;     // ToOle との違いに注意
        Console.Write("色を変更しました。終了します。");

        if (Marshal.IsComObject(colorFmt)) Marshal.ReleaseComObject(colorFmt);
        if (Marshal.IsComObject(fnt)) Marshal.ReleaseComObject(fnt);
        if (Marshal.IsComObject(rng)) Marshal.ReleaseComObject(rng);
        if (Marshal.IsComObject(doc)) Marshal.ReleaseComObject(doc);
        app.Quit(SaveChanges: false);
        if (Marshal.IsComObject(app)) Marshal.ReleaseComObject(app);
    }
}
■No32447に返信(魔界の仮面弁士さんの記事)
> ■No32446に返信(野々村59さんの記事)
>
> 手元の環境では、こんな感じで文字色を設定できました。

自分のプログラムに
rng.Font.TextColor.RGB=ColorTranslator.ToWin32(mycolor)を導入してみたら、その行が

NotImplementedException...

となりました。

ご提示いただいたソースでVisualC#2010上で動かしてみたら
添付画像のように、
dynamic colorfmt=fnt.TextColor;
の部分で同じ例外が出ました。

おんぶに抱っこで本当に恐縮です・・・。
VisualC#2010Express上だと動かない、というわけではないと思うのですけれど・・・。
2014/07/15(Tue) 12:36:30 編集(投稿者)

■No32448に返信(野々村59さんの記事)
> ご提示いただいたソースでVisualC#2010上で動かしてみたら
当方も同じです。Express ではなく、Ultimate ですけれどね。

dynamic 型を使っているコードですので、実行には
C#4.0(Visual Studio 2010)以降が必要になります。
(参照設定して動作させるなら、VS2008 以下でも良いですけど)

なお、当方で使用している Microsoft Word は
Office Professional Plus 2013 の 64bit 版です。


> NotImplementedException...
Word のバージョンは 2010 以降になっていますか?

No32437 にも括弧書きで示していますが、TextColor プロパティが
追加されたのは、Word 2010 以降のため、2007 以下では実行できません。
http://msdn.microsoft.com/ja-jp/library/office/ff194246.aspx


もしも Word 2010 以降をお使いで、それでも動作しないとしたら…何でしょうね?
Word2010

VS2010Exですね・・。うーん。
■No32451に返信(野々村59さんの記事)
> Word2010

念のために確認。


Word を起動して新規文書を作成し、
[Alt]+[F11] キーを押して VBA 開発画面を開き、そこで
[Ctrl]+[G] にてイミディエイト ペインを開いて、

『? ThisDocument.Range.Font.TextColor.RGB』

と記載した場合も、同様のエラーになりますか?
■No32455に返信(魔界の仮面弁士さんの記事)
> ■No32451に返信(野々村59さんの記事)
> 『? ThisDocument.Range.Font.TextColor.RGB』
>
> と記載した場合も、同様のエラーになりますか?

一応動いているように見えます。
特段エラーが出ている気配はありません。
値がマイナスなのは10進法だとたまたまマイナスだったというだけだと思います。
■No32456に返信(野々村59さんの記事)
>>『? ThisDocument.Range.Font.TextColor.RGB』
値の取得はできるようですね。
値の変更も可能ですか?

また、.Range.Font.Fill.ForeColor.RGB はどうでしょうか? 

複数のバージョンの Word がインストールされているわけでも無いのですよね…。


> 一応動いているように見えます。
画面内に、FindWindow や PostMessage の VBA コードが見えますが、
その文書は新規文書になっているでしょうか。
VBA のプロジェクト エクスプローラーで、
新規の "文書 1"が選択されているか確認してみてください。

また、"C:\Users\〜〜\AppData\Roaming\Microsoft\Templates\Normal.dotm" を
リネームしてから Word を起動したときに、結果が変わるかどうかも
確認してみて下さい。

> 値がマイナスなのは10進法だとたまたまマイナスだったというだけだと思います。
-16777216 は初期値である wdColor.wdColorAutomatic ですね。
添付ファイル: word.png (35 KB)
大変なことになってしまった・・・。

これ、ググったらかなりやばい状況らしいです・・・。

VC# 2010でプロジェクト開発自体ができなくなってしまった・・。
添付ファイル: 1.PNG (52 KB)
2014/07/16(Wed) 13:36:51 編集(投稿者)

>>値の取得はできるようですね。
>>値の変更も可能ですか?
>>た、.Range.Font.Fill.ForeColor.RGB はどうでしょうか? 

>>複数のバージョンの Word がインストールされているわけでも無いのですよね…。

2003も以前入っていたかも知れません。
VC#2010ソリューションウィンドウの参照設定で、OfficeObjectLibrary14.0未満のバージョンも表示されるので。確か10とかも表示されていたような気がします。
いまは諸般の事情で確認できませんが・・・。
当然ながら2003はいまはPCに入っていません。元から入っていなかったかも知れません。最近PCを入れ替えたので。すみません、ちょっとVC#が動かなくなって狼狽しています。




?ThisDocument.Range.Font.TextColor=RGB(100,100,100)
False

?ThisDocument.Range.Font.TextColor=RGB(128,128,128)
False

? ThisDocument.Range.Font.TextColor=RGB(128,128,128)
False

トライしたらこんな感じにイミディエイトがなりました。
添付ファイル: 1405484773.gif (8 KB)
■No32460に返信(野々村59さんの記事)
> VC# 2010でプロジェクト開発自体ができなくなってしまった・・。

回復するかどうかは分かりませんが、
Visual Studio の修復コマンドを紹介しておきます。
http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_9041.htm
■No32463に返信(魔界の仮面弁士さんの記事)
> ■No32460に返信(野々村59さんの記事)
>>VC# 2010でプロジェクト開発自体ができなくなってしまった・・。
>
> 回復するかどうかは分かりませんが、
> Visual Studio の修復コマンドを紹介しておきます。
> http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_9041.htm

c:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE>VCSExpress.exe /ResetSkipPkgs

をとりあず実行してみました。
でも、新規プロジェクト→フォームアプリケーション
新規プロジェクト→コンソールアプリケーション
何れも起動に失敗しました。
新規プロジェクト→クラスライブラリ
もダメでした。

Microsoft Visual C# 2010 コンパイラを作成できなかったため、プロジェクト'ClassLibrary1'を開けませんでした。Visual Studio を再インストールしてください。

とエラーダイアログが出ます・。

C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE>vcsexpress.exe/safemode

このコマンドを実行すると、起動時にいつも表示されていた
ようこそ画面は出てこなくなりますが、
ファイル→新規プロジェクト→Windowsフォームアプリケーション
とすると、





Microsoft Visual C# 2010 コンパイラを作成できなかったため、プロジェクト'WindowsFormsApplication1'を開けませんでした。Visual Studio を再インストールしてください。

と出てきてしまいます。

このPCはOS再インストールが実質的に禁止されているのでOS再インストールはできないのです、、、

うぅ・・。

Colorどころではなくなってしまいました。
2014/07/16(Wed) 19:38:48 編集(投稿者)

■No32464に返信(野々村59さんの記事)
> このPCはOS再インストールが実質的に禁止されているのでOS再インストールはできないのです、、、

Visual Studio の修復インストール / 再インストールも禁止でしょうか?

コンパイラが正しく構成されていないというのであれば、
 * .NET Framework 本体
 * Visual Studio 開発環境
 * およびそれらの Service Pack や Hotfix 類
をインストールしなおすことで修復されるように思います;もしかしてだけど…
■No32464に返信(野々村59さんの記事)
> Microsoft Visual C# 2010 コンパイラを作成できなかったため、プロジェクト'WindowsFormsApplication1'を開けませんでした。Visual Studio を再インストールしてください。

英語版だと、このようなメッセージになるようですね。

『"Project 'WindowsFormsApplication1' could not be opened because the Microsoft Visual C# 2010 compiler could not be created.』


既にググられているそうなので、調査済みとは思いますが、一応情報共有として。

----

.NET Runtime のファイル群やフォルダに問題が生じている?
http://support.microsoft.com/kb/821790/ja
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47028&forum=7

別のユーザーアカウントでログインすると開ける?
http://d.hatena.ne.jp/YokoKen/20081118/1226995396

Service Pack 1 の再適用で復活?
http://stackoverflow.com/questions/7445898/project-name-could-not-be-opened-because-the-microsoft-visual-c-sharp-2010-com
> Service Pack 1 の再適用で復活?
> http://stackoverflow.com/questions/7445898/project-name-could-not-be-opened-because-the-microsoft-visual-c-sharp-2010-com

•Tried the /resetsettings argument
•Tried the /ResetSkipPkgs argument
•Tried removing the whole key: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio

これら3つやりましたが全部ダメでした。

SP1適用しましたが、ダメでした。
VC#2010Expressアンイン→再インしたら!!!!!!


治りました・・・。



ありがとうございます!!!!!

おかげさまで、TextColorに専念できそうです!

DOBON.NET | プログラミング道 | プログラミング掲示板