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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.97486 の関連記事表示

<< 0 >>
■97486  C# Excelのセルコピーについて(演算式)
□投稿者/ as -(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);

親記事 /過去ログ169より / 関連記事表示
削除チェック/

■97487  Re[1]: C# Excelのセルコピーについて(演算式)
□投稿者/ 魔界の仮面弁士 -(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);
    で十分だと思います。
記事No.97486 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97488  Re[2]: C# Excelのセルコピーについて(演算式)
□投稿者/ 魔界の仮面弁士 -(2021/05/25(Tue) 15:11:58)
    No97487 (魔界の仮面弁士) に追記
    > で十分だと思います。

    コピー先の B2:B3 セルの書式を上書きしたくない場合は、先の
    >  kRange.Copy(wRange);
    という行を
     kRange.Copy();
     wRange.PasteSpecial(-4123); // xlPasteFormulas
    に書き換えれば、書式はコピーされず、セルの内容(数式)のみを貼ることができます。
記事No.97486 のレス /過去ログ169より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -