質問: True And InStr(szBuffer, "個のディレクトリ") <> 0 Then 'fiDateがTrue及び"個のディレクトリ"の文字列があった場合 objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し End If loop ' ********************************************************** ' ファイルクローズ ' ********************************************************** objOut.Close objIn.Close 長くなり申し訳ございませんが、指定した日のみ、必要な情報をテキストに出力する には、どのようにすればよろしいでしょうか。 ご教授いただきたく存じます。 よろしくお願いいたします。
回答: 対象の日付を見つけたかの判定が ``` If InStr(szBuffer, dtmDate) = (tokyo = True Or osaka = True) Then'tokyo及びosakaがTrueの場合 ``` だとすると、まずここが問題です。 InstrはszBufferの中から見つけたdtmDateの文字の位置をかえしますが、その比較相手がTrue/Falseとなっており、なにを判別したいのかよくわからないことになっています。 そしてもう一つの問題が、「tokyo」や「osaka」、「個のディレクトリ」の文字を見つけたらすぐに(日付に関わらず)WriteLineしてしまっているところです。 このため意図しない日付の情報でも関係なく出力されてしまっています。 というわけで、改善点は ・日付の判定を正しく行う。 ・tokyo/osakaを見つけても日付を確認するまでは出力しない。 (ディレクトリの文字を見つけた時点で対象日のtokyo/osakaなら出力する) の2つです。 ``` Option Explicit ' ****************************************************** ' オブジェクト作成 ' ****************************************************** Dim objFso:Set objFso = CreateObject("Scripting.FileSystemObject") Dim objShell:Set objShell = WScript.CreateObject("WScript.Shell") Dim szPath:szPath = WScript.ScriptFullName szPath = objFso.GetParentFolderName(szPath) Dim tokyo:tokyo = False Dim osaka:osaka = False Dim fso Dim flDate:flDate = False Dim szBuffer Dim strDate Dim dtmDate ' ****************************************************** ' ファイルオープン ' ****************************************************** 'msgbox szPath 'WScript.Quit Dim objIn:Set objIn = objFso.OpenTextFile(szPath & "\putlog.txt", 1) If Err.Number <> 0 then MsgBox (Err.Description) WScript.Quit End If Dim objOut:Set objOut = objFso.OpenTextFile(szPath & "\getlog.txt", 2, True) ' ****************************************************** ' 日付の入力 ' ****************************************************** strDate = InputBox("月日を入力してください。",2016/01/01) If IsDate(strDate) Then dtmDate = CDate(strDate) Else MsgBox "正しい日付を入力してください。" End If msgBox dtmDate Dim iCnt:iCnt = 0 '行番号(DBG用) ' ****************************************************** '入力型式「YYYY/MM/DD」にて指定した日のみ書き出すテキスト '取得データの「空き領域のバイト数値を書きだすテキスト ' ****************************************************** do While not objIn.AtEndOfStream iCnt = iCnt + 1 '行番号(DBG用) szBuffer = objIn.ReadLine'ReadLineにてputlog.textを一行ずつ読み込む If InStr(szBuffer, CStr(dtmDate)) > 0 Then 'dtmDate(inputBoxにて入力した日付)があった場合、 'objOut.WriteLine dtmDate&": 取得した日" '日付と": 取得した年月日"を書き出し flDate = true MsgBox iCnt & " date:" & CStr(dtmDate) End If If InStr(szBuffer, "C:\japan\tokyo のディレクトリ") <> 0 Then 'C:\japan\tokyo のディレクトリの文字列があった場合 tokyo = True 'objOut.WriteLine "" 'objOut.WriteLine " ・/data/japan/tokyo"'・/data/japan/tokyo"を書き出し MsgBox iCnt & " tokyo" End If If InStr(szBuffer, "C:\japan\osaka のディレクトリ") <> 0 Then '"C:\japan\osaka のディレクトリ"の文字列があった場合 osaka = True 'objOut.WriteLine "" 'objOut.WriteLine " ・/data/japan/osaka"'・/data/japan/osakaを書き出し MsgBox iCnt & " osaka" End If 'If InStr(szBuffer, dtmDate) = (tokyo = True Or osaka = True) Then'tokyo及びosakaがTrueの場合 ' flDate = True'flDateをTrueにする ' MsgBox Date() 'End If ' ファイルサイズの取得 'If flDate = True And InStr(szBuffer, "個のディレクトリ") <> 0 Then 'fiDateがTrue及び"個のディレクトリ"の文字列があった場合 ' objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し 'End If If (tokyo = True Or osaka = True) And InStr(szBuffer, "個のディレクトリ") > 0 Then 'tokyo/osakaが見つかっており、及び"個のディレクトリ"の文字列があった場合 If flDate = true Then objOut.WriteLine dtmDate&": 取得した日" '日付と": 取得した年月日"を書き出し If tokyo = True Then objOut.WriteLine "" objOut.WriteLine " ・/data/japan/tokyo"'・/data/japan/tokyo"を書き出し End If If osaka = True Then objOut.WriteLine "" objOut.WriteLine " ・/data/japan/osaka"'・/data/japan/osakaを書き出し End If objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し MsgBox iCnt & " dir" End If tokyo=false osaka=false flDate = false End If loop ' ****************************************************** ' ファイルクローズ ' ****************************************************** objOut.Close objIn.Close ```