使用';打开myFile进行追加';(VBA Excel)

使用';打开myFile进行追加';(VBA Excel),vba,excel,logging,append,Vba,Excel,Logging,Append,我需要记录在Excel中运行的VBA宏的操作(100个子项和函数,10个子项)。我已经在使用一个“工作流”表作为一个用户可读的非常轻的日志(mainsub) 但是我想通过Debug.Print将当前打印在即时窗口中的内容记录下来,因为这是一个更全面的日志,所以可以生成很多内容。因此,我考虑的是: Open "C:\Temp\Log.txt" For Append As #1 Print #1, "This need to be logged" Close #1 Public Const log

我需要记录在Excel中运行的VBA宏的操作(100个子项和函数,10个子项)。我已经在使用一个“工作流”表作为一个用户可读的非常轻的日志(mainsub)

但是我想通过Debug.Print将当前打印在即时窗口中的内容记录下来,因为这是一个更全面的日志,所以可以生成很多内容。因此,我考虑的是:

Open "C:\Temp\Log.txt" For Append As #1
Print #1, "This need to be logged"
Close #1
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
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次的性能

在主子菜单的开头打开/根据需要追加/在主子菜单的结尾关闭 比如:

Open "C:\Temp\Log.txt" For Append As #1
Print #1, "This need to be logged"
Close #1
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")
  • 在尝试登录之前,如何检查文件是否已打开?(某些sub可以通过按钮直接启动,也可以通过主sub递归启动)

  • 当文件n°1仍然打开时,我是否可以打开第二个文件(我的宏还需要将数据输出到csv文件)以进行输出

  • 保持文件打开是否会对内存产生很大影响(假设文件中有100000行)


一次打开多个文件没有问题。只要确保您的文件编号不同,不要混淆它们

第一种方法是打开文件,附加到文件,然后在每次调用log\u to\u file时关闭,这是一种非常有用的方法,尤其是当您担心程序崩溃或外部终止时会丢失日志数据时。如果您按照Tim Williams的建议缓冲输出,那么在崩溃/终止时,您将丢失缓冲区中的内容

会有一些性能成本,但多少取决于许多因素,如计算机系统的配置、日志文件所在的驱动器类型等。可能值得一试,看看您会受到什么样的性能影响。(一个测试抵得上一千个专家意见……)

另一种方法是,在开始时打开日志文件,在结束时关闭它,这也是一种很好的方法。正如Tim所建议的,只需创建一个全局布尔变量,类似于
logfileOpened
,并在log\u to\u文件子文件中添加一个检查

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作为Close_log_file子命令的一部分设置为false,您可以在运行程序的过程中多次执行此操作。但是在所有的Log\u-to\u文件调用之后,您至少需要这样做一次

最后一点注意:通过始终以追加模式打开日志文件,每次运行程序时,该文件都会增长。根据具体情况,这可能是可以接受的,或者您可能需要包含一些代码来防止日志文件变得庞大。一些可能的解决办法:

  • 根据日期为日志文件指定名称。这会产生许多较小的日志文件。您还可以删除日期太旧的日志文件,以检查总数
  • 编写代码,在文件变得太大时删除文件中最早的(最上面的)行。这是很有可能的,但不是微不足道的
  • 在程序的特定运行期间首次打开日志文件时,请先删除现有日志文件。您将得到一个日志文件,其中只包含上次程序运行的日志记录

  • 对于第一种方法-您可以在
    Log\u to\u file
    中的静态变量中缓冲行-当您累积了一定数量的行后,将其写出并清除缓冲区。对于第二种方法:使用全局布尔值指示文件是否已打开-在写入文件之前检查是否已打开,如果尚未打开,则打开文件。如果要打开一个文件进行附加,我认为它不会加载整个文件-它将查找文件的结尾并只写入新内容。如Rich所述,我正在使用日志进行调试,因此我不希望缓冲追加。我还测试了100000*打开/附加/关闭;需要18秒。这比执行100000*追加(只有1个打开和1个关闭)要糟糕得多,这需要1s。但是我要说,它的性能对我来说已经足够了,所以我不值得去管理关闭文件(如果宏失败,可能会失败);需要18秒。这比执行100000*追加(只有1个打开和1个关闭)要糟糕得多,这需要1s。但是我要说,它的性能对我来说已经足够了,所以我不需要管理关闭文件(如果宏失败,可能会失败)。关于日志文件增长的观点很好。我确实在使用日志中的日期,并在必要时删除旧日志。