C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: セルの背景色


(過去ログ 124 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■74178 / inTopicNo.1)  セルの背景色
  
□投稿者/ シャープ (1回)-(2014/12/05(Fri) 17:51:08)

分類:[C#] 

2014/12/05(Fri) 17:53:04 編集(投稿者)

.Net Framework 3.5でコンソールアプリを開発しています。

アプリでExcel出力もしており(Office.Interop.Excel経由)、出力時にセル背景色を指定したいのですが、

Range.Interior.ColorIndex
または
Range.Interior.Color

にセットする値が見つからないので、どなたか教えて頂けないでしょうか?

(試しにColorIndex = 3 や Color = ConsoleColorをセットしてみましたが。エラーでした。)


よろしくお願いします。
引用返信 編集キー/
■74181 / inTopicNo.2)  Re[1]: セルの背景色
□投稿者/ 魔界の仮面弁士 (185回)-(2014/12/05(Fri) 18:13:37)
No74178 (シャープ さん) に返信
> Range.Interior.ColorIndex
> または
> Range.Interior.Color

その前後のコードに問題があったりはしませんか?


こちらでは ColorIndex = 3 でエラー無く動作しましたし、
Color プロパティの方も動作しているように見えます。


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

class Program
{
    static void Main()
    {
        Action<object> ReleaseIfActiveX = o => { 
            if (Marshal.IsComObject(o)) Marshal.ReleaseComObject(o); };

        dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
        app.Visible = true;
        var books = app.Workbooks;
        var book = books.Add();
        var sheets = book.Worksheets;
        var sheet = sheets[1];
        dynamic rng, itr;

        rng = sheet.Range("C3");
        itr = rng.Interior;
        itr.Color = ColorTranslator.ToOle(Color.Yellow);
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        rng = sheet.Range("D5");
        itr = rng.Interior;
        itr.Color = ColorTranslator.ToOle(Color.Blue);
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        ReleaseIfActiveX(sheet);
        ReleaseIfActiveX(sheets);

        book.Saved = true;
        ReleaseIfActiveX(book);
        ReleaseIfActiveX(books);

        Console.Write("Hit Enter");
        Console.ReadLine();
        app.Quit();
        ReleaseIfActiveX(app);
    }
}

引用返信 編集キー/
■74182 / inTopicNo.3)  Re[2]: セルの背景色
□投稿者/ 魔界の仮面弁士 (186回)-(2014/12/05(Fri) 18:26:34)
No74181 (魔界の仮面弁士) に追記
>> アプリでExcel出力もしており(Office.Interop.Excel経由)、

念のため、レイトバインディングではなく Office PIA 経由にしてみましたが、
やはり問題無さそうです。まぁ、ConsoleColor 列挙型の出番は無さそうですが、


実際に生じたエラー内容は、どのようなものでしたか?

ColorIndex に、範囲外の値を与えたらエラーになりそうですが(適正値は-1〜56)、
今回は ColorIndex = 3 とのことですし…。



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

using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        Action<object> ReleaseIfActiveX = o => { 
            if (Marshal.IsComObject(o)) Marshal.ReleaseComObject(o); };

        Excel.Application app = new Excel.Application();
        app.Visible = true;
        Excel.Workbooks books = app.Workbooks;
        Excel.Workbook book = books.Add();
        Excel.Sheets sheets = book.Worksheets;
        Excel.Worksheet sheet = (Excel.Worksheet)sheets[1];
        Excel.Range rng;
        Excel.Interior itr;

        rng = sheet.Range["C3"];
        itr = rng.Interior;
        itr.Color = ColorTranslator.ToOle(Color.Blue);
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        rng = sheet.Range["D5"];
        itr = rng.Interior;
        itr.ColorIndex = 3;
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        ReleaseIfActiveX(sheet);
        ReleaseIfActiveX(sheets);

        book.Saved = true;
        ReleaseIfActiveX(book);
        ReleaseIfActiveX(books);

        Console.Write("Hit Enter");
        Console.ReadLine();
        app.Quit();
        ReleaseIfActiveX(app);
    }
}

引用返信 編集キー/
■74183 / inTopicNo.4)  Re[3]: セルの背景色
□投稿者/ 魔界の仮面弁士 (187回)-(2014/12/05(Fri) 18:34:41)
No74182 (魔界の仮面弁士) に追記
> .Net Framework 3.5
先のコードは、 VS2010 の場合でした。
VS2008 上で .NET Framework 3.5 を使っているのだとしたら、こんな感じ。


2008 当時は、「省略可能な引数」や「引数付きプロパティ」が使えなかったため、
先のコードと微妙に違いがありますが、基本的な処理の流れはまったく同じです。


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

using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        Action<object> ReleaseIfActiveX = o =>
        {
            if (Marshal.IsComObject(o)) Marshal.ReleaseComObject(o);
        };
        
        Excel.Application app = new Excel.Application();
        app.Visible = true;
        Excel.Workbooks books = app.Workbooks;
        Excel.Workbook book = books.Add(Type.Missing);
        Excel.Sheets sheets = book.Worksheets;
        Excel.Worksheet sheet = (Excel.Worksheet)sheets[1];
        Excel.Range rng;
        Excel.Interior itr;

        rng = sheet.get_Range("C3", Type.Missing);
        itr = rng.Interior;
        itr.Color = ColorTranslator.ToOle(Color.Blue);
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        rng = sheet.get_Range("D5", Type.Missing);
        itr = rng.Interior;
        itr.ColorIndex = 3;
        ReleaseIfActiveX(itr);
        ReleaseIfActiveX(rng);

        ReleaseIfActiveX(sheet);
        ReleaseIfActiveX(sheets);

        book.Saved = true;
        ReleaseIfActiveX(book);
        ReleaseIfActiveX(books);

        Console.Write("Hit Enter");
        Console.ReadLine();
        app.Quit();
        ReleaseIfActiveX(app);
    }
}

引用返信 編集キー/
■74184 / inTopicNo.5)  Re[2]: セルの背景色
□投稿者/ シャープ (2回)-(2014/12/05(Fri) 19:09:13)
2014/12/05(Fri) 19:13:49 編集(投稿者)
2014/12/05(Fri) 19:10:19 編集(投稿者)

魔界の仮面弁士 さん、ありがとうございます。

usingはご指摘後、下記の★を追加してみましたが変わらずでした。

using System;
using System.Drawing; ★
using System.Runtime.InteropServices; ★
using Excel = Microsoft.Office.Interop.Excel;

VSは2010です。(コンソールアプリ)


列幅の指定はできていますが、色プロパティにセットする時に例外エラーになってしまいますね。


例外エラーは
「定義済みの型 'Microsoft.CSharp.RuntimeBinder.Binder' は定義、またはインポートされていません」
とありますが、何のことを指しているのか理解できておりません。





No74180 (魔界の仮面弁士 さん) に返信
> ■No74178 (シャープ さん) に返信
>>Range.Interior.ColorIndex
>>または
>>Range.Interior.Color
>
> その前後のコードに問題があったりはしませんか?
>
>
> こちらでは ColorIndex = 3 で動作しましたし、
> ColorIndex も動作しているように見えます。
>
>
> using System;
> using System.Drawing;
> using System.Runtime.InteropServices;
>
> class Program
> {
> static void Main()
> {
> Action<object> ReleaseIfActiveX = o => {
> if (Marshal.IsComObject(o)) Marshal.ReleaseComObject(o); };
>
> dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
> app.Visible = true;
> var books = app.Workbooks;
> var book = books.Add();
> var sheets = book.Worksheets;
> var sheet = sheets[1];
> dynamic rng, itr;
>
> rng = sheet.Range("C3");
> itr = rng.Interior;
> itr.Color = ColorTranslator.ToOle(Color.Yellow);
> ReleaseIfActiveX(itr);
> ReleaseIfActiveX(rng);
>
> rng = sheet.Range("D5");
> itr = rng.Interior;
> itr.Color = ColorTranslator.ToOle(Color.Blue);
> ReleaseIfActiveX(itr);
> ReleaseIfActiveX(rng);
>
> ReleaseIfActiveX(sheet);
> ReleaseIfActiveX(sheets);
>
> book.Saved = true;
> ReleaseIfActiveX(book);
> ReleaseIfActiveX(books);
>
> Console.Write("Hit Enter");
> Console.ReadLine();
> app.Quit();
> ReleaseIfActiveX(app);
> }
> }
引用返信 編集キー/
■74185 / inTopicNo.6)  Re[3]: セルの背景色
□投稿者/ 魔界の仮面弁士 (188回)-(2014/12/05(Fri) 19:31:08)
No74184 (シャープ さん) に返信
> 例外エラーは
> 「定義済みの型 'Microsoft.CSharp.RuntimeBinder.Binder' は定義、またはインポートされていません」
> とありますが、何のことを指しているのか理解できておりません。

そのアセンブリは、Microsoft.CSharp.dll で提供されています。
dynamic 型をサポートするためのライブラリですが、dynamic は .NET 4 向けのものですね。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=72708&KLOG=121
引用返信 編集キー/
■74195 / inTopicNo.7)  Re[4]: セルの背景色
□投稿者/ シャープ (3回)-(2014/12/08(Mon) 09:49:47)
2014/12/08(Mon) 11:56:10 編集(投稿者)


魔界の仮面弁士 さん

ありがとうございます。

先程、ファイル出力できないと書きましたが、SavedAsで試したところ、確認することはできました。

もう1つお聞きしたいのですが、xlWorkSheet.Cells[]を使用したプロパティの設定は
できないでしょうか?

.Rangeではできましたが、CellsであればIndex管理ができるので(変数Increment制御等)、より効率的になると思っています。
引用返信 編集キー/
■74208 / inTopicNo.8)  Re[5]: セルの背景色
□投稿者/ 魔界の仮面弁士 (190回)-(2014/12/08(Mon) 12:45:48)
No74195 (シャープ さん) に返信
> 先程、ファイル出力できないと書きましたが、

何の話でしょうか? そのような投稿を見た覚えが無いのですが。


> SavedAsで試したところ、確認することはできました。

No74184 の件はどうなりましたでしょうか。状況がさっぱり分かりません。(^^;
解決したのだとすれば、どのような操作で解決したのかフィードバックをお願いします。


> もう1つお聞きしたいのですが、xlWorkSheet.Cells[]を使用したプロパティの設定は
> できないでしょうか?

Cells を C# のインデクサとして扱いたい、という意図でしょうか。

可能か不可能かで言えば、C# であっても問題なく
 xlWorkSheet.Cells[y, x].Value = "TEST";
などと表記できます。 ただし .NET 4 以降であれば、ですけれどね。

もしも C#2008 以下(.NET 3.5 以下)のバージョンで扱うのだとすれば、
 ((Excel.Range)xlWorkSheet.Cells.get_Item(y, x)).set_Value("TEST", Type.Missing);
という表記に変換する必要があります。相互運用機能アセンブリによっては、
 ((Excel.Range)xlWorkSheet.Cells[y, x]).set_Value("TEST", Type.Missing);
と書けるケースもありますけれどね。

------------

・Cells プロパティは「引数を持たないプロパティ」のため、本来は丸括弧や角括弧を伴わずに表記するものである。

・Cells プロパティは Range 型を返すプロパティである。

・Range プロパティは「既定のプロパティ」を持っており、C#2010 以降ではそれを
 インデクサとして扱えるが、これは C#2008 ではサポートされていない構文のため、
 get_Item メソッドで代用することになる。
 (ただし相互運用機能アセンブリによっては、そのままインデクサとして使えるケースもある)

・Range プロパティの「既定のプロパティ」は COM の VARIANT 型を返す。C#2010 以降では
 dynamic 型として処理されるケースもあるが、C#2008 では object 型を返すことになるので、
 本来のデータ型(Range 型)にキャストして受け取る必要がある。

・Value プロパティは、Excel 2000 以下では「引数を持たないプロパティ」であったが、
 Excel 2002 以降では、「省略可能な 1 つの引数を持つプロパティ」となっている。
 そのため、C#2008 以下 と Excel 2002 以降の組み合わせの場合、Value プロパティが使えず、
 set_Value / get_Value メソッド経由で呼び出す必要がある。
引用返信 編集キー/
■74221 / inTopicNo.9)  Re[6]: セルの背景色
□投稿者/ シャープ (4回)-(2014/12/09(Tue) 10:06:57)
No74208 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。


> 何の話でしょうか? そのような投稿を見た覚えが無いのですが。

何度か編集したので、その過程で閲覧された場合を考慮しておきました。


> No74184 の件はどうなりましたでしょうか。状況がさっぱり分かりません。(^^;
>解決したのだとすれば、どのような操作で解決したのかフィードバックをお願いします。

解決はしておりませんで、ご提示して頂いた内容では動作しているので、こちらを採用しました。


>Cells を C# のインデクサとして扱いたい、という意図でしょうか。

はい、そうです。
.NET 3.5 なので、((Excel.Range)xlWorkSheet.Cells.get_Item(y, x)).set_Value("TEST", Type.Missing);
はどうかと思いましたが、なぜか同じ('Microsoft.CSharp.RuntimeBinder.Binder')エラーでした。
暫定対策として.Range(1セル範囲の文字変数)はエラーでないので、こちらで進めていこうと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -