はじめに
vba等でデバックの際に、あまり実ソースに負担をかけないで
ログファイルを出力するため、専用に分離化しました。
ログコード
■Excel用[vba]
xx_DebugLogOut_forExcel.bas
Attribute VB_Name = "xx_DebugLogOutForExcel"
Option Explicit
'デバック用 = 最後には削除すること
Public gDebugLogStTime As Date
'出力フォルダ
Private Const LOG_FOLDER_NAME As String = "\LOG"
'ログ分の一番最初につける文字列
Private Const LOG_TOP_STR As String = "--"
'【この関数に関するコメント用sub】※使用されることはありません
Private Sub comment()
'【対象ログ】
'XXX_Debug_Log_Print_SQL_VAL関数 = バインドパラメータの取得
'XXX_Debug_Log_Print_SQL_CMD関数 = sqlを出力
'XXX_Debug_Log_Print関数 = 通常のデバック出力
'**********************************************************************
'【記入用テンプレート】sqlの抽出の場合
'Call XXX_Debug_Log_Print_SQL_VAL("XXX", "XXX", OraDatabase)
'Call XXX_Debug_Log_Print_SQL_CMD("XXX", strSQL)
'**********************************************************************
'**********************************************************************
'【記入用テンプレート】デバック文出力の場合
'例[XXX]YYY
'Call XXX_Debug_Log_Print("XXX", "YYY")
'例[XXX]YYY:[ZZZ]
'Call XXX_Debug_Log_Print("XXX", "YYY", "ZZZ")
'
'**********************************************************************
'=========================================================
'関数名:XXX_Debug_Log_Print_SQL_VAL関数
'用途 :OsqlEditで出力する際の バインド形式でログ出力
'
'パラメータ:1)使用している関数名
' 2)バインド名称
' 3)データーベースオブジェクト
'
'
'記入例)
'Call XXX_Debug_Log_Print_SQL_VAL("CheckCheck", "I_SYU_POST_CD", OraDatabase)
'→[出力]2019/12/12_11:28:35[CheckCheck]!bind set I_SYU_POST_CD = '00';
'=========================================================
'関数名:XXX_Debug_Log_Print_SQL_CMD関数
'用途 :SQL文をログ出力
'
'パラメータ:1)使用している関数名
' 2)SQL文
'
'記入例)
'Call XXX_Debug_Log_Print_SQL_CMD("CheckCheck", strSQL)
'→[出力]2019/12/12_11:28:35[CheckCheck]SELECT 数量,SEQNO FROM 棚マスタ WHERE 部署CD = :I_POST_CD
'=========================================================
'関数名:XXX_Debug_Log_Print関数
'用途 :ログ出力(通常)
'
'パラメータ:1)使用している関数名
' 2)出力したいメッセージ
' 3)(option)使用すると 「2)の文:[3)文]」となる、(値表示等に使用)
'記入例)
'Call XXX_Debug_Log_Print("CheckCheck", "I_SYU_POST_CD", "11")
'→[出力]2019/12/12_11:28:35[CheckCheck]I_SYU_POST_CD:[11]
'Call XXX_Debug_Log_Print("CheckCheck", "--開始--")
'→[出力]2019/12/12_11:28:35[CheckCheck]--開始--
'
'※※※※※※※【※テキストエディタ等で編集の場合】※※※※※※※※※※※※※
'出力されたログをログ部分とSQL部分に置き換え(※正規表現で置き換え)
'→時間と出力ログ文が分割されます
'---[1]----
'検索文字:^
'置換文字:--
'---[2]----
'検索文字:]
'置換文字:]\n\r
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
End Sub
'******************************************************************
'デバックログ出力(SQL設定設定値取得)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'oraObj :オラクルオブジェクト
'******************************************************************
Public Sub XXX_Debug_Log_Print_SQL_VAL(ByVal strProcName As String, ByVal strOuStr As String, oraObj As Object)
Call XXX_Debug_Log_Print_SQL_CMD(strProcName, strOuStr, "sqlval", oraObj)
End Sub
'******************************************************************
'デバックログ出力(SQL文出力)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'strOutval :値やその他(出力が「:[ 値 ]」となる)
'oraObj :オラクルオブジェクト
'******************************************************************
Public Sub XXX_Debug_Log_Print_SQL_CMD(ByVal strProcName As String, ByVal strOuStr As String, Optional ByVal strOutval As String = "", Optional oraObj As Object = Nothing)
Dim strWritLog As String
Dim strRepOutstr As String
strRepOutstr = strOuStr
strWritLog = ""
'strOutvalがついているときは 「設定値」と「値」を出力する
If strOutval = "" Then
'strOuStrのみの場合=> SQL文として判定(改行は削除する)
strRepOutstr = Replace(strRepOutstr, vbCr, " ")
strRepOutstr = Replace(strRepOutstr, vbLf, " ")
strRepOutstr = Replace(strRepOutstr, " ", " ")
strWritLog = strWritLog & strRepOutstr
Else
'設定値
If oraObj Is Nothing Then
strWritLog = strWritLog & strOuStr & " :[" & strOutval & "]"
Else
strWritLog = strWritLog & "!bind set " & strOuStr & " = '" & oraObj.Parameters(strRepOutstr).Value & "';"
End If
End If
'ログ書き込み
Call writeLogMsg(strProcName, strWritLog)
End Sub
'******************************************************************
'デバックログ出力(通常デバック文)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'strOutval :値やその他(出力が「:[ 値 ]」となる)
'******************************************************************
Public Sub XXX_Debug_Log_Print(ByVal strProcName As String, ByVal strOuStr As String, Optional ByVal strOutval As String = "")
Dim strWritLog As String
'strOutvalがついているときは 「設定値」と「値」を出力する
If strOutval = "" Then
'strOuStrのみの場合
strWritLog = strWritLog & strOuStr
Else
'値設定
strWritLog = strWritLog & strOuStr & ":[" & strOutval & "]"
End If
'ログ書き込み
Call writeLogMsg(strProcName, strWritLog)
End Sub
'******************************************************************
'LOG作成ファイルパス取得
'******************************************************************
Private Function getFilePass() As String
Dim strWriteDirPass As String
Dim strWritePass As String
'最初に起動したときの時間がログの時間となる
If gDebugLogStTime < #1/1/1900# Then
gDebugLogStTime = Now()
End If
'フォルダパス設定(ない時は作成)
strWriteDirPass = ThisWorkbook.Path & LOG_FOLDER_NAME
If Dir(strWriteDirPass, vbDirectory) = "" Then
MkDir strWriteDirPass
End If
'ファイルパス設定
strWritePass = strWriteDirPass & "\Log_" & BookName() & "_" & Format(gDebugLogStTime, "yyyymmdd_hhnnss") & ".log"
getFilePass = strWritePass
End Function
'******************************************************************
'Excel名取得
'******************************************************************
Private Function BookName(Optional 拡張子 As Boolean = False) As String
Dim bk_name As String
Application.Volatile
bk_name = ActiveWorkbook.Name
If 拡張子 = True Then
BookName = bk_name
Else
BookName = Left(bk_name, InStrRev(bk_name, ".") - 1)
End If
End Function
'******************************************************************
'ファイル書き込み
'******************************************************************
Private Sub writeLogMsg(strProcName As String, strLogMsg As String)
Dim strWritePass As String
Dim intFileNo As Integer
'ファイルパス取得
strWritePass = getFilePass()
' ファイルの書き込み
intFileNo = FileSystem.FreeFile()
Open strWritePass For Append As #intFileNo
Print #intFileNo, LOG_TOP_STR & Format(Now(), "yyyy/mm/dd_hh:nn:ss") & "[" & strProcName & "]" & strLogMsg
Close #intFileNo
End Sub
■vb6.0用[bas]
xx_DebugLogOut.bas
Attribute VB_Name = "xx_DebugLogOut"
Option Explicit
'デバック用 = 最後には削除すること
Public gDebugLogStTime As Date
'出力フォルダ
Private Const LOG_FOLDER_NAME As String = "\LOG"
'ログ分の一番最初につける文字列
Private Const LOG_TOP_STR As String = "--"
'【この関数に関するコメント用sub】※使用されることはありません
Private Sub comment()
'【対象ログ】
'XXX_Debug_Log_Print_SQL_VAL関数 = バインドパラメータの取得
'XXX_Debug_Log_Print_SQL_CMD関数 = sqlを出力
'XXX_Debug_Log_Print関数 = 通常のデバック出力
'**********************************************************************
'【記入用テンプレート】sqlの抽出の場合
'Call XXX_Debug_Log_Print_SQL_VAL("XXX", "XXX", OraDatabase)
'Call XXX_Debug_Log_Print_SQL_CMD("XXX", strSQL)
'**********************************************************************
'**********************************************************************
'【記入用テンプレート】デバック文出力の場合
'例[XXX]YYY
'Call XXX_Debug_Log_Print("XXX", "YYY")
'例[XXX]YYY:[ZZZ]
'Call XXX_Debug_Log_Print("XXX", "YYY", "ZZZ")
'
'**********************************************************************
'=========================================================
'関数名:XXX_Debug_Log_Print_SQL_VAL関数
'用途 :OsqlEditで出力する際の バインド形式でログ出力
'
'パラメータ:1)使用している関数名
' 2)バインド名称
' 3)データーベースオブジェクト
'
'
'記入例)
'Call XXX_Debug_Log_Print_SQL_VAL("CheckCheck", "I_SYU_POST_CD", OraDatabase)
'→[出力]2019/12/12_11:28:35[CheckCheck]!bind set I_SYU_POST_CD = '00';
'=========================================================
'関数名:XXX_Debug_Log_Print_SQL_CMD関数
'用途 :SQL文をログ出力
'
'パラメータ:1)使用している関数名
' 2)SQL文
'
'記入例)
'Call XXX_Debug_Log_Print_SQL_CMD("CheckCheck", strSQL)
'→[出力]2019/12/12_11:28:35[CheckCheck]SELECT 数量,SEQNO FROM 棚マスタ WHERE 部署CD = :I_POST_CD
'=========================================================
'関数名:XXX_Debug_Log_Print関数
'用途 :ログ出力(通常)
'
'パラメータ:1)使用している関数名
' 2)出力したいメッセージ
' 3)(option)使用すると 「2)の文:[3)文]」となる、(値表示等に使用)
'記入例)
'Call XXX_Debug_Log_Print_SQL("CheckCheck", "I_SYU_POST_CD", "11")
'→[出力]2019/12/12_11:28:35[CheckCheck]I_SYU_POST_CD:[11]
'Call XXX_Debug_Log_Print_SQL("CheckCheck", "--開始--")
'→[出力]2019/12/12_11:28:35[CheckCheck]--開始--
'
'※※※※※※※【※テキストエディタ等で編集の場合】※※※※※※※※※※※※※
'出力されたログをログ部分とSQL部分に置き換え(※正規表現で置き換え)
'→時間と出力ログ文が分割されます
'---[1]----
'検索文字:^
'置換文字:--
'---[2]----
'検索文字:]
'置換文字:]\n\r
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
End Sub
'******************************************************************
'デバックログ出力(SQL設定設定値取得)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'oraObj :オラクルオブジェクト
'******************************************************************
Public Sub XXX_Debug_Log_Print_SQL_VAL(ByVal strProcName As String, ByVal strOuStr As String, oraObj As Object)
Call XXX_Debug_Log_Print_SQL_CMD(strProcName, strOuStr, "sqlval", oraObj)
End Sub
'******************************************************************
'デバックログ出力(SQL文出力)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'strOutval :値やその他(出力が「:[ 値 ]」となる)
'oraObj :オラクルオブジェクト
'******************************************************************
Public Sub XXX_Debug_Log_Print_SQL_CMD(ByVal strProcName As String, ByVal strOuStr As String, Optional ByVal strOutval As String = "", Optional oraObj As Object = Nothing)
Dim strWritLog As String
Dim strRepOutstr As String
strRepOutstr = strOuStr
strWritLog = ""
'strOutvalがついているときは 「設定値」と「値」を出力する
If strOutval = "" And oraObj Is Nothing Then
'strOuStrのみの場合=> SQL文として判定(改行は削除する)
strRepOutstr = Replace(strRepOutstr, vbCr, " ")
strRepOutstr = Replace(strRepOutstr, vbLf, " ")
strRepOutstr = Replace(strRepOutstr, " ", " ")
strWritLog = strWritLog & strRepOutstr
ElseIf strOutval <> "" And Not (oraObj Is Nothing) Then
'設定値
strWritLog = strWritLog & "!bind set " & strOuStr & " = '" & oraObj.Parameters(strOuStr).Value & "';"
Else
strWritLog = strWritLog & strOuStr
End If
'ログ書き込み
Call writeLogMsg(strProcName, strWritLog)
End Sub
'******************************************************************
'デバックログ出力(通常デバック文)(アプリ直下出力)
'strProcName:関数名
'strOuStr :SQL文やその値等
'strOutval :値やその他(出力が「:[ 値 ]」となる)
'******************************************************************
Public Sub XXX_Debug_Log_Print(ByVal strProcName As String, ByVal strOuStr As String, Optional ByVal strOutval As String = "")
Dim strWritLog As String
'strOutvalがついているときは 「設定値」と「値」を出力する
If strOutval = "" Then
'strOuStrのみの場合
strWritLog = strWritLog & strOuStr
Else
'値設定
strWritLog = strWritLog & strOuStr & ":[" & strOutval & "]"
End If
'ログ書き込み
Call writeLogMsg(strProcName, strWritLog)
End Sub
'******************************************************************
'LOG作成ファイルパス取得
'******************************************************************
Private Function getFilePass() As String
Dim strWriteDirPass As String
Dim strWritePass As String
'最初に起動したときの時間がログの時間となる
If gDebugLogStTime < #1/1/1900# Then
gDebugLogStTime = Now()
End If
'フォルダパス設定(ない時は作成)
strWriteDirPass = App.Path & LOG_FOLDER_NAME
If Dir(strWriteDirPass, vbDirectory) = "" Then
MkDir strWriteDirPass
End If
'ファイルパス設定
strWritePass = strWriteDirPass & "\Log_" & App.EXEName & "_" & Format(gDebugLogStTime, "yyyymmdd_hhnnss") & ".log"
getFilePass = strWritePass
End Function
'******************************************************************
'ファイル書き込み
'******************************************************************
Private Sub writeLogMsg(strProcName As String, strLogMsg As String)
Dim strWritePass As String
Dim intFileNo As Integer
'ファイルパス取得
strWritePass = getFilePass()
' ファイルの書き込み
intFileNo = FileSystem.FreeFile()
Open strWritePass For Append As #intFileNo
Print #intFileNo, LOG_TOP_STR & Format(Now(), "yyyy/mm/dd_hh:nn:ss") & "[" & strProcName & "]" & strLogMsg
Close #intFileNo
End Sub