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

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

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

複数セルへの同時書込み

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

■92826 / inTopicNo.1)  複数セルへの同時書込み
  
□投稿者/ じょこびっち (15回)-(2019/11/01(Fri) 09:00:06)

分類:[C#] 

2019/11/01(Fri) 09:00:31 編集(投稿者)

NumericUpDownでセルの位置を決め、ボタンを1回押したらエクセルのセルに6箇所に同時に書き込みたいです。


NumericUpDownでセルをA1に指定してボタンを押すと
A1に”タイトル1”、B1に”タイトル2”、C1に”タイトル3”
A2に”値1”、B1に”値2”、C1に”値3”

次にA3を指定してボタンを押すと同じように
A3に”タイトル1”、B3に”タイトル2”、C3に”タイトル3”
A4に”値1”、B4に”値2”、C4に”値3”
という風に書込みたいです。
どうすればいいのでしょうか?よろしくお願いします。

private void BtnStart_Click(object sender, EventArgs e) {

// セル用変数
dynamic cell;
// セルオブジェクト(アクティブシート)
cell = workBook.ActiveSheet.Cells(numericRow.Value, numericColumn.Value);

// 測定器から取得した値をセルに書き込む
cell.Value = "タイトル1"
//inst.WriteString("MEASUrement:MEAS1:VALue?\n");
//cell.Value = inst.ReadString().Replace("\n", "");

//cell.Value = "タイトル2";
//inst.WriteString("MEASUrement:MEAS2:VALue?\n");
//cell.Value = inst.ReadString().Replace("\n", "");

//cell.Value = "タイトル3";
//inst.WriteString("MEASUrement:MEAS3:VALue?\n");
//cell.Value = inst.ReadString().Replace("\n", "");
}
引用返信 編集キー/
■92827 / inTopicNo.2)  Re[1]: 複数セルへの同時書込み
□投稿者/ 魔界の仮面弁士 (2447回)-(2019/11/01(Fri) 09:31:37)
2019/11/01(Fri) 09:32:00 編集(投稿者)

No92826 (じょこびっち さん) に返信
> // セルオブジェクト(アクティブシート)
> cell = workBook.ActiveSheet.Cells(numericRow.Value, numericColumn.Value);

ActiveSheet が返すオブジェクトは、ワークシートやマクロシートとは限りません。
ダイアログシートやグラフシートのように、Cells プロパティを持たないオブジェクトが
返されることもあります。

自フォームの TextBox に書き込む際に、「textBox1.Text = "abc";」と書くことはあっても、
「ActiveControl.Text = "abc";」のようには書かないですよね。それと同じで、
どのシートを対象とするのかを明確にしたコードにすべきかと思いますよ。


> A3に”タイトル1”、B3に”タイトル2”、C3に”タイトル3”
> A4に”値1”、B4に”値2”、C4に”値3”

cellsTarget = 対象シート.Range["A3:C4"];
cellsTarget.Value = new dynamic[,] {
 { "タイトル1", "タイトル2", "タイトル3" },
 { "値1", "値2", "値3" },
};
System.Runtime.InteropServices.Marshal.ReleaseComObject(cellsTarget);
引用返信 編集キー/
■92828 / inTopicNo.3)  Re[2]: 複数セルへの同時書込み
□投稿者/ 魔界の仮面弁士 (2448回)-(2019/11/01(Fri) 09:46:26)
2019/11/01(Fri) 09:46:51 編集(投稿者)

No92827 (魔界の仮面弁士) に追記
>> A3に”タイトル1”、B3に”タイトル2”、C3に”タイトル3”
>> A4に”値1”、B4に”値2”、C4に”値3”
> cellsTarget = 対象シート.Range["A3:C4"];

セル範囲を文字列ではなく、整数で指定するならこんな感じ。


int 列番号 = 1;
int 行番号 = 3;
cell1 = 対象シート.Cells[行番号, 列番号]; // 範囲左上のセルを指す Range オブジェクト
cell2 = cell1.Offset[1, 2]; // 範囲右下のセルを指す Range オブジェクト
cellsTarget = 対象シート.Range[cell1, cell2]; // .Range["A3:C4"] 相当の 6 つのセルを指す Range オブジェクト
cellsTarget.Value = new dynamic[,] // 二次元配列を使って、複数セルへの同時書き込み
{
  { "タイトル1", "タイトル2", "タイトル3" },
  { "値1", "値2", "値3" },
};
// COM 参照の解放処理
System.Runtime.InteropServices.Marshal.ReleaseComObject(cellsTarget);
System.Runtime.InteropServices.Marshal.ReleaseComObject(cell2);
System.Runtime.InteropServices.Marshal.ReleaseComObject(cell1);
引用返信 編集キー/
■92831 / inTopicNo.4)  Re[3]: 複数セルへの同時書込み
□投稿者/ じょこびっち (16回)-(2019/11/01(Fri) 13:28:00)
No92828 (魔界の仮面弁士 さん) に返信
> 2019/11/01(Fri) 09:46:51 編集(投稿者)
>
> ■No92827 (魔界の仮面弁士) に追記

めっちゃわかりやすいです。ありがとうございます。
申し訳ないのですが少しだけ教えてください。

> int 列番号 = 1;
> int 行番号 = 3;

整数にした時に代入する値は何ですか?

> // COM 参照の解放処理
> System.Runtime.InteropServices.Marshal.ReleaseComObject(cellsTarget);
> System.Runtime.InteropServices.Marshal.ReleaseComObject(cell2);
> System.Runtime.InteropServices.Marshal.ReleaseComObject(cell1);

オブジェクトの開放はボタンを押すたびに1回1回するものなのですか?
例えば他の操作をしている時にオブジェクトを参照したままだと問題が起きるものなのでしょうか?

説明が面倒な時はスルーしていただいて結構です。
よろしくお願いします。
引用返信 編集キー/
■92833 / inTopicNo.5)  Re[4]: 複数セルへの同時書込み
□投稿者/ 魔界の仮面弁士 (2451回)-(2019/11/01(Fri) 14:47:24)
No92831 (じょこびっち さん) に返信
>>int 列番号 = 1;
>>int 行番号 = 3;
> 整数にした時に代入する値は何ですか?

左上セルの位置を示す値です。A1 なら 1 と 1、A3 なら 1 と 3 です。
貴殿の場合、numericColumn.Value と numericRow.Value から求められるでしょう。


> cell1 = 対象シート.Cells[行番号, 列番号];  // 範囲左上のセルを指す Range オブジェクト
今回は 2 行 3 列の矩形範囲を必要としていたので、
上記で得られた左上セルを下に 1 つ、右に 2 つスライドさせるため、
下記の構文にて右下セルを得られるようにしています。
> cell2 = cell1.Offset[1, 2]; // 範囲右下のセルを指す Range オブジェクト


個人的には No92828 の方法ではなく、 No92827 (とNo92787 )を利用する方が好みですが。


> オブジェクトの開放はボタンを押すたびに1回1回するものなのですか?

ボタンを押したかどうかとは無関係で、
「どこからも使用されなくなったとき」に ReleaseComObject または FinalReleaseComObject します。
https://n.career-info.jp/contents/?id=10174


> 例えば他の操作をしている時にオブジェクトを参照したままだと問題が起きるものなのでしょうか?
同じオブジェクトを引き続き利用する場合は、ReleaseComObject を呼び出してはいけませんし、
もう使わない(または、必要に応じて毎回取得しなおす)のなら、その時点で ReleaseComObject します。


なお、Excel のバージョンなどにもよるのですが、COM オブジェクトを dynamic 型や object 型の
変数で受けていた場合、その変数を COM オブジェクトのメソッドやプロパティの引数で渡すと、
内部処理での型変換時に、COM の参照カウンタが増加したままになることがあります。
この場合は、参照カウントが 0 になるまで ReleaseComObject を呼び続けるか、もしくは
FinalReleaseComObject を呼び出す必要があります。
引用返信 編集キー/
■92839 / inTopicNo.6)  Re[5]: 複数セルへの同時書込み
□投稿者/ じょこびっち (17回)-(2019/11/01(Fri) 15:32:27)
No92833 (魔界の仮面弁士 さん) に返信

>>オブジェクトの開放はボタンを押すたびに1回1回するものなのですか?
>
> ボタンを押したかどうかとは無関係で、
> 「どこからも使用されなくなったとき」に ReleaseComObject または FinalReleaseComObject します。
> https://n.career-info.jp/contents/?id=10174
>
>
>>例えば他の操作をしている時にオブジェクトを参照したままだと問題が起きるものなのでしょうか?
> 同じオブジェクトを引き続き利用する場合は、ReleaseComObject を呼び出してはいけませんし、
> もう使わない(または、必要に応じて毎回取得しなおす)のなら、その時点で ReleaseComObject します。
>
>
> なお、Excel のバージョンなどにもよるのですが、COM オブジェクトを dynamic 型や object 型の
> 変数で受けていた場合、その変数を COM オブジェクトのメソッドやプロパティの引数で渡すと、
> 内部処理での型変換時に、COM の参照カウンタが増加したままになることがあります。
> この場合は、参照カウントが 0 になるまで ReleaseComObject を呼び続けるか、もしくは
> FinalReleaseComObject を呼び出す必要があります。


そうなのですか。すごく勉強になりました。
魔界の仮面弁士さんありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ