我正在使用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对象和/或上述事件的经验?
由于
答案 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));
}