VBA:写入日志文件的子对象

VBA:写入日志文件的子对象,vba,excel,Vba,Excel,我在工作簿中定义了一组宏,我想向用户提供在日志文件中记录与这些宏相关的事件的选项 我通过在此工作簿中创建以下内容来启动日志: Public writeLog as Boolean Public logWrite as Object Public log as Object Private Sub Worksheet_Open() Dim prompt as Integer prompt = MsgBox("Would you like to log events for this

我在工作簿中定义了一组宏,我想向用户提供在日志文件中记录与这些宏相关的事件的选项

我通过在此工作簿中创建以下内容来启动日志:

Public writeLog as Boolean
Public logWrite as Object
Public log as Object
Private Sub Worksheet_Open()
    Dim prompt as Integer
    prompt = MsgBox("Would you like to log events for this session?", vbYesNo, "Log Events?")
    If prompt Then
        writeLog = True
        Set logWrite = CreateObject("Scripting.FileSystemObject")
        Set log = logWrite.CreateTextFile("C:/TEST.txt", False)
    Else
        writeLog = False
    End If
End Sub
Private Sub Workbook_Open()
    initLog
End Sub
然后我创建了一个过程,我可以用它来为这个对象写一个参数,我已经将它存储在它自己的模块中:

Public Sub PrintLog(obj as Object, argument as String)
    If writeLog = True Then
        obj.WriteLine argument
    End If
End Sub
不幸的是,这不起作用,我也不知道为什么:即使我没有把
obj
作为函数的参数(因为
log
logWrite
都是作为全局变量创建的),我也不能
调用WriteLog(“这里的字符串”)
调用WriteLog(log,“这里的字符串”)
而没有错误(
编译错误:参数不是可选的。


有没有可能让这样一个
Sub()
工作,这样我就可以从工作簿中的任何地方调用它(例如,在用户表单中按下按钮后)无需在每个模块中定义新的
脚本.FileSystemObject

我相信您遇到了问题,因为writeLog已经作为布尔值存在。错误应该是弹出“检测到不明确的名称”

试试下面的方法

Public bLog as Boolean
Public logWrite as Object
Public log as Object
Private Sub Worksheet_Open()
    Dim prompt as Integer
    prompt = MsgBox("Would you like to log events for this session?", vbYesNo, "Log Events?")
    If prompt Then
        bLog = True
        Set logWrite = CreateObject("Scripting.FileSystemObject")
        Set log = logWrite.CreateTextFile("C:/TEST.txt", False)
    Else
        bLog = False
    End If
End Sub

Public Sub WriteLog(Optional obj as Object, Optional argument as String)
    If bLog = True Then
        obj.WriteLine argument
    End If
End Sub

编辑:在WriteLog(或PrintLog)中将参数设置为可选,以便进一步测试

我认为您可以通过对代码进行一些小的更改来解决问题。我尝试了以下设置:

记录器模块:

Option Explicit

Private log As Object

Public Sub initLog()

    Dim prompt As VbMsgBoxResult
    Dim fso As Object

    prompt = MsgBox("Would you like to log events for this session?", vbYesNo, "Log Events?")

    If prompt = vbYes Then
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set log = fso.CreateTextFile("C:/TEST.txt", False)
    End If

End Sub

Public Sub PrintLog(argument As String)
    If Not log Is Nothing Then
        log.WriteLine argument
    End If
End Sub

Public Sub yadda()
    'test
    PrintLog "yadda"
End Sub 
此工作簿:

Public writeLog as Boolean
Public logWrite as Object
Public log as Object
Private Sub Worksheet_Open()
    Dim prompt as Integer
    prompt = MsgBox("Would you like to log events for this session?", vbYesNo, "Log Events?")
    If prompt Then
        writeLog = True
        Set logWrite = CreateObject("Scripting.FileSystemObject")
        Set log = logWrite.CreateTextFile("C:/TEST.txt", False)
    Else
        writeLog = False
    End If
End Sub
Private Sub Workbook_Open()
    initLog
End Sub

您可以在与
WriteLog
子模块相同的模块中编写例程来启动日志。然后在
工作表中调用它_Open
事件我是否应该启动连接(
设置日志写入
设置日志
)在每次的过程中,如果是这样的话?我很抱歉:这是我在编写代码时的疏忽。布尔值和函数在我的代码中的命名与在你的代码中的命名不同。奇怪的是,调用PrintLog(log,“String here.”)那么应该可以了。我将编辑并使参数成为可选的,因为可能在调用代码的某个地方,它可能不包括对象?