我有一个带有功能区的Excel 2007加载项。功能区中的一个按钮会触发当前工作表的大量操作,并且在为速度和用户体验原因进行操作期间,我将Excel.Application
和Interactive
等各种EnableEvents
属性设置为false
我的问题是功能区没有窃取焦点,所以如果用户在单击我的功能区按钮时正在编辑单元格,则在设置Application.Interactive = false
时会抛出异常,因为Excel认为用户仍在编辑细胞。
有没有办法通过保存或放弃对单元格所做的更改来停止编辑?
似乎Range.DiscardChanges()
可能会解决我的问题,但它在2007 API中无法使用。
编辑:似乎Range.DiscardChanges()
适用于基于OLAP数据源的范围,因此无论如何它都无法解决我的问题。
编辑:我试过在另一个小区上调用Range.Activate()
。虽然我确实看到GUI中的单元格焦点发生了变化,但无论如何都会抛出异常。 Range.Select()
没有做任何事情。
答案 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
结束功能
尽我所能::(