c# - C# Excel worksheet_change 不总是触发
问题描述
我一直在研究一个excel插件。
这是插件的构造函数:
public AddinModule()
{
Application.EnableVisualStyles();
InitializeComponent();
AddinFinalize += new ADXEvents_EventHandler(FinalizeAddIn);
AddinInitialize += new ADXEvents_EventHandler(InitializeAddIn);
OnError += new ADXError_EventHandler(OnErrorAddIn);
EventDel_CellsChange += new Excel.DocEvents_ChangeEventHandler(CellsChange);
}
有一个按钮,除其他外,创建一个新的工作表,创建后,将 CellsChange 方法添加到 worksheet.Change 事件中,如下所示:
//some code
CreateWorkSheet();
sheet = ExcelApp.ActiveSheet as Excel.Worksheet;
sheet.Change += EventDel_CellsChange;
//some code
创建工作表时会加载 A 列值。这按预期工作。B 到 E 列的值取决于在前一列中选择的值。我遇到的问题是这些列中的任何一个的更改并不总是触发事件。我显然已经调试了插件,在 cellschange 方法中添加了断点,但结果是一样的:有时它会在断点处中断,有时它不会。当它停止时,一切正常。一旦事件没有被触发,它就不会再次起作用,除非工作表被删除,并通过按前面提到的按钮添加。我错过了什么吗?
最后,cellsChange 方法:
private void CellsChange(Excel.Range Target)
{
Excel.Worksheet sheet = null;
Excel.Range rng = null;
Excel.Range columns = null;
Excel.Range column = null;
try
{
foreach (Excel.Range c in Target.Cells)
{
if (c.Row != 1 && c.Column < (int)Columnas.Column6 && c.Value2 != null)
{
sheet = CurrentInstance.ExcelApp.ActiveSheet as Excel.Worksheet;
string[] values = null;
string AValue;
string BValue;
switch (c.Column)
{
case (int)Columnas.A:
values = GetBValues(c.Value2.ToString());
rng = sheet.Cells[c.Row, (int)Columnas.B] as Excel.Range;
break;
case (int)Columnas.B:
AValue = (string)(sheet.Cells[c.Row, (int)Columnas.A] as Excel.Range).Value;
values = GetCValues(AValue, c.Value2.ToString());
rng = sheet.Cells[c.Row, (int)Columnas.C] as Excel.Range;
break;
case (int)Columnas.C:
AValue = (string)(sheet.Cells[c.Row, (int)Columnas.A] as Excel.Range).Value;
BValue = (string)(sheet.Cells[c.Row, (int)Columnas.B] as Excel.Range).Value;
values = GetDValues(AValue, BValue, c.Value2.ToString());
rng = sheet.Cells[c.Row, (int)Columnas.D] as Excel.Range;
break;
case (int)Columnas.D:
if (c.Value2.ToString() == FUTURE)
{
AValue = (string)(sheet.Cells[c.Row, (int)Columnas.A] as Excel.Range).Value;
BValue = (string)(sheet.Cells[c.Row, (int)Columnas.B] as Excel.Range).Value;
string moneda = (string)(sheet.Cells[c.Row, (int)Columnas.C] as Excel.Range).Value;
values = GetEValues(AValue, BValue, moneda, c.Value2.ToString());
rng = sheet.Cells[c.Row, (int)Columnas.E] as Excel.Range;
}
break;
default:
break;
}
if (values != null)
{
sheet.Unprotect(Type.Missing);
columns = rng.Columns;
column = columns[1] as Excel.Range;
column.Validation.Delete();
SetRangeFormat(column, FormatType.Text);
column.Validation.Add(Excel.XlDVType.xlValidateList, Excel.XlDVAlertStyle.xlValidAlertInformation,
Type.Missing, string.Join(Separator, values), Type.Missing);
column.Validation.InCellDropdown = true;
column.Locked = false;
sheet.Protect(Type.Missing, false, true, false, false, true, true, true, false, false, true, false, false, true, true, true);
}
}
}
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
}
finally
{
if (sheet != null)
{
Marshal.ReleaseComObject(sheet);
}
if (columns != null) Marshal.ReleaseComObject(columns);
if (rng != null) Marshal.ReleaseComObject(rng);
if (column != null)
{
Marshal.ReleaseComObject(column);
}
}
}
解决方案
推荐阅读
- rust - 如何构建将从目录导入模块的宏?
- azure - az 存储容器列表。不起作用,引用已删除的存储
- javascript - 打字稿从字符串中获取枚举值
- powerbi - Power BI 排序 - 隐藏排序列
- python - sqlalchemy 中嵌套序列化程序的问题
- javascript - 如何在 vue.js 的模板中获取 body html 元素?
- python - 如何链接在两个列表之间创建连接?
- computer-vision - 图像嵌入稀疏性
- java - 在 0mq 套接字上运行的 java 计时器线程的可能替代方案
- javascript - 使用 map、reduce、filter 为 JavaScript 优化嵌套循环