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

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

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

Re[2]: C# Excelのセルコピーについて(演算式)


(過去ログ 169 を表示中)

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

■97486 / inTopicNo.1)  C# Excelのセルコピーについて(演算式)
  
□投稿者/ as (1回)-(2021/05/25(Tue) 14:22:52)

分類:[.NET 全般] 

Visual Studio Express 2017を使用しています。
言語はC#で、Windowsフォームアプリケーションを作成しています。

Excelの操作について教えてください。

コピー元(セル範囲)を指定してセルのコピーをし、
次にコピー先(セル範囲)を指定してセルのペーストをします。
この時、コピー元に計算式(例えば、"=A1*A2"といった式)があれば、コピー先では対応するセルのアドレスにしたいです。

具体的には
A1セルに2、A2セルに3、A3セルに=A1*A2 と入力しておきます。(A3セルは6と表示されています)
B1セルには5と入力しておきます。

A2〜A3セルの内容をB2〜B3セルにコピーしたとき、B3セルの式を=B1*B2としたいです。(B3セルに15と表示されるのが期待結果です)



以下のようなコードを書いていますが、現在はコピー元のセルの計算式と同じアドレスを指定してしまいます。
対応方法について教えていただけないでしょうか。


m_wsはワークシートオブジェクト

// Rangeを指定
dynamic kRange = m_ws.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
, m_ws, new object[] { "A2:A3", Missing.Value });

object[,] obj1;
object[] parameters = new Object[1];
// 二次元配列に値をセット
obj1 = (System.Object[,])kRange.GetType().InvokeMember("Formula", BindingFlags.GetProperty, null, kRange, null);
parameters[0] = obj1;

// 書込み先の範囲を取得
dynamic wRange = m_ws.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
, m_ws, new object[] { "B2:B3", Missing.Value });

kRange.GetType().InvokeMember("Copy", BindingFlags.InvokeMethod, null, kRange, null);
wRange.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, null, wRange, null);
m_ws.GetType().InvokeMember("Paste", BindingFlags.InvokeMethod, null, m_ws, null);
wRange.GetType().InvokeMember("Value2", BindingFlags.SetProperty, null, wRange, parameters);


引用返信 編集キー/
■97487 / inTopicNo.2)  Re[1]: C# Excelのセルコピーについて(演算式)
□投稿者/ 魔界の仮面弁士 (3104回)-(2021/05/25(Tue) 15:04:16)
No97486 (as さん) に返信
> // Rangeを指定
> dynamic kRange = m_ws.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
> , m_ws, new object[] { "A2:A3", Missing.Value });
実行時バインディングなら、
 dynamic kRange = ((dynamic)m_ws).Range["A2:A3"];
 object[,] obj1 = kRange.Formula;
で良いのでは。


> // 書込み先の範囲を取得
Formula や Value2 を使う必要は無く、
 dynamic kRange = ((dynamic)m_ws).Range["A2:A3"];
 dynamic wRange = ((dynamic)m_ws).Range["B2:B3"];
 kRange.Copy(wRange);
 Marshal.ReleaseComObject(kRange);
 Marshal.ReleaseComObject(wRange);
で十分だと思います。
引用返信 編集キー/
■97488 / inTopicNo.3)  Re[2]: C# Excelのセルコピーについて(演算式)
□投稿者/ 魔界の仮面弁士 (3105回)-(2021/05/25(Tue) 15:11:58)
No97487 (魔界の仮面弁士) に追記
> で十分だと思います。

コピー先の B2:B3 セルの書式を上書きしたくない場合は、先の
>  kRange.Copy(wRange);
という行を
 kRange.Copy();
 wRange.PasteSpecial(-4123); // xlPasteFormulas
に書き換えれば、書式はコピーされず、セルの内容(数式)のみを貼ることができます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -