获取仍在编辑的Excel单元格的值
本文关键字:Excel 单元格 编辑 获取 | 更新日期: 2023-09-27 18:17:29
我需要捕获在Excel add中选择的任何单元格或单元格中包含的值。我目前正在使用…ActiveWindow。选择和get_Value()上,以获得多个单元格选择一次和…ActiveCell。值以获取被选中的单个单元格。我的问题是,如果您在单个单元格中输入单个值并单击捕获值的按钮,则如果该单元格仍在编辑中,一切都会返回null(光标仍在单元格中,但您已输入值)。有人知道捕获这个值的方法吗?我已经可以看到,当我的用户试图输入单个值时,这是一个混乱的来源。
要求澄清:
var selectedCell = Globals.ThisAddIn.Application.ActiveCell.Value;
如果我在此单元格中输入一个值并立即单击按钮,则该值为空,因为单元格处于编辑模式而不是选择模式。为了使它工作,我必须点击单元格,然后点击它来选择。想想一个细胞的不同状态……如果你双击它,它处于编辑模式。单击一次,表示选中。我想要一个单元格的值,仍然在编辑模式
我们在VSTO插件中也遇到了同样的问题。在做了大量的研究之后,我们得出结论,在VSTO api中没有办法获得仍处于编辑模式的单元格的值。我们最终破解了以下解决方案:无论何时按下按钮,它都会检查Excel是否处于编辑模式,如果是,它会弹出一个对话框,告诉用户在按下按钮之前必须退出编辑模式。
检查您是否处于编辑模式的代码是:
public bool IsInEditMode()
{
const int menuItemType = 1;
const int newMenuId = 18;
CommandBarControl newMenu =
Application.CommandBars["Worksheet Menu Bar"].FindControl(menuItemType, newMenuId, Type.Missing, Type.Missing, true);
return newMenu != null && !newMenu.Enabled;
}
你可以看到更多的信息在:如何告诉Excel应用程序是否在单元格编辑模式?
使用下面的c#代码退出单元格编辑模式。
private void exitEditMode()
{
if (!isExcelInteractive())
{
// get the current range
Excel.Range r = Globals.ThisAddIn.Application.ActiveCell;
// bring Excel to the foreground, with focus
// and issue keys to exit the cell
xlBringToFront();
Globals.ThisAddIn.Application.ActiveWindow.Activate();
SendKeys.Flush();
SendKeys.SendWait("{ENTER}");
// now make sure the original cell is
// selected…
r.Select();
}
}
private bool isExcelInteractive()
{
try
{
// this line does nothing if Excel is not
// in edit mode. However, trying to set
// this property while Excel is in edit
// cell mdoe will cause an exception
Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
return true; // no exception, ecel is
// interactive
}
catch
{
return false; // in edit mode
}
}
private void xlBringToFront()
{
SetForegroundWindow(Globals.ThisAddIn.Application.Hwnd);
}
[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);