Excel 2013工作表激活

我遇到了激活用户表单中的表单的问题,Excel 2003中的相同代码在Excel 2010中正常工作,但不适用于Excel 2013。

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

有一个工作簿,其中有2个工作表,称为Sheet1Sheet2让我们说,并在Sheet1 2button:

  1. 点击Button1激活Sheet2工作表使用Macro1与1行:

     ThisWorkbook.Sheets("Sheet2").Select 

    我可以从它编辑数据罚款。

  2. 点击Button2popup一个UserForm1 ,点击CommandButton1调用相同的Macro1,如下所示:

     Unload Me Macro1 

    Sheet2工作表被激活,但如果我编辑它的数据,它实际上更新Sheet1中的相应的单元格,如果我点击Sheet1我可以看到在那里input的数据!

单击回到Sheet2工作表可以正确激活Sheet2表。

有没有人看过这样的行为? 如果是,是否有任何编码解决方法来正确激活Sheet2

按照Profex的回答,我能够在Excel 2013中重现错误。 解决这个问题的解决方法是使我的用户表单无模式。

 userform1.show vbModeless 

我明白,如果你需要一个模式的forms,这个解决方法将是没有帮助的,但希望它会保存下一个人一些时间。

我发现了一个类似的情况可能的解决方法。 我们有一个复杂的Excel插件,它使用COM和XLL代码。 (无VBA)我们遇到类似的问题,如上所述。 (当从modal dialog中激活一张纸时,新的单元格数据出现在前一张纸上)。

在我们的例子中,我们发现只有当我们的代码评估一个单元格Range的“.HasFormula”属性时才会出现这个问题。 没有合乎逻辑的解释。 如果我们编译的.Net代码评估了这个属性,我们会观察这个bug。 如果代码忽略了这个属性,我们没有观察到这个bug。 我们还发现,如果我们在工作表(标签)之间手动点击,错误消失了。

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

 public static void ActivateSheetAndWorkaroundExcel2013VBASheetActivationBug( Worksheet oSheet2Activate ) { if( oSheet2Activate.IsNull() ) return; oSheet2Activate.Activate(); // Excel 2013 has problems activating worksheet through automation // https://www.google.com/webhp?ie=utf-8&oe=utf-8#q=excel+2013+worksheet+activate+problem+ // http://stackoverflow.com/questions/18726141/excel-2013-worksheet-activate // // The only way to reset the Excel 2013 state is to hide/show the active window if( Application.Version == "15.0" ) { Window oActiveWnd = Application.ActiveWindow; oActiveWnd.Visible = false; oActiveWnd.Visible = true; oActiveWnd.Activate(); } } 

调用该辅助方法而不是直接调用oSheet.Activate()。 别客气:-)

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

这工作。 我可以在一定程度上重现你的错误,但它可能是你的macros的位置? (模块vs工作表)。

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

请避免使用.SELECT。 你可能想看到这个 ?

话虽如此,如果你真的想激活工作表,然后使用.ACTIVATE

例如

 Sheets("Sheet2").Activate 

所以在你的代码中使用它,看起来像这样。

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

哇,我能够使用2013重现这个错误。这是Excel的新的SDI接口的一个奇妙的失败 。 另外有趣的是,当你按照下面的步骤

  • Sheet1上select单元格A1
  • Sheet2上select单元格B2
  • 点击Button2 ,打开表单
  • 单击窗体上的CommandButton1 (隐藏窗体并激活Sheet2

它看起来像Sheet2上的单元格B2被选中,但是当你开始input时,文本将进入单元格A1 ; 一旦你按下Enter键,文本消失到Sheet1上的Sheet1B2

你几乎必须看到它相信它。

我发现的唯一的作品是使用Ontime函数。

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

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

我有同样的问题,但我的代码实际上运行在Excel COM插件,这是从VBA略有不同。

我的代码工作在2003,2010 …使用Sheets("Sheet2").Activate ,但不是2013年

但我通过启动一个计时器来解决这个问题,在我的事件代码( Button事件)后的100毫秒。

然后这个修剪器打开文件并使用Sheets("Sheet2").Activate 。 然后select,就像以前的版本一样。

worksheet_selectionchange事件的工作表代码刚刚放在me.activate

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