Excel VBA 2010 – 命令button停止使用多个选定的工作表

我的问题是命令button,当我在工作簿中select多个工作表时,无法响应。 我在这里testing的工作簿只是为了研究和解决这个问题,我最初发现在一个更复杂的工作簿。

我的工作簿总共有5个工作表。 Sheet1上有四个ActiveX命令button。 这四个button启动代码来一起select几个工作表或者只是selectsheet1。

同时select多个工作表后,只有最后一个button实际上可以再次点击,工作表1上的其他button不再响应,就像他们被禁用或什么的。 一旦我手动取消select工作表,以便只selectsheet1,控件开始正常工作。

奇怪..我认为这一定是Excel中的某种错误。 我也可以复制这个问题,如果我手动select多个工作表,而不是让代码这样做。

我目前的一些发现…

  1. 只要有两张或更多的纸张,我觉得似乎并不重要。
  2. VBA代码select或手动SHIFT-CLICK无关紧要。
  3. 一旦其他button被locking,最后一个button激活仍然运行。
  4. 我只用Excel 2010得到这个,Excel 2007没有这个问题。
  5. 我已经在一个孤立的工作簿中复制了这个问题,所以我不认为这是腐败问题。

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中的这个错误…

  1. 在sheet1上放置4个命令button。
  2. 将下面的代码复制到sheet1。
  3. 在每个“End Sub”语句中join断点。
  4. 尝试单击与选定sheet1button。 所有button启动例程。
  5. 按住SHIFT-CLICK键select一组表。
  6. 再次尝试使用所选表单组的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").SelectSheets("Sheet1").Select (虽然我讨厌像这样的硬编码….)

希望有帮助…