• ベストアンサー

VBScriptについて教えてください!

VBScriptで日付が記載されたテキストファイルを読み込み 読み込んだ値と今日の日付を比較する処理をしたいのですが、 今日の日付と異なるのに一行目でいきなり一致との判断をしてしまいます。 どうしてなんでしょうか? すごく初歩てきなことかもしれませんが、御教授願います。 <日付が記載されたテキストの内容> 20090401 20090502 20090603 ・ ・ ・ <スクリプト内容> '本日を取得 strTodayTmp=Year(Date) & Month(Date) & Day(Date) 'ファイルの内容を全部読み終えるまでループ Do Until objInFile.AtEndOfStream = true 'ファイルの内容を1行ずつ読み込む strRecord=objInFile.ReadLine intCompare = StrComp(strRecord, strTodayTmp, vbTextCompare) '読み込んだ内容と一致するか If intCompare = 0 Then 'フラグオン blnGo=1 end if Loop

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

補足しておきます。 コンパネの日付のフォーマットの ShortDate が、yyyy/MM/dd と登録していれば Replace(Date, "/", "") とすればよいと思います。 intCompare = StrComp(Trim(strRecord), strTodayTmp, 1) 全角が入る可能性を考えているのでしょうか? ファイルがそれほど大きくなければ、一気に読んでしまっても良いと思います。 '------------------------------------------- Dim strDate Dim objFSO Dim objFile Dim strFile Const fName = "Test1.txt" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile =objFSO.OpenTextFile(fName, 1) 'ForReading = 1 strFile = objFile.ReadAll strDate = FormatDate(Date) If InStr(1, strFile, strDate, 1) >0 Then MsgBox strDate & " Found", 64 Else Msgbox "Not Found", 48 End If Function FormatDate(arg) Dim y, m, d y =Year(arg) m = Right("0" & Month(arg),2) d = Right("0" & Day(arg),2) FormatDate = y & m & d End Function

その他の回答 (3)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

参考に strTodayTmp = Join(Split(Date, "/"),"") Do Until objInFile.AtEndOfStream i = i + 1 strRecord = objInFile.ReadLine lngCmp = StrComp(strRecord, strTodayTmp) If lngCmp = 0 Then blnGo=1 Exit Do End If Loop objInFile.Close If blnGo = 1 Then MsgBox i & "行目に一致" Else MsgBox "一致なし" End If

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 コードは試していませんが、一応、チェックポイントを回て置きます。 途中からでは、判断ができかねますが、 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objInFile = objFSO.OpenTextFile(FileName) はあるという条件の元だと思います。 >20090401 strTodayTmp=Year(Date) & Month(Date) & Day(Date) まず、これは、単なる数字の並びですから、1月が'01'とはなりませんね。 m = Month(Date) m = String(2 - Len(m), "0") & m Format 関数はないと思いますから、こんなスタイルが必要だと思います。 intCompare = StrComp(strRecord, strTodayTmp, vbTextCompare) vbTextCompare の組み込み定数はないと思いますから、定数で置いていますか? それに、 If intCompare = 0 Then 'フラグオン blnGo=1 End if としても、Exit Do を入れないと、最後まですることになりますね。単に時間がかかるだけですが。

回答No.1

もしも、 'ファイルの内容を全部読み終えるまでループ Do Until objInFile.AtEndOfStream = true   'ファイルの内容を1行ずつ読み込む   strRecord=objInFile.ReadLine   intCompare = StrComp(strRecord, strTodayTmp, vbTextCompare)   '読み込んだ内容と一致するか   If intCompare = 0 Then     'フラグオン     blnGo=1   end if Loop If blnGo = 1 Then   MsgBox "一致" Else   MsgBox "不一致" End If のようなやり方ですと、途中の行は関係なく、最後の行が一致しているかどうかだけで判定されることになりますが、そこは大丈夫でしょうか? 一致した行が見つかるとループを抜けるような処理になっているのでしょうか? 試しに =========================================================== Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set objInFile = fso.OpenTextFile( "Test.txt", 1, 0 ) '本日を取得 strTodayTmp=Year(Date) & Month(Date) & Day(Date) blnGo = 0 intLine = 0 'ファイルの内容を全部読み終えるまでループ Do Until objInFile.AtEndOfStream = true   'ファイルの内容を1行ずつ読み込む   strRecord=objInFile.ReadLine   intLine = intLine + 1   intCompare = StrComp(strRecord, strTodayTmp, vbTextCompare)   '読み込んだ内容と一致するか   If intCompare = 0 Then     blnGo = 1     Exit Do   End If Loop If blnGo = 1 Then   MsgBox Cstr( intLine ) & "行目が一致" Else   MsgBox "一致なし" End If =========================================================== として、 ================= 20090401 20090502 20090603 ================= というデータで実行してみると、"一致なし" に、 ================= 20090401 20090502 2010114 20090603 ================= というデータで実行してみると、"3行目が一致" になりました。

関連するQ&A

  • VBScriptでCSVファイルを読み出したい

    現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream   strLine = .ReadLine   if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1   end if   arrLine = split(strLine , ",")   arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)

  • VBscript

    VBscript  テキストファイルから特定のキーで検索を掛けて、ひっかかった行に記載された 文字列を別ファイルに転記したいのですがヘルプミー。

  • vbscript ファイル操作

    二つのテキストファイルを行レベルで結合したファイルを 作成しようとしています。 ファイルの最後を越えた入力を行おうとしました。 とエラーが吐き出され、結合したファイルがうまく作成されません。 -vbscritptファイル- dim f, f_a, f_b, f_bu, f_mk, wrtxt set f = createobject("scripting.filesystemobject") set f_a = f.opentextfile("c:\temp\a.txt",1) set f_b = f.opentextfile("c:\temp\b.txt",1) set f_mk = f.createtextfile("c:\temp\result.txt") f_mk.close set wrtxt = f.opentextfile("c:\temp\result.txt",2) do while f_b.atendofstream <> true if not f_a.readline & f_b.readline = "" then wrtxt.writeline(f_a.readline & " " & f_b.readline) else exit do end if loop f_a.close f_b.close   -a.txt- 2008/07/01 9:30 2008/07/02 9:59 2008/07/03 9:35 2008/07/04 9:52 2008/07/08 9:45 2008/07/09 9:47 2008/07/10 9:15 2008/07/11 9:44 2008/07/14 9:44 2008/07/15 9:43 2008/07/16 13:19 2008/07/17 9:45 2008/07/18 9:31 2008/07/22 9:39 2008/07/23 9:28 2008/07/24 9:41 2008/07/25 9:58 2008/07/28 9:29 2008/07/29 9:49 2008/07/30 9:50 2008/07/31 9:21 -b.txt- 2008/07/01 18:25 2008/07/02 19:15 2008/07/03 18:45 2008/07/04 19:16 2008/07/08 18:36 2008/07/09 19:14 2008/07/10 18:46 2008/07/11 21:58 2008/07/14 22:36 2008/07/15 19:42 2008/07/16 18:00 2008/07/17 19:19 2008/07/18 18:16 2008/07/22 19:56 2008/07/23 18:42 2008/07/24 18:38 2008/07/25 21:55 2008/07/28 21:31 2008/07/29 22:23 2008/07/30 20:13 2008/07/31 20:00 期待値 2008/7/1 9:30 2008/7/1 18:25 2008/7/2 9:59 2008/7/2 19:15 2008/7/3 9:35 2008/7/3 18:45 2008/7/4 9:52 2008/7/4 19:16 2008/7/8 9:45 2008/7/8 18:36 2008/7/9 9:47 2008/7/9 19:14 2008/7/10 9:15 2008/7/10 18:46 2008/7/11 9:44 2008/7/11 21:58 2008/7/14 9:44 2008/7/14 22:36 2008/7/15 9:43 2008/7/15 19:42 2008/7/16 13:19 2008/7/16 18:00 2008/7/17 9:45 2008/7/17 19:19 2008/7/18 9:31 2008/7/18 18:16 2008/7/22 9:39 2008/7/22 19:56 2008/7/23 9:28 2008/7/23 18:42 2008/7/24 9:41 2008/7/24 18:38 2008/7/25 9:58 2008/7/25 21:55 2008/7/28 9:29 2008/7/28 21:31 2008/7/29 9:49 2008/7/29 22:23 2008/7/30 9:50 2008/7/30 20:13 2008/7/31 9:21 2008/7/31 20:00 vbscriptを使い出したのは最近のため、どこが悪いのかわかりません。 ご指導よろしくお願い致します。

  • VBScriptで、ファイルから任意の行のみ取り出す方法について

    VBScriptにて、あるファイル内を1行ずつ順番に取り出しながら、 途中の数行を別のファイルに書き出したいのですが、方法が分からず 悩んでいます。 -------------------------------------------------------------- set objFS = CreateObject("Scripting.FileSystemObject") set objReadText = objFS.OpenTextFile("C:\read.log") set objWriteText = objFS.CreateTextFile("C:\write.log") count = 1 Do Until objReadText.AtEndOfStream If count >3 And count < 8 Then strLine = objReadText.ReadLIne objWriteText.WriteLine(strLine) ElseIf count = 8 Then Exit Do End If count = count + 1 Loop objReadText.Close objWriteText.Close -------------------------------------------------------------- 上記にて、例えばread.logの4行目から7行目だけをwrite.logに書き出したいのですが、 想定した途中の行だけを別ファイルに書き出す事が出来ません。 どなたかアドバイスを頂けないでしょうか。

  • VBScriptでテキストファイルの内容の間違い探しは出来るでしょうか

    VBScriptでテキストファイルの内容の間違い探しは出来るでしょうか? CSVをテキスト形式で読み込んでいるファイルなのですがごくごくたまに一部内容が違っています。 例: <Aテキスト> "AAAAA","BBB","CC" "DDDDD","EEE","FF" "GGGGG","HHH","II" <Bテキスト> "AAAAA","BBB","CC" "DDDDD","EEE","F8" "GGGGG","HHH","II" とほとんどあっているのですが一部違う行をみつけて別ファイルにその行を書き出したいのです。 CSV形式で見たときA列+B列の値が一致したもののC列データが正しいか確認したいのですがどういったアルゴリズムがいいのでしょうか? お願いします。

  • A列文字とE列文字を比較してG列に判定を出力する

    エクセルマクロ初心者です。 A列に入力されている文字とE列に入力されている文字を比較して、G列に判定を出力(一致:K 不一致:F)するマクロを考えています。 StrComp関数が返す戻り値を利用して StrComp(Cells(j, 1), Cells(j, 5), vbTextCompare) というのを使って比較しようとしましたが、これだと同じ行を参照してしまいます。 A列の方が入力されている行が少ない(例えば:A列は1から10行、E列は1から1000行)ので、A列を基準にE列を比較し、A列が空白行に移った段階で処理を止めたいと思います。 以下に途中まで考えたものを載せます。 j = 1 For j = 1 To Cells(Rows.Count, "E").End(xlUp).Row Cells(j, 10) = StrComp(Cells(j, 1), Cells(j, 5), vbTextCompare)    If Cells(j, 10).Value = 0 Then    Cells(j, 7).Value = "K"    Else    Cells(j, 7).Value = "F"    End If Next j ご教示の程、お願いします。

  • 【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割

    【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割 ■プログラム及びファイルに関する備考 .\test\     = 分割を行いたいファイルが格納されたディレクトリ Dir_FileList.txt = testディレクトリ内のファイルをリスト化したもの。           相対パスにて、1行ずつ改行して記述する。 ■やりたい事 Dir_FileList.txtという、.\test\内に配置されたファイルをリスト化したtxtを 1行ずつ読み込み、読みこんだファイルに対し、10行毎に分割処理を行いたいと思っています。 分割したファイルは、分割元のファイルが格納されたディレクトリと同じ、.\test\ディレクトリに作成し、 分割前の元ファイルを最後に削除するという処理をリストに書かれた全てのファイルに対して行いたいです。 下記のようにコーディングをしたのですが、 どうも「Do Until ( fILE1.AtEndOfStream )」のループ文の処理が行われていない?ようで、 testディレクトリ内部のファイルが分割されません。 色々試したのですが、VBScriptを触るのは初めてでなかなか上手くいきませんでした。 どこが間違っていて、どのように修正すれば動くようになるでしょうか? お手数ですが、ご教授をお願い致します。 ---------------------------------------- Option Explicit Dim flReadFSO, flReadFSO2, fFolder, fILE, flrSubFolder Set flReadFSO = CreateObject("Scripting.FileSystemObject") Set flReadFSO2 = WScript.CreateObject("Scripting.FileSystemObject") Set fFolder = flReadFSO2.GetFolder(".") Dim name1, fILE1 name1 = fFolder & "\Dir_FileList.txt" Set fILE1 = flReadFSO.OpenTextFile(name1) Dim oneLineTxt oneLineTxt ="" Dim FSO set FSO = WScript.CreateObject("Scripting.FileSystemObject") Do Until ( fILE1.AtEndOfStream ) oneLineTxt = fILE1.ReadLine WScript.Echo oneLineTxt arg = ".\test\test01.txt" set fin = FSO.OpenTextFile(arg, 1) fbn = FSO.GetBaseName(arg) fen = FSO.GetExtensionName(arg) nf=0 set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 Do While Not fin.AtEndOfStream fout.WriteLine fin.ReadLine nl=nl+1 if nl>9 then fout.Close nf=nf+1 if nf>9 then exit do set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 end if Loop fin.Close FSO.DeleteFile arg, True Loop fILE1.Close ----------------------------------------

  • VBScriptでのSaveAsについて

    現在、私は「VBScript」を学習中です。 練習に、VBScriptで任意のフォルダにあるすべてのWordのファイルをテキストファイルに保存する簡単なプログラムを作りました。 それは作れたのですが、SaveAsでテキスト保存するときに、 w.SaveAs "xyz.txt", 2 というように、「2」を指定することはいろいろなサイトでわかったものの、それでは他の場合の「一覧」というのがどうしても見つかりません。 Microsoftのサイトでも、「VBA」の場合、「olDoc, olTXT…」などと載っていますが、「VBScript」での使用例がその下に載っているものの、「VBA」の「olDoc」がVBScriptではどの数字を指定するのかなど、一切記載がありません。 どなたか、「VBScript」で「SaveAs」利用時の引数の一覧が掲載されているサイトをご存じの方がおられましたら、アドレスをお教えください。 よろしくお願い致します。

  • VBScriptで削除処理

    初めまして。 VBScriptを今回初めて使用しながらスクリプトを作成しようとしています。 〔質問〕 以下のような削除処理をVBScriptにて実施したいのですが、どのような構文を書けばいいのでしょうか? ご教授お願いします。 以下、例を挙げ記述致します。 (例)処理日が2008/3/22の場合。 「AAAA」ディレクトリ配下の以下のログファイルを二日前までの日付になっているログファイルのみ残し、あとは全て削除するという処理をしたい。 AAAAディレクトリの配下 ・aa080319.log→削除 ・aa080320.log→削除 ・aa080321.log→残す ・aa080322.log→残す 上記例を用いますが、自分で考えた処理フローとしまして、 (1)「AAAA」ディレクトリ配下のファイル一覧をテキストファイルに書き込む。 (2)「(1)」で作成したテキストファイルを読み込み、「2008322」と「2008321」に一致しないログファイルを削除。 以上、宜しくお願いします。

  • 【VBScript】文字列変換&抽出

    VBScriptで以下の動作を実現させたいと思っています。 ・vbsファイルにテキストファイルをドラッグする ・InputBoxに任意の文字列を入力する ・変換しますか?と問われるため、 「はい」を押したらTextStreamオブジェクトを1行ごとに読み込む ・見つかった文字列を置換し、その文字列が含まれた全ての行を  別名のテキストファイルに抽出する  例:(ファイルA)    asdfghjk.vbs    1:あいうえお     2:かきくけこ 3:あいうえお ⇒ (ファイルB)    asdfghjk_20151217.vbs    1:をふうえお 2:をふうえお ・「いいえ」を押したら変換しないで別名のテキストファイルに 見つかった文字列が含む行をそのまま抽出する ・見つからなかった場合、何もしない (別名のテキストファイルを作成しない) 前のプログラムだと、文字列が見つからなかった場合でも 空のテキストファイルを作成していました。 これを防ぐために、以下のように修正したのですが、 オブジェクトが存在しない旨のエラーが出て機能してくれません。 どこが問題なのでしょうか? また、次のステップとして、変換処理を加えたいのですが、 InputBoxを再び使用せずに置換することは可能なのでしょうか? 恐れ入りますが、回答いただけますと幸いです。 Option Explicit Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objParm, strFile, strX, lonMsgBox Dim objFSO, objOpen, strText, strNewFile, objTS Dim lonDate, v, strBuffer Set objParm = Wscript.Arguments If objParm.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf objParm.Count >= 2 Then WScript.Echo "2つ以上のファイルが指定されています。" WScript.Quit Else strFile = objParm(0) End If Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then WScript.Echo objFSO.GetExtensionName(strFile) MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", vbExclamation, "Error" WScript.Quit End If strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) Then MsgBox ("キャンセルされました。") WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", vbOKOnly, "Error" WScript.Quit End If lonMsgBox = MsgBox(strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonMsgBox <> vbYes Then MsgBox ("変換をスキップします。") End If lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2) strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & _ lonDate & "." & objFSO.GetExtensionName(strFile)) Set objOpen = objFSO.OpenTextFile(strFile, ForReading) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine v = strText.ReadLine If InStr(v, strX, vbTextCompare) > 0 Then strBuffer = strBuffer & v & VBCrLf End If Loop objOpen.Close Set objOpen = Nothing If IsEmpty(strBuffer) Then MsgBox strX & "が見つかりませんでした。" WScript.Quit End If Set objTS = objFSO.OpenTextFile(strNewFile, ForWriting, True) objTS.WriteLine strBuffer objTS.Close Set objTS = Nothing Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。")

専門家に質問してみよう