• 締切済み

VBSで文字を比較して一致するセル値に書き込む方法を教えてください。

プログラミング初心者です。以下のスクリプトのコードを教えて下さい。または、参考サンプルの場所などありましたら教えて下さい。 現在、VBScriptのOpenTextFileを用いて各個人の書類提出"済""未"ログ を採取しております。(添付ファイルのように一個人一テキストファイルで管理)ここまでは、書籍のサンプルコードを引用したので作成できました。 【やりたい事】 ログ情報を取得してきて、エクセル表に提出済みなら"●"を書き込んでいきたいです。 動きとしましては、テキストファイルのログ情報から管理Noと氏名で一致したエクセル表のセル値に書き込んでいく。といったことです。 申し訳ございませんが、お知恵をおかしください。

みんなの回答

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

>VBScript から Excel ファイルを開くところまで もう解決済みかもしれませんが・・・

参考URL:
http://www.upken.jp/wiki/index.php?VBScript%2FExcel
回答No.1

やりたいことだけは書いてありますが、何がわからないのか書いてないので勝手に解釈します。 VBScript から Excel のデータファイルを開くところまではできていて、●を入れる場所を特定する方法がわからないってことですか? 以下、前提がわからないので勝手に解釈。 Excel の A列、A1 から下に向かって、既に全ての出席番号があるとします。 出席番号が空白になっているセルは無いとします。 Excel の 1行目、D1 から右に向かって、既に全ての管理 No. が振ってあるとします。 管理 No. が空白になっているセルは無いとします。 テキストファイルの 1行には複数の要素があるようですが、何で区切ってあるのか不明ですが、TAB で区切ってあるとします。 ---- <キーになる要素の取り出し> 出席番号は VBScript で開いているテキストファイルのファイル名から取得できます。 Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim studentID studentID = fso.GetBaseName("C:\aaa\bbb\ccc.txt") これで studentID に "ccc" という文字列が入ります。 生徒名は VBScrit で読み込んだ行の 4番目の要素で取得できます。 Dim lineString lineString = テキストファイルからの読み込み Dim vals vals = Split(lineString, vbTab) Dim studentName studentName = vals(3) 管理番号は VBScript で読み込んだ行の 5番目の要素で取得できます。 読み込んだ 1行分の文字列を Split(文字列, vbTab) Dim MngNum MngNum = vals(4) ---- <Excel ワークシートへの書き込み> 先にも言ったとおり VBScript から Excel ファイルを開くところまではできているとします。 対象ワークシートを targetSheet 変数で参照しているとします。 合致する管理番号の列番号を取得して変数 recCol に入れる Dim lastCol lastCol = targetSheet.Cells(1,4).End(&HFFFFEFBF).Column Dim recCol recCol = targetSheet.Range(targetSheet.Cells(1, 4), targetSheet.Cells(1, lastCol)).Find(MngNum).Column 合致する出席番号の行番号を取得して変数 recRow に入れる Dim lastRow lastRow = targetSheet.Cells(3, 1).End(&HFFFFEFE7).Row Dim recRow recRow = targetSheet.Range(targetSheet.Cells(3, 1), targetSheet.Cells(lastRow, 1)).Find(studentID).Row <氏名と●を書き込む> targetSheet.Cells(recRow, 2).Value = studentName targetSheet.Cells(recRow, recCol).Value = "●"

btybd090
質問者

お礼

temtecomai2 さん、ご回答頂きまして有難うございました。 お礼の返事が送れましたことお詫びいたします。

btybd090
質問者

補足

temtecomai2さん、詳細なコードの提示有難うございます。 "VBScript から Excel ファイルを開くところまではできているとします" すみません、ここの部分はまだ出来ておりません。各個人のログをテキストファイルに書き出すところまでしかできておりません。 "targetSheet変数"というものを使用してExcelファイルを開くという処理を教えて頂けないでしょうか。  私の質問がいたらなかったばかりにご迷惑をお掛けしますが、宜しくお願いします。

関連するQ&A

  • VBSについて教えてください。

    VBSを勉強したくて http://www.whitire.com/vbs/tips0001.html のサンプルコードを見たのですが Option Explicit WScript.Echo "Hello VBScript World" はどこに張り付ければいいのでしょうか? エクセルVBAの標準モジュールに Sub test() WScript.Echo "Hello VBScript World" End Sub として実行してみましたが WScriptの部分がコンパイルエラーになってしまいました。

  • VBScriptのCloseとNothing

    VBScriptのCloseとNothing vbsでバッチ処理をプログラムを作っています。 内容は、テキストファイルの読み込みと書き込みです。 OpenTextFile(読み取り専用)でテキストファイルの中身を読み取り、 文字列操作後、 OpenTextFile(追記モード)で 読み取ったテキストファイルとは別のテキストファイルに書き込みます。 CloseとNothingは いつ、どのように使えばよいのですか? 参考サイトでも良いので教えてください。 よろしくお願いします。

  • エクセルVBAの文字列の部分一致について

    在庫管理のため、バーコードハンディターミナルで収集したCSV形式のログデータを、別のエクセルファイルに転記するマクロを組もうとしています。 ログファイルには、以下のようにバーコードのコード番号に対して在庫数が入力してあります。 AAA01,10 AAA02,15 BBB01,5 BBB02,7 AAA01とAAA02は同じ種類なので、在庫数は転記先のエクセルファイルの同じセル内に数値を加算します。 この時、同じ文字列(ここではAAAまたBBB)が含まれるコードの在庫数をコピーするマクロはどのようにしたらよいのでしょうか?

  • (VBS) テキストファイル読込での改行コード

    VBAからVBスクリプトへの移植作業をしています。 テキストファイル中に改行コード \r\n と \n が混在しているのですが、 \r\n までを1行として取得したいです。 VBAだと Line Input で取得できたのですが、 VBScriptの場合、FileSystemObject.OpenTextFileで開き .ReadLine で読み込むことになりますが、 ReadLineは \n も行の終端とされてしまい、本来1行のデータが複数行に分かれて読み込まれてしまいます。 .ReadAllで一旦すべてを取得してから Split("\r\n") で分割するという方法は ファイルサイズが膨大だと負荷が掛かるので避けたいです。 \n は、これはこれでデータとして必要なので、削除することはできません。 負荷が掛からず、良い方法があればご教授頂きたく思います。 よろしくお願い致します。

  • EXCEL vbaで化け文字を検索

    EXCELシートを、csvファイルにしてテキストエディタで開くと一部文字が「?」で表示されます。 調べてみると"垂直タブ"(コード「0B」)が「?」で表示されました。その他にも色々とあります。 テキストエディタで開いて、化ける文字がシート内に存在するか否かをチェックする方法はありませんか?(VBA) たとえば、 asciiコード表 sjisのコード表のどの範囲がテキストファイルでも化けないのか?が分かれば コードチェックでわかるのでは? 教えてください。

  • 文字列aを一文字ずつExcelのセルに入力する方法

    Excel VBAについて確認させてください。 下記のエクセルマクロはエクセルのA列に入力されてある文字を順に読み込んで ユーザが入力したテキストファイル(=FN1)を開いて エクセルのA列に入力されてある文字が見つかった場合は削除する作業を 文字が入力されてある最後の行までループによって行い、 最終的に処理した文字列aを出力ファイル(=FN2)に保存するプログラムです。 このプログラムを改良して文字列aを出力ファイル(=FN2)に保存するのをやめて 文字列aを一文字ずつ、Excelのセルごとに1行ずつ入力するプログラムを作成したいのですが どのようにすればよいかご教授いただけますでしょうか。 以下、プログラム本文です。 ------------------------- Sub sample() Dim a As String Dim y As Long Dim x As String Dim FN1 As String Dim FN2 As String x = InputBox("チェックするファイル名を入力してください。(拡張子も含めてください。)") FN1 = ThisWorkbook.Path & "\" & x FN2 = ThisWorkbook.Path & "\チェック済" & x With CreateObject("Scripting.FileSystemObject").GetFile(FN1).OpenAsTextStream a = .ReadAll For y = 1 To Cells(Rows.Count, 1).End(xlUp).Row a = Replace(a, Cells(y, 1), "") '読み込んだテキストファイルにエクセルのA列にある文字が見つかった場合削除 a = Replace(a, vbCrLf, "") '改行コードの削除 a = Replace(a, vbTab, "") 'タブコードの削除 Next .Close End With With CreateObject("Scripting.FileSystemObject").OpenTextfile(FN2, 2, True) .Write a .Close End With End Sub

  • VBAの覚え方・勉強の仕方

    自分はVBAを覚える・勉強するために テキストファイルにサンプルコードを作って一つのフォルダに保存しています。 サンプルコードとは Sub ファイル名を取得する() MsgBox CurrentProject.Name End Sub をテキストに書いて保存して、ファイル名を 「Access_自身のファイル名を取得する.txt」にしています。 現在200個くらい作りましたが、 管理ができなくなってきてしまいました。 というのも、同じようなサンプルコードを作ってしまったり、 フォルダ内検索してるのに欲しいコードがヒットしなかったりです。 みなさんはどのようにVBAのお勉強をしているのでしょうか? サンプルコードを作られている方は、どのように管理されてますか? アクセスで「サンンプル管理システム」などを作って管理してるのでしょうか?

  • ログファイルの一部分を抽出する方法について

    ログファイルをテキスト形式でインポートし エクセルのマクロを使ってログファイルのデータの一部を抽出する方法を教えてください。 ログファイルの例 20130301 xxxxxx\A123456xxxxxxxxx 出納ファイルxxxxxxxxxxxxx といったデータが5000件以上あるログファイルを下記のように ファイル名と社員コード、同一の社員が何回開いたかを集計したいです。 マクロ結果イメージ ファイル名 社員コード 開いた回数 出納ファイル A123456       2 出金ファイル A987456       2        出金ファイル A123456       1 文書管理ファイル A444444       2 対象ファイルが数個あるので、Excelで開き、VBA等で対応できればと思っています。 何か良い方法がありましたらご教示いただければ幸いです。

  • VBScriptでエクセルを開き、

    VBScriptでエクセルを開き、 そのエクセルにテキストを書き込んでセーブしてから閉じる。 という処理を行っているのですが、 テキストを書き込んでいる間に、エクスプローラー上で別のエクセルファイルを開こうとすると、VBScriptで開いている同じエクセルアプリケーションで開いてしまい、 VBScriptのセーブしてから閉じるという処理が走ると、同様に閉じてしまいます。 希望としては、 テキストを書き込んでいる間に、エクスプローラー上で別のエクセルファイルを開こうとすると、別エクセルアプリケーションが開き、VBScriptとは、別として動作してほしいと考えていますが、 私の至らぬ知識ですとどうしても解決できません、ご協力をお願い致します。

  • 複数の自作バッチプロラムの共有ログを採取する方法

    複数の自作バッチプロラムの共有ログを採取する方法 os:windows xp バッチプログラムの開始前後にログ出力をします。 普通にバッティングせずに動くと、後述のサンプル・ログ(1)のように綺麗にとれます。 しかし、 バッティングした際に正しく取れません。 dos batファイルでやったところ、掴んでいるときに後から行った方の出力がされません。  → サンプル・ログ(1) それならと、 vbsで同じ事を作ってみました。 すると、掴んでいるときに後から行った方がエラーでコケました。 ファイルの定義やオープンの時に「掴んでいたら無制限に待つ」とか「タイムアウトまで待つ」とか、そういう事はできるでしょうか? 複数のアプリから同じファイルにIOするには仕組みとして何かが足りないのでしょうか? 以上、よろしくお願いします。 ■サンプル・ログ (1) ===== FILE_TIME.log ===== 2010/03/05- 9:00:00.00,処理1,開始 2010/03/05- 9:00:00.00,処理2,開始 2010/03/05- 9:30:00.00,処理1,終了 2010/03/05- 9:40:00.00,処理2,終了 ===== FILE_TIME.log ===== (2) ===== FILE_TIME.log ===== 2010/03/05- 9:00:00.00,処理1,開始 2010/03/05- 9:30:00.00,処理1,終了 2010/03/05- 9:40:00.00,処理2,終了 ===== FILE_TIME.log ===== ■サンプル・バッチファイル ===== Shori1.bat ===== @echo off echo %date%-%time%,処理1,開始 >> FILE_TIME.log rem 処理1呼び出し echo %date%-%time%,処理1,終了 >> FILE_TIME.log ===== Shori1.bat ===== ===== Shori2.bat ===== @echo off echo %date%-%time%,処理2,開始 >> FILE_TIME.log rem 処理2呼び出し echo %date%-%time%,処理2,終了 >> FILE_TIME.log ===== Shori2.bat ===== ■サンプル・vbs ===== Shori1.vbs ===== Set ObjSFS = WScript.CreateObject("Scripting.FileSystemObject") Set ObjLogFile = ObjSFS.OpenTextFile("FILE_TIME.log", 8, True) ObjLogFile.WriteLine Now() & ",処理1,開始" ObjLogFile.Close rem 処理1呼び出し Set ObjLogFile = ObjSFS.OpenTextFile("FILE_TIME.log", 8, True) ObjLogFile.WriteLine Now() & ",処理1,終了" ObjLogFile.Close ===== Shori1.vbs ===== ===== Shori2.vbs ===== Set ObjSFS = WScript.CreateObject("Scripting.FileSystemObject") Set ObjLogFile = ObjSFS.OpenTextFile("FILE_TIME.log", 8, True) ObjLogFile.WriteLine Now() & ",処理2,開始" ObjLogFile.Close rem 処理2呼び出し Set ObjLogFile = ObjSFS.OpenTextFile("FILE_TIME.log", 8, True) ObjLogFile.WriteLine Now() & ",処理2,終了" ObjLogFile.Close ===== Shori2.vbs =====