遍历Excel范围

我正在使用Excel应用程序SheetChange事件来捕获我的Excel应用程序表中的任何更改。 如果用户仅修改1个单元格,则可以通过以下方式来获取单元格坐标:

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

在上面的例子中,典型的返回值是“$ C $ 11”。

但是,如果用户通过突出显示多个单元格来修改一系列单元格,并使用shift-enter填充整个范围,则返回的string可能类似于:“$ 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逻辑 – 它是基于零的数组还是基于一个数组。 在几次尝试中,它看起来像Item数组是整个表格单元格区域格式化为数组(因此也可以使用Item [0],这是高亮区域左侧的一个单元格)。

有没有人有更多的使用Range对象和/或上述事件的经验?

谢谢

编辑:对不起,我误解了这个问题。 由于您已经在您的事件处理程序中获得了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); } 

迭代范围,它是基于1的,即:

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