*

[Excel, C#]C#でExcelの値の変更イベントを取得する。

公開日: : 最終更新日:2014/12/29 C#, Excel

Excelのイベント取得

処理の流れ

  1. 対象のワークシートを取得する。
  2. イベントハンドラをシートに設定する。
  3. イベントの処理を起こす。

ソース

using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
public partial class Form1 : form{
	public ArrangementForm() {
		InitializeComponent();
		Initialize();
	}

	private void Initialize() {
		Excel.Application app = Globals.ThisAddIn.Application;
		Excel.WorkBook wbook = app.Workbooks.Add();
		Excel.Worksheet wSheet = wbook.ActiveSheet;
		wSheet.Change += new Excel.DocEvents_ChangeEventHandler(CellChangeEvent);
	}

	public void CellChangeEvent(Excel.Range range) {
		MessageBox.Show(range.Value);
	}

	private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
		WSheet.Change -= new Excel.DocEvents_ChangeEventHandler(CellChangeEvent);
	}
}

解説

イベント変更

Excel.Worksheet wSheet = wbook.ActiveSheet;
wSheet.Change += new Excel.DocEvents_ChangeEventHandler(CellChangeEvent);

現在のExcelのシートを取得し、そのシートのイベントハンドラを変更しています。
対象のシートを特定しているので、他のシートでセルの値を変更したとしても、イベントが呼ばれることはありません。
また、Formで定義しているので、Formを閉じれば自然とイベントも元に戻り、終了したのにイベントが呼ばれる、ということは起きません。

追加したイベントの削除

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
	WSheet.Change -= new Excel.DocEvents_ChangeEventHandler(CellChangeEvent);
}

Formを閉じるときに追加したイベントハンドラを削除しています。
これによりFormが閉じたあともイベントを取得してしまうことを防ぎます。

実行イメージ

wannabenote
“a”と入力し、Enterキーを押した直後です。
メッセージボックスが値が変更されたセルの値を表示しています。

ad

関連記事

cwbx.dll 参照の追加

[C#,AS400]C#でAS400のプログラムCallとコマンドの実行方法。

PCのプログラムからCall AS400のRPGPGMをPCから呼び出ししたいときがあります。

記事を読む

unity debug

[Unity]MonoDevelopのデバッグの仕方

コメントで頂いた質問を打破するためにデバッグの仕方でも書いてみます。 まずは、プロジェクトを開

記事を読む

Unity_

[Unity]Unity2Dチュートリアル スプライトを利用する その2

前回で、タイルを置いて、全部消えちまうじゃねぇか! 色一個一個つけるのめんどくせぇ!! というところ

記事を読む

logo

[C#]XML Serializerで読み書き

XML XMLを触りたいので適当にメモ書き 書き出し using System.IO;

記事を読む

logo

[Unity]Unity 2Dチュートリアル スプライトを元の位置に戻す ソース解説

◆全文 using UnityEngine; using System.Collection

記事を読む

Excel Csharp

[C#]DataGridViewにプロパティを利用しながら配列をバインドする。

DataGridView C#のFormにデータを表示するのに便利なコントロールがあります。 デ

記事を読む

Wannabenote

[Unity]Unity2Dチュートリアル パズルを落下させる。

前回の続き。 とりあえず、パズルが消えたので、パズルを落としましょう。 以下のようにソースを

記事を読む

logo

[C#]拡張メソッドとリフレクションで列挙体に設定した文字列を表示

前に書いた、列挙体の文字列を返すための書き方。 文字列と列挙体を少しでも近い位置に書きたいときに。

記事を読む

logo

プログラミング言語の選択

最初のプログラミング言語っていうのは思い入れが深いもんです。 私はこんな感じ。 C言語 ↓ jav

記事を読む

logo

[C#]AS400をDBに見立ててPCのPGMからODBC接続する

◆前提条件◆ PCにClient Accessがインストールされている。 PCに.NET Fra

記事を読む

ad

Comment

  1. tomi より:

    いつも参考にさせていただいています。
    ありがとうございます。

    突然ですが、質問があります!
    C# で Excel 操作関連についてです。

    Excel のsheet を active にしたいのですが、

    Excel.Worksheetsheet1Worksheet = wbook.Worksheets["sheet1"];
    sheet1Worksheet.Activate();

    上記が反応しません。。。
    ご教授いただけますと幸いです。

    • わな び より:

      深夜帰りが続いていて、返事が遅くなってごめんなさい。

      多分やりたいことは
      ((Excel._Worksheet)sheet1Worksheet).Activate();
      あたりなのかな、と思います。

      activeっていうのはどういう状態でしょうか。
      “sheet1″が最前面にくるようにしたい、ということでしょうか。

      とりあえず自宅にはOfficeないんで明日触ってみます。

      • tomi より:

        ありがとうございます(❛ᴗ❛人)✧
        仰せの通りです!
        selectでもいいかもしれないのですが、VBAで書いてあるプログラムをC#にただただ書き換えてます。
        なので、ただただ書き換えるにはどーしたら良いのか探しても見当たらなくて、質問させていただいてます☂꒰´•௰•`๑꒱…

        • わな び より:

          VBAを殆ど書き換えるだけで大体は動くんですけど、C#の仕様でいくつか特殊な変更が必要だったりするから難しいですよねぇ。

          試しに以下でやってみたら、sheet2が前面に来ました。
          Activate()であいまい警告が出てましたが。

          【ソースここから】
          using Excel = Microsoft.Office.Interop.Excel;
          using Office = Microsoft.Office.Core;
          using Microsoft.Office.Tools.Excel;

          /* 中略 */

          Excel.Application app = Globals.ThisAddIn.Application;
          Excel.Workbook book = app.ActiveWorkbook;
          Excel.Worksheet sheet = book.Worksheets["sheet2"];
          sheet.Activate();
          【ソースここまで】

          となるとbookがつかめてないか、appがつかめてないか、環境(私のはVisualStudioのExcel2010Addinプロジェクト)が違うか、のどれかでしょうか。
          コメントに記載して頂いたソースよりもっと前のあたりからソースを頂くとわかるかも?

          • tomi より:

            ありがとうございます!☆

            私もあいまい警告出てます。。。
            でも前面に来たのですね!!!

            私の根本的な考え方が間違っていたかもしれないです。
            VBAってステップイン?!でデバックすると、エクセルが動いてくれるじゃないですか、C#も動くものかと思ってステップイン実行したのですが、動かないものなのですか?!動かないから、反応しないっと思っているもかもしれません。。。

            でも、ひとつ違いがありました!
            using Microsoft.Office.Tools.Excel;
            ↑上記を使っていないです。。。

            【ソースここから】

            using System.IO;
            using System.Windows.Forms;
            using Excel = Microsoft.Office.Interop.Excel;
            using Office = Microsoft.Office.Core;
            using System;
            using System.Text;
            using System.Diagnostics;
            using Microsoft.Office.Tools.Ribbon;

            /* 中略 */

            var app = Globals.ThisAddIn.Application;
            var wbook = app.ActiveWorkbook;
            Excel.Worksheet sheet = wbook.Worksheets["sheet2"];
            sheet .Activate();

            【ソースここまで】

          • わな び より:

            using Microsoft.Office.Tools.Excel;はたぶん関係なさそうです。
            コピペのときにそこもExcelだからってコピペしてしまいました、ごめんなさい。

            using System.Windows.Forms;あたりを見て、適当にForm作って、ボタンをつけて、頂いたソースをそのままコピペして実行したら最前面にきました。

            ついで、ステップイン実行でも確認してみたのですが、sheet.Activate();を通過した直後に最前面にきました。

            こうなるとわからん\(^o^)/

            ちなみにそのソースの後に
            sheet.Cells[1, 1] = 1;
            とかするとExcelのセルにその値が出力とかされます?

  2. tomi より:

    using Microsoft.Office.Tools.Excel;はたぶん関係なさそうです。

    >そうですか。

    ちなみにそのソースの後に
    sheet.Cells[1, 1] = 1;
    とかするとExcelのセルにその値が出力とかされます?

    >はい!されます!

    いろいろありがとうございます。
    何か進展あったら報告します!☆”

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑