【问题标题】:VBA excel not run unless i click play button除非我单击播放按钮,否则 VBA excel 不会运行
【发布时间】:2016-10-15 12:06:44
【问题描述】:

我不知道我哪里出错了。该脚本有效,但它不会自动运行,除非我进入 VBA 应用程序并单击脚本运行的播放按钮。有人可以帮忙吗?

Private Sub HideChart1()

    If ActiveWorkbook.Sheets("User Interface").Range("F8") = "Yes" Then

        ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True

    Else

        ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False

    End If

End Sub

【问题讨论】:

  • 你为什么希望它自动运行?
  • 我只能假设您正在尝试创建由 F8 触发的 Worksheet_Change 事件

标签: excel vba


【解决方案1】:

处理SheetChange,并在那里调用您的过程。

Private Sub Worksheet_Change(ByVal Target As Range)
    HideChart1
End Sub

完成。不要在事件处理程序中实现逻辑,这是第一个地狱之门和意大利面条。有一个单独的专用程序是完美的 - 你所需要的只是自动调用它的东西。

如果HideChart1 在其自己的标准模块中实现,则需要将其设为Public 才能从工作表的代码隐藏中调用它;在该模块的顶部添加 Option Private Module 以避免将成员暴露为宏和/或工作表函数。

【讨论】:

  • 您能否扩展一点,或者直接指向一些资源,详细说明为什么要避免在事件处理程序中使用逻辑?这是我第一次看到提到这个,我想知道更多:D
  • @BruceWayne 仅仅是因为最佳实践是在自己的函数中实现事物。哪些代码更容易编写自动化单元测试?在专用类模块中实现的专用方法,或者是私有的并通过修改特定工作表单元格触发的全能事件处理程序?即使您永远不会在 VBA 中编写单元测试(尽管 you could),如果代码不分散在处理程序中,则更易于维护。
  • 啊,好点。它实际上提醒我,我的一本工作簿有一个相当复杂的 Worksheet_Change 事件,这将受益于突破到他们自己的潜艇。谢谢你们的cmets,帮了我!
【解决方案2】:

您想使用Worksheet Change 事件。

未经测试,但应该可以工作。把它放在你的“用户界面”工作表模块中。:

Private Sub Worksheet_Change(ByVal target As Range)
If target = Range("F8") And target.Value = "Yes" Then
    ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True
Else
    ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False
End If
End Sub

对于Worksheet Change,我不认为(关键字“think”)您需要指定Range("F8") 应该在的工作表,因为根据定义,它是活动表。但是,如果您愿意,请在此之前添加工作表名称。

【讨论】:

  • 应该将ActiveWorkbook 更改为ThisWorkbook 以增加稳健性(假设图表与代码在同一个工作簿中)事件处理程序可以在工作簿不一定处于活动状态的情况下运行。
【解决方案3】:

如果我的评论是正确的,那么你需要这样的东西:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("F8")) Is Nothing Then
        If Target.Worksheet.Range("F8").Value = "Yes" Then
            ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = True
        Else
            ActiveWorkbook.Sheets("Sheet1").ChartObjects("Chart 6").Visible = False
        End If
    End If
End Sub

您可以在此处找到有关工作表更改事件的更多信息 automatically execute an Excel macro on a cell change

该问题的关键是将代码放在工作表模块中,而不是常规模块或工作簿模块中。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多