【问题标题】:Is it good practice to leave "Debug.Print" instructions in code that goes in "production"?在“生产”中的代码中留下“Debug.Print”指令是一种好习惯吗?
【发布时间】:2012-01-14 19:01:08
【问题描述】:

在 Excel VBA 中,将 Debug.Print 指令留在“生产”中的代码中是一种好习惯吗?当出现问题时,这对于在用户机器上实时调试工作表非常有用。关闭 Visual Studio 会影响性能吗?如果没有,你有什么建议?

【问题讨论】:

  • 您说的是“Visual Studio”,但您说的是 VBA,对吗?你是说 VBE 吗?
  • 啊,是的,我想我现在才理解人们所说的 VBE... 是的,我想是的 :) [ALT + F11]
  • 1) 如果在出现问题时捕获用户在做什么很重要,那么事务日志将是一个更好的选择。每次运行或每天启动一个新文件;删除任何超过 48 小时的内容。是的,有性能成本,但你将如何衡量它。 2) Visual Studio 是微软专业语言的开发环境。 VB 2010 比 VBA/VBE 快数百倍,并且拥有数千个很酷的工具。如果您想使用工作表,可以从中访问 Excel。
  • 根据 msdn.microsoft.com/en-us/library/aa716276(v=vs.60).aspx ,编译 Visual Basic 时删除了 debug.print 语句......但与 VB 不同的是,VBA 被解释......(或者它是在运行时编译的?) ,所以我不确定那个。我想说解释,因为我可以在断点处编写 VBA:P

标签: excel vba


【解决方案1】:

Debug.Print 指令的性能开销很小。所以我会在执行无数次的循环中避免它们。除了那些情况,我认为保留它们是可以的。
您还可以将条件编译指令 (#if) 与编译器常量 (#const) 结合使用,在不影响性能的情况下全局启用/禁用它们。

#CONST developMode = True

sub Xyz
  #If developMode Then
    Debug.Print "something"
  #End If
End Sub

【讨论】:

  • @iDevelop +1 每天学习新东西 - 没有意识到 Excel 支持条件编译!谢谢。
  • 足够清晰,值得+1 :)。顺便说一句,在这个有趣的线程中讨论了条件编译(和一些有用的其他东西):stackoverflow.com/questions/1070863/hidden-features-of-vba
  • 你有这个来源吗?
  • 我就是这样做的,全局变量为DebugMode。我对ThisWorkbook.Save 进行了小检查,以标记DebugMode 是否为真,这有助于阻止它潜入生产环境。
  • @Lunatik:这也很好,但在性能影响方面,全局(以及任何“正常”)变量会对性能产生影响,而编译器常量则不会(当设置为生产模式时) )。
【解决方案2】:

我通常有两个版本; prod 不带调试,prod 带调试。这与包罗万象的错误处理程序日志记录相结合,意味着如果用户遇到问题,我可以将调试版本部署给他们,他们可以运行。

我有一个宏,我运行该宏来排除 debug.print 语句,因此它不是真正的维护开销。

一直运行调试版本的问题(而且,对于 Excel VBA,它通常不是性能问题)是您的应用程序不断发出它不需要的信息。例如,在电子表格受控的环境中,这可能被视为一件坏事。

就全局错误处理而言,您仍然需要对每个要处理错误的函数使用 On Error GoTo 语句。但是,您可以将这些通过管道传递给一个通用函数:

Public Function HandleTheNastyErrors(E As ErrObject, ByVal writeLog As Boolean = True) 

    Select Case E.Number 

    Case xxx 

        ...specific error handling... 

    Case Else 
        ... Display a message to the user about how you dont know what happened....             
    End Select 

    If writeLog Then

       ...Log Writing Code...

    End If

End Function 

然后,OnError:

ErrorHandler:
 Call HandleTheNastyErrors(Err, True)

展示做的伎俩

【讨论】:

  • 您能评论一下您的“全能”吗?到目前为止,我真的不知道如何巧妙地处理错误并以某种方式通用。谢谢!
  • @jeromeG 你去。希望对您有所帮助。
  • 将错误对象本身传递给函数...这是一个有趣的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2019-05-04
  • 2012-04-12
相关资源
最近更新 更多