我在从用户表单激活工作表时遇到问题,相同的代码在Excel 2003到Excel 2010中工作正常,不适用于Excel 2013.
这是如何简单地重现问题:
有一个包含2个工作表的工作簿,名为Sheet1
和Sheet2
,并且在Sheet1
2个按钮上:
点击Button1
时会使用Sheet2
激活Macro1
工作表,其中包含1行:
ThisWorkbook.Sheets("Sheet2").Select
我可以很好地编辑数据。
点击Button2
弹出UserForm1
,然后点击CommandButton1
调用相同的Macro1,如下所示:
Unload Me
Macro1
Sheet2
工作表已激活,但是如果我在其中编辑数据,它实际上会更新Sheet1中的相应单元格,如果我点击Sheet1
我可以看到在那里输入的数据!< / p>
点击返回Sheet2
工作表可以正确激活Sheet2
表。
有没有人见过这样的行为?如果是,是否有任何编码解决方法可以正确激活Sheet2
?
答案 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