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

本文关键字:Excel 单元格 编辑 获取 | 更新日期: 2023-09-27 18:17:29

我需要捕获在Excel add中选择的任何单元格或单元格中包含的值。我目前正在使用…ActiveWindow。选择和get_Value()上,以获得多个单元格选择一次和…ActiveCell。值以获取被选中的单个单元格。我的问题是,如果您在单个单元格中输入单个值并单击捕获值的按钮,则如果该单元格仍在编辑中,一切都会返回null(光标仍在单元格中,但您已输入值)。有人知道捕获这个值的方法吗?我已经可以看到,当我的用户试图输入单个值时,这是一个混乱的来源。

要求澄清:

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

如果我在此单元格中输入一个值并立即单击按钮,则该值为空,因为单元格处于编辑模式而不是选择模式。为了使它工作,我必须点击单元格,然后点击它来选择。想想一个细胞的不同状态……如果你双击它,它处于编辑模式。单击一次,表示选中。我想要一个单元格的值,仍然在编辑模式

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

我们在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);