获取仍在编辑的Excel单元格的值

时间:2013-06-07 17:29:17

标签: c# .net excel office-interop

我需要捕获在Excel中添加的任何单元格或单元格中包含的值。我正在使用... ActiveWindow.Selection和get_Value(),以便一次性选择多个单元格。 ..ActiveCell.Value可以选择单个单元格。我的问题是,如果您在单个单元格中输入单个值并单击捕获值的按钮,如果仍在编辑该单元格(光标仍在单元格中但您输入了值),则所有内容都返回null 。有谁知道捕获这个值的方法?在尝试输入单个值时,我已经可以看到它对我的用户造成混淆。

请求澄清:

var selectedCell = Globals.ThisAddIn.Application.ActiveCell.Value;

如果我在此单元格中输入一个值并立即单击该按钮,则此值为空,因为单元格处于编辑模式而非选定模式。为了使其工作,我必须单击单元格,然后单击它以选择。想想单元格的不同状态......如果双击它,它就处于编辑模式。如果单击一次,则会选中它。我想要一个仍处于编辑模式的单元格的值。

2 个答案:

答案 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);