我正在使用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)