|
■No69207 (ぽんた さん) に返信
> 2x2もだめでしたので、応答なしと判断しました。
> 下記サイトのほぼ真似なんですけどね。。
> http://support.microsoft.com/kb/302096/ja
ほぼ同様の環境があったので追加検証してみましたが、
当方では応答無しではなく、COM例外(0x800A03EC)が発生しました。
Windows 7(x64)、Excel 2010(x86)、C#2008(AnyCPUビルド)です。
//-----------------------------
using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
class Sample
{
[MTAThread]
static void Main()
{
Excel.Application app = new Excel.ApplicationClass();
app.Visible = true;
Excel.Workbooks books = app.Workbooks;
Excel.Workbook book = books.Add(Type.Missing);
Excel.Sheets sheets = book.Worksheets;
Excel._Worksheet ws = (Excel.Worksheet)sheets[1];
// この場合は COMException が発生する
//byte[,] data = new byte[,] { { 12, 34 }, { 56, 78 } };
// Option Base 1 な配列にしても駄目
//byte[,] data = (byte[,])Array.CreateInstance(typeof(byte), new int[] { 2, 2 }, new int[] { 1, 1 });
//data[1, 1] = 12;
//data[1, 2] = 34;
//data[2, 1] = 56;
//data[2, 2] = 78;
// これなら処理される
object[,] data = { { (byte)12, (byte)34 }, { (byte)56, (byte)78 } };
Excel.Range cells = ws.Cells;
Excel.Range lt = (Excel.Range)cells[1, 1];
Excel.Range rb = (Excel.Range)cells[2, 2];
Excel.Range range = ws.get_Range(lt, rb);
Release(ref lt);
Release(ref rb);
Release(ref cells);
Console.Write("セット開始");
Console.ReadLine();
range.set_Value(Type.Missing, data);
Console.WriteLine("セット完了");
Release(ref range);
Release(ref ws);
Release(ref sheets);
book.Saved = true;
Release(ref book);
Release(ref books);
Console.Write("終了します");
Console.ReadLine();
app.Quit();
Release(ref app);
}
static int Release<T>(ref T o) where T : class
{
int cRCW = 0;
if (o != null && Marshal.IsComObject(o))
{
cRCW = Marshal.ReleaseComObject(o);
o = null;
}
return cRCW;
}
}
//-----------------------------
> Range.set_Valueなどの説明がどのサイトでもあまりないのでよくわからないまま使っています。
要するに、『Range オブジェクトの Value プロパティ』ですよね。
(機能的については Excel VBA のヘルプを参照)
C# の「range.set_Value(Type.Missing, data);」は、
Excel 的には「range.Value = data」を意味します。
厳密には、Excel のバージョンによって
2000 まで「Property Value() As Object」
2002 から「Property Value(Optional RangeValueDataType As Object = XlRangeValueDataType.xlRangeValueDefault) As Object」
のような違いがありますけれども。
|