2011-06-27 15 views
7

私は、ExcelアプリケーションのSheetChangeイベントを使用して、Excelのアプリケーションシートの変更を取得しています。典型的な戻り値は「$ C $ 11」である上記の例でExcelの範囲を反復する

void CellsChange(object Sh, Excel.Range Target) 
{ 
.... 
string changedCell = Target.get_Address(Missing.Value, Missing.Value, Excel.XlReferenceStyle.xlA1, Missing.Value, Missing.Value); 
.... 
} 

: ユーザがセル座標を取得し、1つだけのセルを変更した場合は、経由して行うことができます。

しかし、複数のセルをハイライト表示してshift-enterを使用して範囲全体を同じ値にすると、返される文字列は次のようになります。 "$ C $ 11:$ K $ 11 "(行内で9セルの変化を示す)。

どのように範囲をスローすることができますか?各セルの座標と値をforeachまたはforループで取得します。 私は、次の...

for (int i = 0; i < Target.Count; i++) 
{ 
    Excel.Range r = Target.Item[i]; 
    MessageBox.Show(Convert.ToString(r.Value2)); 
} 

を試みたが、このコードは私に新しい値を元の範囲のセルを与えていません。 私もTarget.Itemロジックに従っていませんでした。ゼロベースの配列か1つのベースの配列ですか? いくつか試行してみると、Item配列は配列として整形されたシートセル範囲全体であるように見えます(したがって、強調表示された範囲の左側にある1つのセルであるItem [0]も同様に使用できます)。

Rangeオブジェクトや上記のイベントの使用経験が豊富な人はいますか?

おかげ

+0

何のライブラリを使用していますExcelで作業しますか? – Jethro

+5

Excelで何かを実行するときに構文、オブジェクト、またはロジックが何であるかを知る必要があるときは、マクロを記録してみてください。通常、それが生成するものは、あなたの問題を解決する方法のかなり良いアイデアを与えます。 –

答えて

13

編集: 申し訳ありませんが、私は質問を読み違えます。イベントハンドラで既にRangeオブジェクトを取得しているので、範囲のワークシートを再クエリーする必要はありません。新しい値を取得することはできません。代わりに

、このように、Range.Cellsプロパティをループしてみてください:範囲を反復する

 foreach (Range c in Target.Cells) 
     { 
      string changedCell = c.get_Address(Type.Missing, Type.Missing, XlReferenceStyle.xlA1, Type.Missing, Type.Missing); 
      MessageBox.Show("Address:" + changedCell + " Value: " + c.Value2); 
     } 
+0

ありがとう、これは私が探していたものです。 – NirMH

+0

@Alexandre:私は確かにExcelのマクロであなたのヒントを使用します... – NirMH

+0

確かに上記の更新されたコードは私のセットアップに関連していますが、 – NirMH

1

、それは1ベースですが、それは次のようになります。あなたはに

for (int i = 1; i <= Target.Count; i++) 
{ 
    Excel.Range r = (Excel.Range)Target.Item[i]; 
    MessageBox.Show(Convert.ToString(r.Value2)); 
} 
関連する問題