我需要记录在Excel中运行的VBA宏的动作(100个子功能,10个主子功能)。我已经使用“工作流”表作为用户可读的非常轻的日志(主电子邮件)。
但是我想通过Debug.Print
记录立即窗口中当前打印的内容,这可以生成很多内容,因为它更全面的日志。我正在考虑这样的事情:
Open "C:\Temp\Log.txt" For Append As #1
Print #1, "This need to be logged"
Close #1
我应该如何使用Open
和Close
命令?
类似的东西:
Public Sub Log_to_file(byval message as string)
log_file_nb = FreeFile
Open "C:\Temp\Log.txt" For Append As #log_file_nb
Print #log_file_nb, message
Close #log_file_nb
End Sub
Log_to_file ("This need to be logged")
实现起来要简单得多,但我担心打开/关闭文件1000次的性能。
类似的东西:
Public Const log_file_nb = 1
Public Sub Open_log_file(byval log_file_nb)
Open "C:\Temp\Log myMacro.txt" For Append As #log_file_nb
End Sub
Public Sub Log_to_file(byval message as string)
Print #log_file_nb, message
End Sub
Public Sub Close_log_file()
Close #log_file_nb
End Sub
Log_to_file ("This need to be logged")
在尝试登录之前,如何检查文件是否已打开? (某些子设备可以通过按钮直接启动,或者通过主要子设备递归启动)
我可以Open For Output
第二个文件(我的宏还需要将数据输出到csv文件),而文件n°1仍然打开吗?
保持文件打开会对内存产生很大影响(假设文件中有10万行)?
答案 0 :(得分:2)
一次打开多个文件没有问题。只需确保您的文件编号不同,就不要混淆它们。
您的第一个方法,打开文件,附加到它,并在每次调用log_to_file时关闭都是一种有用的方法,特别是如果您担心在程序崩溃或外部终止时丢失日志记录数据。如果你确实缓冲输出,正如蒂姆威廉姆斯建议的那样,你会在崩溃/终止时丢失缓冲区中的内容。
会有一些性能成本,但多少取决于许多因素,例如计算机系统的配置,日志文件所在的驱动器类型等等。可能值得尝试查看哪种类型性能打击你。 (一项测试值得一千个专家意见......)
另一种方法是在开始时打开日志文件并在结束时关闭它也是一种很好的方法。正如Tim建议的那样,只需创建一个全局布尔变量,类似logfileOpened
,并在log_to_file子句中添加一个检查。
Public Const log_file_nb = 1
private log_file_open as boolean
Public Sub Open_log_file(byval log_file_nb)
Open "C:\Temp\Log myMacro.txt" For Append As #log_file_nb
log_file_open = True
End Sub
Public Sub Log_to_file(byval message as string)
if not log_file_open then Open_log_file log_file_nb
Print #log_file_nb, message
End Sub
Public Sub Close_log_file()
Close #log_file_nb
log_file_open = False
End Sub
这留下的细节是需要在某个时刻关闭日志文件。通过将log_file_open设置为false作为Close_log_file子的一部分,您可以在运行程序的过程中多次执行此操作。但是,在所有Log_to_file调用之后,您需要至少执行一次。
最后一点:通过始终以追加模式打开日志文件,每次运行程序时文件都会增长。根据具体情况,这可能是可以接受的,或者您可能必须包含一些代码以防止日志文件变得庞大。一些可能的解决方案: