Excel 抛出异常 HRESULT: 0x800A03EC 而用户仍在单元格中键入且单元格值发生变化
Excel throws exception HRESULT: 0x800A03EC whilst user is still typing in a cell and cell values change
我正在用 C# 创建一个 Excel 插件,我通过单击插件按钮更改了一些单元格值。它工作顺利,但是,我注意到如果用户试图在任何单元格中键入内容(不仅仅是我要更改值的单元格),它总是会抛出 HRESULT: 0x800A03EC
异常。
我的代码很简单,例如我只用这段代码测试过:
private void buttonFoo_Click(object sender, RibbonControlEventArgs e)
{
var ws = Globals.ThisAddIn.Application.ActiveSheet;
ws.Range["A1"].Value = "bar";
}
当我点击一个随机单元格时,键入 "foo",但我没有点击工作表上的任何地方,我没有完成写作 "foo",而是在我点击 buttonFoo 的同时我仍然专注于我的单元格,它抛出了这个异常。
这张图片可以解释我正在尝试做什么,我将点击图片中的“测试”按钮,同时仍然像这样输入:
我认为如果我试图在特定单元格中键入内容并且我也在我的代码中更改该特定单元格,则会发生此异常。但事实并非如此。我试过选择一个未使用的单元格,如下所示:
ws.Range["B1"].Select();
没有帮助。我试过发送 ESC 键来取消用户输入:
excelApp.SendKeys("{ESCAPE}");
我测试了这个,它确实会发送Escape,但它仍然会抛出异常。我完全没有想法,也没有发现任何关于这个问题的信息。我的意思是我可以用 try/catch 包围所有东西来寻找这个异常,但这太糟糕了..有人知道该怎么做吗?
尝试这样的事情来查看应用程序是否繁忙:
bool XLAppBusy()
{
if (Globals.ThisAddIn.Application.Interactive == false)
{
return false;
}
try
{
Globals.ThisAddIn.Application.Interactive = false;
Globals.ThisAddIn.Application.Interactive = true;
}
catch
{
return true;
}
return false;
}
private void buttonFoo_Click(object sender, RibbonControlEventArgs e)
{
if (XLAppBusy() == false)
{
ws.Range["A1"].Value = "bar";
}
}
我正在用 C# 创建一个 Excel 插件,我通过单击插件按钮更改了一些单元格值。它工作顺利,但是,我注意到如果用户试图在任何单元格中键入内容(不仅仅是我要更改值的单元格),它总是会抛出 HRESULT: 0x800A03EC
异常。
我的代码很简单,例如我只用这段代码测试过:
private void buttonFoo_Click(object sender, RibbonControlEventArgs e)
{
var ws = Globals.ThisAddIn.Application.ActiveSheet;
ws.Range["A1"].Value = "bar";
}
当我点击一个随机单元格时,键入 "foo",但我没有点击工作表上的任何地方,我没有完成写作 "foo",而是在我点击 buttonFoo 的同时我仍然专注于我的单元格,它抛出了这个异常。
这张图片可以解释我正在尝试做什么,我将点击图片中的“测试”按钮,同时仍然像这样输入:
我认为如果我试图在特定单元格中键入内容并且我也在我的代码中更改该特定单元格,则会发生此异常。但事实并非如此。我试过选择一个未使用的单元格,如下所示:
ws.Range["B1"].Select();
没有帮助。我试过发送 ESC 键来取消用户输入:
excelApp.SendKeys("{ESCAPE}");
我测试了这个,它确实会发送Escape,但它仍然会抛出异常。我完全没有想法,也没有发现任何关于这个问题的信息。我的意思是我可以用 try/catch 包围所有东西来寻找这个异常,但这太糟糕了..有人知道该怎么做吗?
尝试这样的事情来查看应用程序是否繁忙:
bool XLAppBusy()
{
if (Globals.ThisAddIn.Application.Interactive == false)
{
return false;
}
try
{
Globals.ThisAddIn.Application.Interactive = false;
Globals.ThisAddIn.Application.Interactive = true;
}
catch
{
return true;
}
return false;
}
private void buttonFoo_Click(object sender, RibbonControlEventArgs e)
{
if (XLAppBusy() == false)
{
ws.Range["A1"].Value = "bar";
}
}