Excel VBA 2010 – 命令button停止使用多个选定的工作表
我的问题是命令button,当我在工作簿中select多个工作表时,无法响应。 我在这里testing的工作簿只是为了研究和解决这个问题,我最初发现在一个更复杂的工作簿。
我的工作簿总共有5个工作表。 Sheet1上有四个ActiveX命令button。 这四个button启动代码来一起select几个工作表或者只是selectsheet1。
同时select多个工作表后,只有最后一个button实际上可以再次点击,工作表1上的其他button不再响应,就像他们被禁用或什么的。 一旦我手动取消select工作表,以便只selectsheet1,控件开始正常工作。
奇怪..我认为这一定是Excel中的某种错误。 我也可以复制这个问题,如果我手动select多个工作表,而不是让代码这样做。
我目前的一些发现…
- 只要有两张或更多的纸张,我觉得似乎并不重要。
- VBA代码select或手动SHIFT-CLICK无关紧要。
- 一旦其他button被locking,最后一个button激活仍然运行。
- 我只用Excel 2010得到这个,Excel 2007没有这个问题。
- 我已经在一个孤立的工作簿中复制了这个问题,所以我不认为这是腐败问题。
4个命令button执行如下所示的function。 如果代码运行,每个button都会标记相邻的单元 我放了一个1秒的延迟,以validation连续两次点击button正在工作。
- CMD 1:仅select工作表1
- CMD 2:仅select工作表1
- CMD 3:select工作表1和工作表2
- CMD 4:通过module1中的子例程selectsheet1到sheet4
这是我的代码附加到sheet1 ….
Option Explicit Private Sub CommandButton1_Click() Call MarkCmdsAsInactive Me.Select Call WaitSeconds(1) Range("E6").Value = "CMD 1 Works" End Sub Private Sub CommandButton2_Click() Call MarkCmdsAsInactive Me.Select Call WaitSeconds(1) Range("E10").Value = "CMD 2 Works" End Sub Private Sub CommandButton3_Click() Call MarkCmdsAsInactive Sheets(Array("Sheet1", "Sheet2")).Select Call WaitSeconds(1) Range("E14").Value = "CMD 3 Works" End Sub Private Sub CommandButton4_Click() Call MarkCmdsAsInactive Call SelectSomeSheets Call WaitSeconds(1) Range("E18").Value = "CMD 4 Works" End Sub Private Sub MarkCmdsAsInactive() Range("E6").Value = "Inactive" Range("E10").Value = "Inactive" Range("E14").Value = "Inactive" Range("E18").Value = "Inactive" End Sub Private Sub WaitSeconds(waitInSeconds As Variant) Dim newHour As Variant Dim newMinute As Variant Dim newSecond As Variant Dim waitTime As Variant newHour = Hour(Now()) newMinute = Minute(Now()) newSecond = Second(Now()) + waitInSeconds waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime End Sub
在module1中,我有…
Option Explicit Sub SelectSomeSheets() Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")).Select End Sub
更新2012-10-09
这是一个简单的方法来复制Excel 2010中的这个错误…
- 在sheet1上放置4个命令button。
- 将下面的代码复制到sheet1。
- 在每个“End Sub”语句中join断点。
- 尝试单击与选定sheet1button。 所有button启动例程。
- 按住SHIFT-CLICK键select一组表。
-
再次尝试使用所选表单组的button。 只有最后使用的button的作品。
Private Sub CommandButton1_Click()End Sub
Private Sub CommandButton2_Click()End Sub
Private Sub CommandButton3_Click()End Sub
Private Sub CommandButton4_Click()End Sub
我想这与ActiveXbutton的“范围”有关(即范围是sheet1而不是sheet1 + sheet2 + …)。 看起来,即使页面1仍然是“活动”页面,多张页面的select也会停用页面1中的命令button。 因为ActiveX组件对sheet1是私有的。
作为一种解决方法,我将Sub CommandButtonX_Click
移动到Module 1,删除了Private
关键字,创build了一个带有4个Sub的自定义function区MyTools作为可选元素。 通过这种方式,我将子级的可见性从表级转移到应用级别和所有工作。
当然,我也要改变我Sheets("Sheet1").Select
成Sheets("Sheet1").Select
(虽然我讨厌像这样的硬编码….)
希望有帮助…