Excel VBA 2010 - 命令按钮停止使用选定的多个工作表

标签 excel excel-2010 vba

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

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

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

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

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

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

  • 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 中复制此错误的简单方法...
  • 在 sheet1 上放置 4 个命令按钮。
  • 将下面的代码复制到 sheet1。
  • 在每个“End Sub”语句上放置断点。
  • 尝试单击仅选中 sheet1 的按钮。所有按钮启动例程。
  • SHIFT-CLICK 选择一组工作表。
  • 在选中工作表组的情况下再次尝试按钮。只有最后使用的按钮有效。

    私有(private)子 CommandButton1_Click()
    结束子

    私有(private)子 CommandButton2_Click()
    结束子

    私有(private)子 CommandButton3_Click()
    结束子

    私有(private)子 CommandButton4_Click()
    结束子
  • 最佳答案

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

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

    当然我也不得不改变Me.Select进入 Sheets("Sheet1").Select (尽管我讨厌这样的硬编码......)

    希望有帮助...

    关于Excel VBA 2010 - 命令按钮停止使用选定的多个工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12775558/

    相关文章:

    vba - 选择多个同名对象

    excel - 计算某个日期出现的次数并绘制图表

    Excel 宏每 n 行创建一个新工作表

    VBA 对象破坏 - 内存错误

    python - 使用 python 在 Excel 中移动单元格

    vba - Excel 中的空白单元格

    excel - VBA Office 2007 创建 2003 Excel 工作表

    通过 Outlook 任务进行的 vba 宏迭代在新对象库中不起作用(12 与 15)

    Excel公式在列中查找相似值并根据输出返回值

    excel - 定义范围并清除其内容