Excel 2013工作表激活

时间:2013-09-10 18:16:12

标签: excel excel-vba excel-2013 vba

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

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

有一个包含2个工作表的工作簿,名为Sheet1Sheet2,并且在Sheet1 2个按钮上:

  1. 点击Button1时会使用Sheet2激活Macro1工作表,其中包含1行:

    ThisWorkbook.Sheets("Sheet2").Select
    

    我可以很好地编辑数据。

  2. 点击Button2弹出UserForm1,然后点击CommandButton1调用相同的Macro1,如下所示:

    Unload Me
    Macro1
    

    Sheet2工作表已激活,但是如果我在其中编辑数据,它实际上会更新Sheet1中的相应单元格,如果我点击Sheet1我可以看到在那里输入的数据!< / p>

  3. 点击返回Sheet2工作表可以正确激活Sheet2表。

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

9 个答案:

答案 0 :(得分:3)

哇,我能够使用2013重现此错误。这是Excel的新SDI接口的奇妙失败。有趣的是奇怪的是,当你按照以下步骤时

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

看起来B2上的单元格Sheet2已被选中,但是当您开始输入时,文本将进入单元格A1;点击Enter后,文字将消失到B2

上的单元格Sheet1

你几乎要看到它相信它。

我发现唯一有效的方法是使用Ontime功能。

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

...但我觉得这并不能帮助每个人

答案 1 :(得分:2)

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

userform1.show vbModeless

据我所知,如果你需要一个模态表单,这个解决方法会有所帮助,但希望它能在一段时间内保存下一个人。

答案 2 :(得分:2)

通过自动化错误激活上述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()。欢迎您: - )

答案 3 :(得分:1)

我找到了类似情况的可能解决方法。我们有一个复杂的Excel插件,它使用COM和XLL代码。 (没有VBA)我们遇到了类似的问题。 (从模态对话框激活工作表时,新单元格数据显示在上一页上)。

在我们的案例中,我们发现只有在我们的代码评估了一个单元格范围&#34; .HasFormula&#34;属性。没有合理的解释。如果我们编译的.Net代码评估了该属性,我们会观察到该错误。如果代码忽略了该属性,我们没有观察到该错误。我们还发现,如果我们在工作表(标签)之间来回手动点击,那么这个bug就会消失。

答案 4 :(得分:0)

Sub Macro1()
Sheets("Sheet2").Select
End Sub

Sub Macro2()
Unload Me
Call Macro1
End Sub

这很有效。我可以在一定程度上重现您的错误,但它可能是您的宏的位置? (模块与表格)。

编辑:我最初没有看到你的评论,我有Excel2010(这就是为什么我无法真正重现它)。 - 抱歉

答案 5 :(得分:0)

请避免使用.SELECT。您可能希望看到THIS

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

例如

Sheets("Sheet2").Activate

因此,在代码中使用它,它将如下所示。

Sub Macro1()
    Sheets("Sheet2").Activate
End Sub

Sub Macro2()
    Macro1
    Unload Me
End Sub

答案 6 :(得分:0)

我认为Dima Reznikov有正确的答案。我使用他的C#代码并在VBA中完成它似乎解决了这个问题。我的个人代码还包括使用Modal UserForm。

示例:

array([[[ 0.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  0.,  2.]],

       [[ 0.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  0.,  2.]],

       [[ 0.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  0.,  2.]]])

希望这可以帮助那些也被C#代码混淆的人。

答案 7 :(得分:-1)

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

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

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

然后此修剪器打开文件并使用Sheets("Sheet2").Activate。然后选择它,就像以前在旧版本中一样。

答案 8 :(得分:-1)

worksheet_selectionchange事件的工作表代码中,只需输入me.activate

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