2

我的问题是当我在工作簿中选择多个工作表时命令按钮无法响应。我在这里测试的工作簿只是为了研究和解决这个问题,我最初是在一个更复杂的工作簿中找到的。

我的工作簿共有 5 个工作表。sheet1 上有四个 ActiveX 命令按钮。这四个按钮启动代码以同时选择多个工作表或仅选择 sheet1。

一起选择多个工作表后,只能再次单击实际单击的最后一个按钮,工作表 1 上的其余按钮不再响应,例如它们被禁用或其他什么。一旦我手动取消选择工作表以便只选择 sheet1,控件就会开始正常工作。

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

到目前为止,我的一些发现...

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

4 个命令按钮执行如下所示的功能。如果代码运行,每个按钮都会标记相邻的单元格。我延迟了 1 秒,以验证连续两次单击按钮是否有效。

  • CMD 1:仅选择 sheet1
  • CMD 2:仅选择 sheet1
  • CMD 3:选择 sheet1 和 sheet2
  • CMD 4:通过模块1中的子例程选择sheet1到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

在模块 1 中,我有...

Option Explicit

Sub SelectSomeSheets()
    Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")).Select
End Sub

2012-10-09 更新

这是在 Excel 2010 中复制此错误的简单方法...

  1. 在 sheet1 上放置 4 个命令按钮。
  2. 将下面的代码复制到 sheet1。
  3. 在每个“End Sub”语句上放置断点。
  4. 尝试单击仅选中 sheet1 的按钮。所有按钮启动例程。
  5. SHIFT-CLICK 选择一组工作表。
  6. 在选中工作表组的情况下再次尝试按钮。只有最后使用的按钮有效。

    Private Sub CommandButton1_Click() End Sub

    私有子 CommandButton2_Click() 结束子

    私有子 CommandButton3_Click() 结束子

    Private Sub CommandButton4_Click() End Sub

4

1 回答 1

1

我想这与 ActiveX 按钮的“范围”有关(即范围是 sheet1 而不是 sheet1+sheet2+...)。似乎选择多个工作表会停用工作表 1 中的命令按钮,即使工作表 1 仍然是“活动”工作表。因为 ActiveX 组件是 sheet1 专用的。

作为一种解决方法,我将您Sub CommandButtonX_Click移至模块 1,删除了Private关键字,创建了一个自定义功能区 MyTools,其中 4 个 Sub 作为可选元素。通过这种方式,我将子组件的可见性从工作表级别移动到应用程序级别和所有工作。

当然,我也必须Me.Select改成Sheets("Sheet1").Select(尽管我讨厌这样的硬编码......)

希望有帮助...

于 2012-10-08T11:03:59.410 回答