在焦点单元格中获取Excel当前值

时间:2014-02-05 17:34:15

标签: c# excel excel-vba vsto add-in vba

我正在开发Excel加载项。 我需要从A1单元格中获取值,所以我使用此代码

value = workbook.Worksheets[1].Range["A1:A1"].Value2;

这很有效,但如果:
- 上一个单元格值为" 1"
- 用户类型" 2"但不按Enter键或Tab键
- 用户按下按钮

激活功能区

从此代码示例获得的值2是" 1" (之前的价值)不是" 2" (当前值显示在单元格中但未经过验证)。这在我的情况下是错误的,我需要" 2"。
我该如何解决这个问题?


我尝试强制选择另一个单元格

 Application.ActiveCell.Offset[1, 0].Select();

 Application.ActiveSheet.Range["A2"].Select();

但没办法.." 2"价值丢失了。


我也尝试从工具栏中的文本区域获取值(" 2"显示在那里)但是不知道要做什么!

1 个答案:

答案 0 :(得分:1)

当Excel处于编辑模式时(类似于在Excel的单元格中按 F2 ),功能区上的大多数按钮和VBA编辑器无法访问。

话虽如此, VBA代码可以在编辑模式下运行吗?是的,它可以如THIS链接

中所示

要回答您的问题,您必须使用API​​来捕获密钥,然后找出该单元格的当前值。相信我,这不值得痛苦。

简单替代

使用ExcelApp.Interactive检查Excel的编辑模式。如果Excel处于编辑模式,则通知用户退出单元格并再试一次。快速检查了网络并找到了类似示例HERE请参阅所有Excel版本的正确解决方案,2000 - 2010

部分

此代码位于vb.net中,但可以轻松转换为C#

Function IsEditing() As Boolean
    If ExcelApp.Interactive = False Then Return False
    Try
        ExcelApp.Interactive = False
        ExcelApp.Interactive = True
    Catch
        Return True
    End Try
    Return False
End Function

来自聊天的C#代码

bool IsEditing()
{
    if (Globals.ThisAddIn.Application.Interactive == false)
        return false;
        try
        {
            Globals.ThisAddIn.Application.Interactive = false;
            Globals.ThisAddIn.Application.Interactive = true;
            }
                catch (Exception e)
            {
            return true;
        }
    return false;
}