如何强制单元格在Excel互操作中停止编辑?

时间:2014-03-18 14:52:13

标签: c# .net excel-interop

我有一个带有功能区的Excel 2007加载项。功能区中的一个按钮会触发当前工作表的大量操作,并且在为速度和用户体验原因进行操作期间,我将Excel.ApplicationInteractive等各种EnableEvents属性设置为false

我的问题是功能区没有窃取焦点,所以如果用户在单击我的功能区按钮时正在编辑单元格,则在设置Application.Interactive = false时会抛出异常,因为Excel认为用户仍在编辑细胞。

有没有办法通过保存或放弃对单元格所做的更改来停止编辑?

似乎Range.DiscardChanges()可能会解决我的问题,但它在2007 API中无法使用。

编辑:似乎Range.DiscardChanges()适用于基于OLAP数据源的范围,因此无论如何它都无法解决我的问题。

编辑:我试过在另一个小区上调用Range.Activate()。虽然我确实看到GUI中的单元格焦点发生了变化,但无论如何都会抛出异常。 Range.Select()没有做任何事情。

5 个答案:

答案 0 :(得分:3)

所以在环顾了几天并在MSDN上询问之后,最终的答案是API中没有任何内容,并且如果不使用hacky解决方案 1 则不可能。

Excel本身处理这种事情的方式只是在用户编辑时使其菜单变灰,所以为了与主机应用程序保持一致,我已经这样做了。

1 :Hacky,因为使用SendKeys之类的技术需要返回GUI以确保处理操作然后调用需要单元格不在版本中的方法。这在一个地方很好,但每次调用Excel Interop的方法都是疯狂的。

答案 1 :(得分:3)

您无法停止编辑,但可以检查是否已启用编辑,然后告诉用户停止编辑:

private bool IsEditing(Microsoft.Office.Interop.Excel.Application excelApp)
{
    if (excelApp.Interactive)
    {
        try
        {
            excelApp.Interactive = false;
            excelApp.Interactive = true;
        }
        catch (Exception)
        {
            MessageBox.Show("Please stop cell editing before you continue.");
            return true;
        }
    }
    return false;
}

我在此页面找到了答案并将其从VBA更改为C#: https://www.add-in-express.com/creating-addins-blog/2011/03/23/excel-check-user-edit-cell/

答案 2 :(得分:0)

回答它可能为时已晚。但是当他们寻找解决方案时,他们会想到有人会使用这个技巧。

由于某种原因,sendkeys和Cells / Range激活命令没有锻炼。

解决此问题的唯一解决方法是将焦点更改为另一个工作表并返回当前工作表以欺骗excel。 : - )

ExcelUtil.ActivateWorksheet("Sheet1");
currentWorksheet.Activate();

public static void ActivateWorksheet(string strWorksheetName)
    {
        bool found = false;

        foreach (Excel.Worksheet sheet in Globals.ThisAddIn.Application.Worksheets)
        {
            if (sheet.Name.ToLower() == strWorksheetName.ToLower())
            {
                found = true;
                break;
            }
        }

        if (!found)
            Globals.ThisAddIn.AddNewWorksheet(strWorksheetName);

        ((Excel.Worksheet)Globals.ThisAddIn.Application.Worksheets[strWorksheetName]).Activate();
    }

希望这有帮助。

拉​​姆

答案 3 :(得分:-1)

如果您选择其他单元格或所有单元格,错误是否会消失?

private void myFunction() { xlSheet.Cells.Select(); //the rest of the work }

答案 4 :(得分:-1)

我检测到问题并显示一条消息告诉用户:          如果是excelHelper.ExcelIsEditing(),则             System.Media.SystemSounds.Beep.Play()             MsgBox(“请完成对工作表的编辑!”&vbCrLf&vbCrLf&“将光标移出当前单元格,然后再次尝试按钮。”)             退出功能          如果结束

函数ExcelIsEditing()为布尔值       ExcelIsEditing = False

  If ExcelApp.Interactive = False Then Return False
  Try
     ExcelApp.Interactive = False
     ExcelApp.Interactive = True
  Catch
     Return True
  End Try

结束功能

尽我所能::(