5

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

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

有一个工作簿,里面有 2 个工作表,Sheet1比如说Sheet2,在Sheet12 个按钮上:

  1. 单击使用其中包含 1 行的Button1激活工作表:Sheet2Macro1

    ThisWorkbook.Sheets("Sheet2").Select
    

    我可以很好地编辑数据。

  2. 单击Button2弹出UserForm1窗口并单击CommandButton1调用相同的 Macro1,如下所示:

    Unload Me
    Macro1
    

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

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

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

4

9 回答 9

3

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

  • 选择单元A1Sheet1
  • 选择单元B2Sheet2
  • 点击Button2打开表格
  • 单击CommandButton1表单上的 (隐藏表单并激活Sheet2

看起来像选择了单元格B2Sheet2但是当您开始输入时,文本将进入单元格A1;一旦你点击输入,文本就会消失在单元格B2Sheet1

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

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

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

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

于 2014-05-30T05:40:49.880 回答
2

根据 Profex 的回答,我能够在 Excel 2013 中重现该错误。为我解决问题的一种解决方法是使我的用户窗体无模式。

userform1.show vbModeless

我知道如果您需要模态表单,此解决方法将无济于事,但希望它可以为下一个人节省一些时间。

于 2015-03-04T19:54:09.447 回答
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()。别客气:-)

于 2015-10-05T19:43:59.877 回答
1

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

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

于 2015-09-21T23:32:29.443 回答
0
Sub Macro1()
Sheets("Sheet2").Select
End Sub

Sub Macro2()
Unload Me
Call Macro1
End Sub

这行得通。我可以在一定程度上重现您的错误,但它可能是您的宏的位置?(模块与工作表)。

编辑:起初我没有看到您的评论,我有 Excel2010(这就是我无法真正复制它的原因)。-对不起

于 2013-09-10T18:46:20.973 回答
0

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

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

例如

Sheets("Sheet2").Activate

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

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

Sub Macro2()
    Macro1
    Unload Me
End Sub
于 2013-09-10T18:55:27.870 回答
0

我认为 Dima Reznikov 有正确的答案。我使用了他的 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# 代码感到困惑的其他人有所帮助。

于 2018-02-05T23:41:11.667 回答
-1

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Me.Select
End Sub
于 2015-11-29T14:43:49.793 回答
-1

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

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

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

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

于 2015-09-16T17:23:54.507 回答