【问题标题】:Separate subroutine for application methods?应用方法的单独子程序?
【发布时间】:2014-01-09 18:51:59
【问题描述】:

现在我正在编写一个稍微复杂的 Excel 工作簿网络,该网络几乎完全由 VBA 自动化驱动,因此编写了很多宏。

我会尽可能禁用屏幕更新、警报和事件。为了节省一些时间和头疼的追踪我可能启用/禁用这些的位置,我编写了一个子例程,其中每个所需的设置作为参数传入,因此您可以在一行中设置您想要启用/禁用的内容代码(或者至少是这样的想法)。

这是子程序的样子:

Sub AppToggles(Optional ScrUpdating As Boolean = False, _
               Optional DispAlerts As Boolean = True, _
               Optional Events As Boolean = False)

With Application    
   .ScreenUpdating = ScrUpdating
   .DisplayAlerts = DispAlerts
   .EnableEvents = Events
End With    

End Sub

我使用Call AppToggles(True, True, True)(或所需的任何组合)从同一模块中的各种其他子例程中调用它。

问题是,子程序似乎没有做任何事情。这是一个如此简单的例程,单步执行它并没有告诉我什么。将鼠标悬停在关键字上显示我没有将每个开关设置为传递的参数。

我可以为我想的每个设置一个 If 语句,但我很好奇我在哪里掉线了:P

【问题讨论】:

  • 好问题。我可以复制这种行为。我尝试了一些东西,但只要我使用变量它就不起作用。

标签: vba excel


【解决方案1】:

不要单步执行代码...正常运行或按 F5 运行

你的日常工作对我来说很好。

Sub TestMe()
Call AppToggles(False, False, False)
MsgBox "ScreenUpdating: " & Application.ScreenUpdating & vbCrLf & _
"DisplayAlerts: " & Application.DisplayAlerts & vbCrLf & _
"EnableEvents: " & Application.EnableEvents
Call AppToggles(True, True, True)
MsgBox "ScreenUpdating: " & Application.ScreenUpdating & vbCrLf & _
"DisplayAlerts: " & Application.DisplayAlerts & vbCrLf & _
"EnableEvents: " & Application.EnableEvents
Call AppToggles(True, True, True)
End Sub

【讨论】:

  • 你太棒了,非常感谢。这么简单的检查,我根本没想到!
  • 没问题。好习惯!
【解决方案2】:

既然你说一切都是自动化的,那么你有没有禁用Application.EnableEvents?我知道它有时设置为False 以防止BeforeSave 在保存工作簿时启动。

如果是这种情况,在操作 ScreenUpdatingDisplayAlerts 之前将其设置为 True 应该可以解决问题。如果需要,您可以在设置完所有内容后恢复为False(或Events 参数提供的值)。

【讨论】:

  • 我正在尝试这个,我更加困惑。当我单步执行代码时,工具提示中的值似乎与我设置的手表不匹配。
猜你喜欢
  • 2014-08-29
  • 2014-07-18
  • 2010-11-19
  • 2012-08-24
  • 2016-01-27
  • 2023-03-15
  • 2015-01-21
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多