我需要捕获在Excel中添加的任何单元格或单元格中包含的值。我正在使用... ActiveWindow.Selection和get_Value(),以便一次性选择多个单元格。 ..ActiveCell.Value可以选择单个单元格。我的问题是,如果您在单个单元格中输入单个值并单击捕获值的按钮,如果仍在编辑该单元格(光标仍在单元格中但您输入了值),则所有内容都返回null 。有谁知道捕获这个值的方法?在尝试输入单个值时,我已经可以看到它对我的用户造成混淆。
请求澄清:
var selectedCell = Globals.ThisAddIn.Application.ActiveCell.Value;
如果我在此单元格中输入一个值并立即单击该按钮,则此值为空,因为单元格处于编辑模式而非选定模式。为了使其工作,我必须单击单元格,然后单击它以选择。想想单元格的不同状态......如果双击它,它就处于编辑模式。如果单击一次,则会选中它。我想要一个仍处于编辑模式的单元格的值。
答案 0 :(得分:3)
我们在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;
}
您可以在以下网址查看更多信息:How to tell if Excel Application is in cell-edit mode?
答案 1 :(得分:0)
使用以下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);