2014-03-25 36 views
1

我有一組在我的工作簿中定義的宏,我想提供用戶登錄日誌文件中有關這些宏事件的選項。VBA:子寫入日誌文件

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 

然後我創建了一個程序,我可以使用到的參數寫入此對象,我已經存儲在其自己的模塊中:

我通過創建的ThisWorkbook以下啓動日誌

Public Sub PrintLog(obj as Object, argument as String) 
    If writeLog = True Then 
     obj.WriteLine argument 
    End If 
End Sub 

不幸的是,這是行不通的,我不知道爲什麼:即使我不包括obj作爲參數傳遞給函數(因爲loglogWrite爲全局變量創建),我米不能Call WriteLog("String here.")Call WriteLog(log, "String here.")沒有錯誤(Compile Error: Argument Not Optional.

是否有可能得到這樣一個Sub()工作,這樣我可以在工作簿中的任意位置調用它(一個按鈕,在用戶窗體壓制後,例如),而無需在每個模塊中定義新的Scripting.FileSystemObject

+0

你可以寫程序來啓動日誌相同的模塊作爲'WriteLog'子英寸然後在'Worksheet_Open'事件中調用它 –

+0

我應該每次在程序中啓動連接('Set logWrite','Set log'),在那種情況下? – Corcovado

回答

3

我認爲你可以解決你的通過對您的代碼進行一些小修改來解決問題。我嘗試了以下設置:

記錄器模塊:

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 

的ThisWorkbook:

Private Sub Workbook_Open() 
    initLog 
End Sub 
0

我相信你有問題,因爲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(或打印日誌)進行進一步的測試

+0

我很抱歉:在SO編寫代碼時,這是我的疏忽。我的代碼中布爾和函數的命名方式不同,就像你的代碼一樣。 – Corcovado

+0

奇怪的是,調用PrintLog(日誌,「String here。」)應該可以工作。我要編輯並使參數可選,可能在調用代碼的某處,它可能不包括該對象? –