Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Excel加载项工作表错误0x800A03EC-未请求的单元格移动_C#_Excel - Fatal编程技术网

C#Excel加载项工作表错误0x800A03EC-未请求的单元格移动

C#Excel加载项工作表错误0x800A03EC-未请求的单元格移动,c#,excel,C#,Excel,好吧,伙计们,我给你们准备了一个大脑损伤器;我正在尝试为excel开发一个相对简单的外接程序,它应该从工作簿中的工作表a中读取数据,创建一个新的或更新的工作表B,以便在按下按钮时在工作表a中包含所述数据的简化版本。下面是我正在处理的一些示例代码: Application.SendKeys(“{ENTER}”);//退出编辑模式 Excel.Workbook wb=this.Application.ActiveWorkbook; Excel.sheetA=null; Excel.sheetB=nu

好吧,伙计们,我给你们准备了一个大脑损伤器;我正在尝试为excel开发一个相对简单的外接程序,它应该从工作簿中的工作表a中读取数据,创建一个新的或更新的工作表B,以便在按下按钮时在工作表a中包含所述数据的简化版本。下面是我正在处理的一些示例代码:

Application.SendKeys(“{ENTER}”);//退出编辑模式
Excel.Workbook wb=this.Application.ActiveWorkbook;
Excel.sheetA=null;
Excel.sheetB=null;
foreach(工作表工作表中的Excel.Worksheet工作表){
//假设要从中移动的原始工作表与图书名称相同
if(sheet.Name==wb.Name)
sheetA=板材;
//要移动到的工作表将被称为“审阅”。如果存在,则进行清理。
否则如果(sheet.Name==“审阅”)
{
sheetB=板材;
sheetB.Cells.ClearContents();
}
}
//如果找不到原始工作表,则假定它是第一张工作表
如果(sheetA==null)
sheetA=(Excel.Worksheet)wb.Worksheets[1];
//如果原始工作表不存在,则在原始工作表之后添加审阅工作表
如果(sheetB==null)
{
sheetB=wb.工作表.添加(在:sheetA之后);
sheetB.Name=“审阅”;
}
//只需跨第一个单元格的值进行复制
表B.范围[“A1”]。值2=表A.范围[“A1”]。值2;
现在,这段代码的结果似乎完全不同,这取决于是否有任何内容处于“编辑模式”(单元格正在编辑)。如果没有,则一切正常,在正确的位置创建一个新的工作表并填充单元格

但是,如果正在编辑某个单元格,则已编辑的单元格将移动到工作簿中的另一个工作表中。如果没有其他工作表移动到
COMException
HRESULT:0x800A03EC
,则抛出(错误未知)


这个错误经常出现,它告诉你“如果我知道的话,那就见鬼去吧”,这让人非常沮丧,所以任何想法都会得到赞赏。最常见的情况似乎是“工作表不存在”,这里就是这种情况,但我不知道它为什么要首先移动已编辑的单元格?

找到了解决方案。模拟返回键笔划(我的示例的第一行)确实会退出编辑模式,但应用程序需要延迟才能处理它。我的实施结果如下:

Application.SendKeys("{ENTER}"); // Exit edit mode
Timer timer = new Timer(100); // 100ms delay
timer.AutoReset = false; // Stop the timer looping and re-executing
timer.Elapsed += new ElapsedEventHandler((Sender, ent) =>
{
    // Code you want to execute outside of edit mode
});
timer.Start(); // Start her up!
希望能帮助一些迷失的灵魂