C#Excel工作表(更改不总是触发)

C#Excel工作表(更改不总是触发),c#,excel,worksheet-function,C#,Excel,Worksheet Function,我一直在开发excel加载项 这是加载项的构造函数: public AddinModule() { Application.EnableVisualStyles(); InitializeComponent(); AddinFinalize += new ADXEvents_EventHandler(FinalizeAddIn); AddinInitialize +=

我一直在开发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方法将添加到工作表中。更改事件,如下所示:

//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);
                }
            }
        }

private void CellsChange(Excel.Range目标)
{
Excel.工作表=null;
Excel.Range rng=null;
Excel.Range columns=null;
Excel.Range列=null;
尝试
{
foreach(Target.Cells中的Excel.Range c)
{
如果(c.Row!=1和&c.Column<(int)columns.Column6和&c.Value2!=null)
{
sheet=CurrentInstance.ExcelApp.ActiveSheet作为Excel.Worksheet;
字符串[]值=null;
字符串AValue;
字符串b值;
开关(c柱)
{
案例(int)列A:
values=GetBValues(c.Value2.ToString());
rng=表格单元格[c.Row,(int)Columnas.B]作为Excel.Range;
打破
案例(int)第B列:
AValue=(字符串)(sheet.Cells[c.Row,(int)Columnas.A]作为Excel.Range.Value;
values=GetCValues(AValue,c.Value2.ToString());
rng=表格单元格[c.Row,(int)Columnas.c]作为Excel.Range;
打破
案例(int)第C列:
AValue=(字符串)(sheet.Cells[c.Row,(int)Columnas.A]作为Excel.Range.Value;
BValue=(字符串)(sheet.Cells[c.Row,(int)Columnas.B]作为Excel.Range.Value;
values=GetDValues(AValue,BValue,c.Value2.ToString());
rng=表格单元格[c.Row,(int)Columnas.D]作为Excel.Range;
打破
案例(int)第D列:
if(c.Value2.ToString()=未来)
{
AValue=(字符串)(sheet.Cells[c.Row,(int)Columnas.A]作为Excel.Range.Value;
BValue=(字符串)(sheet.Cells[c.Row,(int)Columnas.B]作为Excel.Range.Value;
字符串moneda=(字符串)(sheet.Cells[c.Row,(int)Columnas.c]作为Excel.Range.Value;
values=GetEValues(AValue、BValue、moneda、c.Value2.ToString());
rng=表格单元格[c.Row,(int)Columnas.E]作为Excel.Range;
}
打破
违约:
打破
}
如果(值!=null)
{
表.取消保护(类型.缺失);
columns=rng.columns;
column=列[1]作为Excel.Range;
column.Validation.Delete();
SetRangeFormat(列,FormatType.Text);
column.Validation.Add(Excel.XlDVType.xlValidateList,Excel.XlDVAlertStyle.xlValidAlertInformation,
Type.Missing,string.Join(分隔符,值),Type.Missing);
column.Validation.InCellDropdown=true;
column.Locked=false;
表.保护(类型:缺失、虚假、真实、虚假、虚假、真实、真实、虚假、虚假、虚假、真实、虚假、虚假、真实、真实、真实);
}
}
}
}
捕获(例外e)
{
Debug.WriteLine(e.Message);
}
最后
{
如果(工作表!=null)
{
元帅发布对象(第页);
}
如果(列!=null)封送.ReleaseComObject(列);
如果(rng!=null)封送处理ReleaseComObject(rng);
if(列!=null)
{
Marshal.ReleaseComObject(列);
}
}
}

我想知道在您的代码的其余部分是否有
Application.EnableEvents=False
您是否可以访问例如“OnErrorAddIn”代码?@anefeletos,不,没有
Application.EnableEvents=False