【发布时间】:2017-08-31 16:40:49
【问题描述】:
我需要记录在 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 次的性能。
在 Main sub 的开头打开/根据需要附加/在 Main sub 的末尾关闭
类似:
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 仍处于打开状态吗?保持文件打开是否会对内存产生很大影响(假设文件中有 100 000 行)?
【问题讨论】:
-
对于第一种方法 - 您可以在
Log_to_file内的静态变量中缓冲行 - 当您累积了一定数量的行时,然后将它们写出并清除缓冲区。对于第二种方法:使用全局布尔值来指示文件是否打开 - 在写入文件之前检查它,如果尚未打开则打开文件。 -
如果您打开一个文件进行附加,我认为它不会加载整个文件 - 它会寻找到文件末尾并写入新内容。
-
正如 Rich 所提到的,我正在使用日志进行调试,所以我宁愿不缓冲 Append。我还用 100 000 * Open/Append/Close 进行了测试;需要 18 秒。这比执行 100 000* Append(只有 1 个打开和 1 个关闭)要糟糕得多,这需要 1 秒。但我会说它对我来说足够高效,所以我不必管理关闭文件(如果宏失败,这可能会失败)。