Excel 2013工作表激活

Excel 2013工作表激活,excel,excel-2013,vba,Excel,Excel 2013,Vba,我在从用户表单激活工作表时遇到了一个问题,相同的代码在Excel 2003到Excel 2010中运行良好,在Excel 2013中不起作用 这就是如何简单地重现问题: 有一个包含两个工作表的工作簿,称为Sheet1和Sheet2,比方说,在Sheet12按钮上: 单击按钮1时,使用Macro1激活Sheet2工作表,其中有一行: ThisWorkbook.Sheets("Sheet2").Select 我可以很好地编辑数据 点击Button2aUserForm1弹出,点击CommandBut

我在从用户表单激活工作表时遇到了一个问题,相同的代码在Excel 2003到Excel 2010中运行良好,在Excel 2013中不起作用

这就是如何简单地重现问题:

有一个包含两个工作表的工作簿,称为
Sheet1
Sheet2
,比方说,在
Sheet1
2按钮上:

  • 单击
    按钮1
    时,使用
    Macro1
    激活
    Sheet2
    工作表,其中有一行:

    ThisWorkbook.Sheets("Sheet2").Select
    
    我可以很好地编辑数据

  • 点击
    Button2
    a
    UserForm1
    弹出,点击
    CommandButton1
    调用相同的宏1,如下所示:

    Unload Me
    Macro1
    
    Sheet2
    工作表被激活,但如果我编辑其中的数据,它实际上会更新Sheet1中的相应单元格,如果我单击
    Sheet1
    我可以看到其中输入的数据

  • 单击返回到
    Sheet2
    工作表可正确激活
    Sheet2
    工作表

    有人见过这种行为吗?如果是,是否有任何编码变通方法可以正确激活
    表2

    Sub Macro1()
    Sheets("Sheet2").Select
    End Sub
    
    Sub Macro2()
    Unload Me
    Call Macro1
    End Sub
    
    这很有效。我可以在一定程度上重现您的错误,但它可能是宏的位置?(模块与图纸)


    编辑:一开始我没有看到你的评论,我有Excel2010(这就是为什么我不能真正复制它)-抱歉

    请避免使用。选择。你可能想看看

    话虽如此,如果您真的想激活工作表,请使用.activate

    比如说

    Sheets("Sheet2").Activate
    
    因此,在代码中使用它,它将如下所示

    Sub Macro1()
        Sheets("Sheet2").Activate
    End Sub
    
    Sub Macro2()
        Macro1
        Unload Me
    End Sub
    

    哇,我能用2013重现这个错误。这是Excel新SDI界面的一个奇妙的失败。有趣的是,当你遵循以下步骤时

    • Sheet1
    • Sheet2
    • 单击
      按钮2
      ,打开表单
    • 单击表单上的
      命令按钮1
      (该按钮隐藏表单并激活
      表单2
    它看起来像是选中了
    Sheet2
    上的单元格
    B2
    ,但当您开始键入时,文本将进入单元格
    A1
    ;点击回车键后,文本将消失在
    sheet 1上的单元格
    B2

    你几乎必须看到它才能相信它

    我发现唯一有效的方法就是使用
    Ontime
    函数

    Private Sub CommandButton1_Click()
        Unload Me
        'Call Macro1
        Application.OnTime Now(), "Macro1"
    End Sub
    

    …但我有一种感觉,这不会帮助所有人

    根据Profex的回答,我能够在Excel 2013中重现错误。对我来说,解决这个问题的一个解决办法是使我的userform无模式

    userform1.show vbModeless
    

    我明白,如果您需要模式表单,此解决方案将不会有帮助,但希望它能为下一个人节省一些时间。

    我也有同样的问题,但我的代码实际上是在Excel COM加载项中运行的,这与VBA略有不同

    我的代码在20032010工作。。。使用
    工作表(“Sheet2”)。激活
    ,但不激活2013

    但我通过在事件代码(
    按钮
    事件)后100毫秒启动计时器解决了这个问题


    然后此修剪器打开文件并使用
    图纸(“Sheet2”)。激活
    。然后,它被选中,与旧版本中的情况相同。

    我找到了类似情况的可能解决方法。我们有一个使用COM和XLL代码的复杂Excel加载项。(无VBA)我们遇到了与上述类似的问题。(从模式对话框激活图纸时,新的单元格数据出现在上一张图纸上)


    在我们的例子中,我们发现只有当代码计算单元格区域的“.HasFormula”属性时,问题才会出现。没有合乎逻辑的解释。如果我们编译的.Net代码评估了该属性,我们将观察到该错误。如果代码忽略了该属性,我们就没有观察到错误。我们还发现,如果我们在工作表(选项卡)之间手动来回单击,错误就会消失。

    通过自动化错误激活上述Excel 2013工作表的解决方法如下(c#):


    调用该helper方法,而不是直接调用oSheet.Activate()。欢迎:-)

    工作表上的工作表编码\u选择更改
    事件刚刚放入
    me。激活

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Me.Select
    End Sub
    

    我认为迪玛·雷兹尼科夫的答案是正确的。我使用了他的C#代码并在VBA中实现了它,它似乎解决了这个问题。我的个人代码还包括模态用户表单的使用

    例如:

    Sub Macro1()
        Dim ws As Worksheet
        Dim win As Window
    
        '... bunch of code here...
    
        ws.Activate
        Set win = Application.ActiveWindow
        win.Visible = False
        win.Visible = True
    End Sub
    

    希望这能帮助其他同样被C代码弄糊涂的人。

    你的用户表单是模态的吗?是的,用户表单是模态的。我想你现在可能有
    application.ScreenUpdate=false
    。您还必须像这样调用userform
    userform.show False
    。检查工作表名称,确保错误转到0时
    。谢谢,Siddharth,我没有提到,但我也尝试过激活,同样的结果,2013年不起作用,适用于旧版本的Excel(2003年、2007年和2010年试用)。关于HasFormula,这里的问题与此完全相同。如果我把这行注释掉,OP中描述的问题就会消失。干得好!此外,该缺陷似乎已在Excel 2016中修复。接下来,此HasFormula(和HasArray)问题似乎与2015年9月8日发布的Microsoft更新KB3085502中的一个缺陷有关。以下链接中的错误描述与OP中描述的问题类似,但由于时间差异,显然无法关联:请注意,同样使用SDI的Excel 2016不存在此问题,因此,这个错误可能还有另一个根本原因。我认为在
    Unload Me
    之后有任何代码都是非常令人困惑的代码(是否
    Me
    Unload?),而且,首先卸载表单是一种不好的做法。好奇的是,如果表单像对象一样被正确地使用,这个bug是否会露出丑陋的面孔
    Sub Macro1()
        Dim ws As Worksheet
        Dim win As Window
    
        '... bunch of code here...
    
        ws.Activate
        Set win = Application.ActiveWindow
        win.Visible = False
        win.Visible = True
    End Sub