迭代Excel范围

时间:2011-06-27 19:24:59

标签: 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);
 ....
}

在上面的示例中,典型的返回值是“$ 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));
}

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

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

由于

2 个答案:

答案 0 :(得分: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);
        }

答案 1 :(得分:2)

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

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