迭代Excel范围

Nir*_*rMH 8 c# 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);
 ....
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,典型的返回值是"$ C $ 11".

但是如果用户通过突出显示多个单元格来修改一系列单元格,并使用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));
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码并没有给我原始范围单元格的新值.我也没有遵循Target.Item逻辑 - 它是基于零的数组还是一个基于数组的数组.在几次尝试中,看起来Item数组是整个单元格范围,形成为数组(因此也可以使用Item [0],这是突出显示范围左侧的一个单元格).

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

谢谢

Sli*_*345 15

编辑: 对不起,我误解了这个问题.由于您已经在事件处理程序中获取了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);
        }
Run Code Online (Sandbox Code Playgroud)


小智 5

要迭代 Range,它是基于 1 的,即:

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