2014-05-06 75 views
-2

我想實現記錄器的Excel,WONT登錄用戶更改爲單元格值(誰在乎...)。如何在Excel中實現記錄器?

但我的應用程序的內部動態。

所以:

  1. 它必須是基於紙張。 (原因用戶無法記住 附加奇怪的位置的一些奇怪的文件...)
  2. 它必須很容易出類拔萃。 (Excel是在簡單的分析相當不錯,對吧? 我不想寫任何解析器日誌。只需使用內置的Excel 功能)
  3. 它必須是彈性的,當我有時會 日誌產生額外的信息,有時候這些會變,有時候 陣列,物體等

問:如何處理3)? ParamArray將輸入數組視爲單個元素。在使用數組/集合時,需要在登錄時將標量值預處理爲一個項目數組/集合。

這是到目前爲止我的代碼:

Public Sub Log(level As LoggerSeverityLevel, functionName As String, message As String, Optional Arguments As Variant) 
Dim sh As Object 
Set sh = ActiveSheet 

LoggerDB.Activate 
''' Find blank row for next entry 
Dim firstEmptyRow As LongLong 
firstEmptyRow = Range("A" & rows.count).End(xlUp).row + 1 

''' Parse level into human redable format 
Dim lvlMessage As String 
lvlMessage = "Unknown" 
If level = lslInfo Then lvlMessage = "Info" 
If level = lslWarning Then lvlMessage = "Warning" 
If level = lslDebug Then lvlMessage = "Debug" 
If level = lslCritical Then lvlMessage = "Critical" 

''' Insert data 
LoggerDB.Cells(firstEmptyRow, 1) = Now() 
LoggerDB.Cells(firstEmptyRow, 2) = lvlMessage 
LoggerDB.Cells(firstEmptyRow, 3) = functionName 
LoggerDB.Cells(firstEmptyRow, 4) = message 

''' And optional arguments, one cell per argument 
Dim i As Long 
Dim arg As Variant 
i = 4 
For Each arg In Arguments 
    LoggerDB.Cells(firstEmptyRow, i) = CStr(arg) 
    i = i + 1 
Next arg 

sh.Activate 
End Sub 
+2

嗯什麼? ;)想快速閱讀[** Optional Parameters and ParamArrays **](http://vba4all.wordpress.com/2014/04/25/optional-parameters-and-paramarray-in-vba/)? –

+0

不錯。但這並不能解釋我的一個重要用例。我有時會得到數組,並且需要將它傳遞給日誌函數。那麼如何處理呢? AFAIK它被存爲ParamArrays(0)元素。但如何處理?我錯過了可以接受的機制,沒有任何東西,價值,價值觀,價值觀數組(或者更確切地說,每一個都可以迭代...)。 –

+1

你會迭代ParamArray中的每個元素,並可能在'Select Case'語句中使用'TypeName(* paramter *)'來計算出你正在處理的數據類型。 –

回答

0
Public Sub Log(level As LoggerSeverityLevel, functionName As String, message As String, Optional Arguments As Variant) 
Dim sh As Object 
Set sh = ActiveSheet 

LoggerDB.Activate 
''' Find blank row for next entry 
Dim firstEmptyRow As LongLong 
firstEmptyRow = Range("A" & rows.count).End(xlUp).row + 1 

''' Parse level into human redable format 
Dim lvlMessage As String 
lvlMessage = "Unknown" 
If level = lslInfo Then lvlMessage = "Info" 
If level = lslWarning Then lvlMessage = "Warning" 
If level = lslDebug Then lvlMessage = "Debug" 
If level = lslCritical Then lvlMessage = "Critical" 

''' Insert data 
LoggerDB.Cells(firstEmptyRow, 1) = Now() 
LoggerDB.Cells(firstEmptyRow, 2) = lvlMessage 
LoggerDB.Cells(firstEmptyRow, 3) = functionName 
LoggerDB.Cells(firstEmptyRow, 4) = message 

''' And optional arguments, one cell per argument 
Dim i As Long 
Dim arg As Variant 
i = 5 
Dim tmp As Variant 
Dim coll As Collection 

這部分包標量(數字,字符串,布爾值,任何單個值)爲集合。 所以我總是可以假設,如果任何額外的參數傳遞,For Each將工作。

它繼承TypeName()返回字符串與「()」數組。

If Not IsMissing(Arguments)Then '如果每個(單個變量)包都不能迭代到集合中。 If Not(InStr(TypeName(Arguments),「()」)<> 0或TypeName(Arguments)=「Collection」或TypeName(Arguments)= 「Dictionary」)Then Set coll = New Collection coll.add參數 SET TMP =科爾 否則 TMP =參數 結束如果

For Each arg In tmp 
     LoggerDB.Cells(firstEmptyRow, i) = CStr(arg) 
     i = i + 1 
    Next arg 
End If 

sh.Activate 
End Sub