• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vbs Do~loop内、抜き出し条件、出力について)

VBS Do~loop内の抜き出し条件について

このQ&Aのポイント
  • VBSのDo~loopを使用して行単位でデータを読み込みながら、特定の条件に合致するデータを抜き出し、列ごとに出力する方法について教えてください。
  • 具体的には、特定の文字列がヒットした場合にそのデータを出力する方法や、連続した特定の文字列が続いた場合にそれぞれの列に出力する方法について知りたいです。
  • 例えば、条件が「111」の場合に列1に、「222」の場合に列2に、「333」の場合に列3に出力し、もしも再度「333」が出てきた場合には列4に、「444」が出てきた場合には列5に出力したいです。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

もしかして条件が足りないところがあるかも知れませんが、 今まで聞いた条件だと次のような感じでいいと思います。 ---------------------------------------------------------------- Dim fso, fileIn, fileOut Dim inLine, outLine, code, already222 Set fso = CreateObject("Scripting.FileSystemObject") Set fileIn = fso.OpenTextFile("input.txt") Set fileOut = fso.CreateTextFile("output.txt") outLine = "" already222 = False 'レコードに既に222が出現しているかどうかを表す Do Until fileIn.AtEndOfStream inLine = fileIn.ReadLine code = Left(inLine, 3) '行の先頭3文字がコード Select Case code Case "000", "111" If outLine <> "" Then fileOut.WriteLine(outLine) End If outLine = code already222 = False Case "222" If already222 And outLine <> "" Then fileOut.WriteLine(outLine) outLine = "" End If outLine = outLine & "," & code already222 = True Case "333","444" outLine = outLine & "," & code Case Else '999等のコードは無視 End Select Loop If outLine <> "" Then 'データが残っていたら掃き出す fileOut.WriteLine(outLine) End If fileOut.Close fileIn.Close

fwiv3867
質問者

お礼

答えまで出して頂き、有難うございます。 正直、自分ではこのような考えには到底辿り つきませんでした。 (Do~loopを2回ほど、他、ifがなんだか多すぎて 途中で訳が解からず…。) 今後、BLUEPIXYさんコードを参考に精進致します。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>□999 の場合はどうなるのでしょうか? >■999は、333,444が再度出てくる場合のみ、333の直前の行になります。 結局、 質問文の例で言うと、捨てられるということで良いのでしょうか? >000,222,333,444,333,444 では、999は、捨てられているようですが・

fwiv3867
質問者

補足

引き続きのご質問ありがとうございます。 出力レコードに必要な入力データは 000 111 222 333 444 となります。 999は、2回以上の333,444が出る際、直前に999 が出る為、判別用に使用できるかなと思いまして。 【999は必要なレコードでは有りません。捨てです】 列(1) 000 or 111 or 空白 列(2) 222 列(3) 333 列(4) 444 列(5) 333 列(6) 444   ~ 列(@) 333 ※333,444が複数有る場合。 列(@) 444 ※上記出力レコードのフィード埋め込みの終わりは  (1レコード)、次の列(1)000 or 111が出るまで、  及び、222が出るまでとなります。  (000 or 111が必ず出るとは限りません、  000 or 111がなく222からはじまる場合も有り。 その場合、空白を埋め込む) 素人考えですみません。先に出力レコードのレコード 番号を採番する為、ナンバリングさせようと考えてい る所でした。 ただ、2回以上出る場合の333,444の処置、及び、 000,111の処置が難問です。 i = 0 Do Until objin.atendofstream = True linedata_temp = objin.readline() if instr(linedata_temp,"000") or _ instr(linedata_temp,"111") then i = i + 1 objOut.WriteLine i & " " & linedata_temp else ~ end if~ ~ loop objin.close() objOut.close()

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

999 の場合はどうなるのでしょうか? 000, 111, 222, 333, 444 の5種類以外のデータがあるということですか? >if instr(xxxx,"111") = など検索文字がhitしたら 一行のデータは、"111" ではなくて、一部に"111"が含まれるということですか? 列(1),列(2),列(3),列(4),列(5) 000,222,333,444,333,444 でいうと、 再度、出てくる333は列(4) は、列(5) 再度、出てくる444は列(5) は、列(6) のような気がします。 222 は、再度でてくる可能性はないということですよね。

fwiv3867
質問者

補足

説明が不十分な為、大変お手数をお掛け致します。 □999 の場合はどうなるのでしょうか? ■999は、333,444が再度出てくる場合のみ、333の直前の行になります。 □一行のデータは、"111" ではなくて、一部に"111"が含まれるということですか? ■はい、"111"は読込む行の頭に必ず出てきます。(例:111 ○△□XXXXX~) □再度、出てくる444は列(5) は、列(6) ■申し訳ございません。おっしゃる通りでございます。  再度の333は列(5)、444は列(6)です。 111,222,333 空白,222,333 000,222,333,444,333,444 □222 は、再度でてくる可能性はないということですよね。 ■はい、222の後は、一回以上の222,333となります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2重のDo~Loopは?

    Excel VBAですが、A列にデータが入っています。 A列のデータが変わるまで 処理1 を実行し、変われば 処理2 を実行する。データがなくなれば終了する方法が分りません。宜しくお願いします。 i = 2 Do Until Cells(i, 1) = "" Do Until Cells(i, 1) <> Cells(i - 1, 1) 処理1 Loop 処理2 Loop

  • VBS ある条件で,空き行を埋め込む。

    空き行の埋め込みに関して、質問させて頂きます。 Do~loopにて行読込み S111~S555の入力レコードを読込み、S111~S555を 繰返し順に出力させています。 ただし、入力レコードはS111~S555が順に並んでいる のですが、いずれかに空きがあります。 他、S111が有る場合はそのまま、S111を入れ込み S111が無い場合はS111の行は必要有りません。 +++入力 S111 xxxxx S222 xxxxx S444 xxxxx S222 xxxxx S333 xxxxx +++出力 S111 xxxxx S222 xxxxx S333 "空白" S444 xxxxx S555 "空白" S222 xxxxx S333 xxxxx S444 "空白" S555 "空白" このような出力結果をもとめるには、どのような 処理を行えばよいのか、どなたかヒント、参考と なる助言をお願い出来ませんでしょうか。

  • Do..Loopステートメントの使い方について

    現在、入門書を画面で確認しながら ExcelVBAの勉強をしています。 Do...Loopで躓いてしまいました。 Do...Loopステートメントの種類は 条件を満たすまでループするもの Do Until...Loop(ループの前で条件判断) Do...Loop Until(ループの後で条件判断) 条件を満たす間はループするもの Do While...Loop(ループの前で条件判断) Do...Loop While(ループの後で条件判断) とあって、 例えば、A1からA7まで文字が入力されていて 空白のセルになるまで太文字にするとしたら、 ループの前に条件判断していると A1が空白だと処理はされず ループの後で条件判断すると A1が空白でも処理はされる とありました。 とすると、 条件判断はループ後にした方が良いと言う事なのでしょうか。 (空白でも処理してくれるので) 自分が処理したいものが ループ「後」にするのか又は ループ「前」にするのか どのように判断すれば良いのかと言うことと、 また、 条件を満たすUntil(まで)とWhile(間) どちらを使用すれば良いのかの判断方法もわかりません。 超初心者の質問内容で申し訳ありません。 VBAって面白いなぁと思い始めたところで なんとか理解したいので 教えていただけると大変助かります。 よろしくお願いします。

  • LOOPやFor文で出来ないでしょうか。

    いつもお世話になっております。 現在帳票出力のコーディングをしております。 帳票は8レコードで一枚で、 8レコード以下になると、罫線が印刷されないため、 ブランクのデータを作ることで対応しようと思っています。 そこでブランクを入れる処理についてなのですが、 データ件数が8の倍数まで処理をつづけたいのですが どのように記述すればいいか思案に苦しんでおります。 Do Until KANRI_TANA_KENSU = 8 Or 16 Or 24 Or 32 Or 40 Or 48 Or 56 Or 64 Or 72 RS_BLANK.AddNew RS_BLANK!区分 = "BLANK" RS_BLANK.Update Loop とりあえず、一つのグループに30件以上はないので数値を固定化させたのですが 勿論これではダメだというのは理解しているのですが。。。 イメージとしては 件数カウントしている数値を8で割り、その答えが 8の倍数でない場合は小数点が出ると思います。 要するに、整数というか小数点が出なくなるまで加算させるという条件が できればいいのかなと思っているのですが それをコーディングにするにはどうすれば。。。と思っている次第です。 他の方法でも結構ですので何か案が御座いましたら ご教示いただけませんでしょうか。

  • VBSの勉強中です

    VBSの勉強中のためにうまく質問できないかもしれません。 ある関数を作成して「Do while 条件」にてループ処理をしています。 条件は特定の文字列が入力されたら実行するようにしています。 ここで別の文字列が来たらループの処理を終了させたいのですが、 具体的にはどのようにしたらよいのでしょうか? イメージとしては「ON」するとループ処理が始まり、「OFF」にすると処理が止まる というようなイメージです。 どなたか方法をご教授いただければと思います。

  • 「DO LOOP」についての質問です。VBA初心者です。

    「DO LOOP」についての質問です。VBA初心者です。 昨日同じ質問をさせていただきましたが、私の質問がきちんと書かれていなかったせいで 皆様にご迷惑をおかけしてしまいましたm(_ _;)m きちんと伝わるように訂正して再度質問させていただいてます。 『入力画面』というシートに日付を入力してマクロ実行すると 『入力画面』の右隣りにその日付名のシートが新しく作られるように設定しています。 入力する日は不定期で連続した日付ではありません。 それでお聞きしたいのは、新しく作成するシートのB列に複数の名前を入力した後、 その名前をキーに右隣のシートから一つずつ検索していって、一致するものがあれば 同じ行のN列とP列の値を新しいシートのK列とM列に取得しループ終了。 もしくは全てのシートを検索しても一致するものがなければゼロ表示でループ終了。 という作業をしたいんですが、構文がどのように作ればいいのかがわかりません。 お手数ですが、どうかご教授願います。

  • Excel VBA Sheet2で指定した条件でSheet1の行削除

    Sheetが2つあるExcelブックがあります。 Sheet2で検索条件(列とキーワード)を指定し、 この条件でSheet1を検索、 Sheet1で検索にヒットした行を行削除したいと考えています。 汎用性を高める為、Sheet2で指定する検索条件は可変とし、 検索対象とする列とキーワードは任意のものを必ず指定(""は無し)。 列&キーワードをひとつの検索条件として、 Sheet2の2行目~最終行までLoopしたいのです。 InStrを使用するなど、部分的には分かるのですが、 2つの条件を同時に変えながらLoopさせる方法が 色々試してみましたが、どうしても分かりません。 VBAに詳しい方、同様の処理をしたことがある方、 どうか助けてください!宜しく御願い致します。 [Sheet1] ・・・ 元データ     A   B   C ---------------------------- 1   あ ---------------------------- 2   い   該当 ---------------------------- 3   う       閉鎖 ---------------------------- 4   え   該当 ---------------------------- 5   お ---------------------------- [Sheet2] ・・・ 行削除する範囲とキーワードを指定。     A   B ---------------------------- 1   列   キーワード ---------------------------- 2   A   あ ---------------------------- 3   B   該当 ---------------------------- 4   C   閉鎖 ---------------------------- [求めている結果] 1, 2, 3, 4行目が削除される

  • FileMaker Loop 処理に関して

    現在、FileMaker10で二重loop処理を行いたいと思って スクリプトを作成してみました(画像添付しております、テストデータです) 2つめのloopで「次の」「最後まできたら終了」にしております。 「最後まできたら終了」のチェックを外すと無限ループしてしまいます。 「最後まできたら終了」で2つ目のloop処理が終了するのではなく スクリプト自体が終了してしまい困ってます(悩) 自分がしたい事は1行目のデータとそれ以降のデータ(注文コード&取引コード0 で同じデータが存在した場合、フィールド設定で「ダブリ1」「ダブリ2」を 記載したいと思っております。 1行目を見終わった際に、今度は次の行とその後のデータを再度比較して また調べるという形です。 技術不足でお恥ずかしいですが、どなたか教えて頂けると幸いです。 よろしくお願いします(添付画像参考願います)

  • 差分出力及び差分出力について

    プログラム初心者です。教えてください。 vbscriptで2パターンプログラムを書きたいです。 ・1つはテーブルから差分データをcsv形式で出力  既に出力済のレコードは出力しない。 ・もう1つはあるファイルを読み込み、テーブルに追加する  既に取り込み済のレコードについては取り込まないようにする。 基本的な質問ですが、テーブルから出力やテーブルへの取り込みについては、 テーブルにフラグの列を作って、レコードのそのフラグの列が 1の場合は出力済、もしくは取り込み済 0の場合は未出力、もしくは未取り込み と判断させるようなプログラムを書き、該当するレコードだけ 出力もしくは取り込みという処理を書けばいいのでしょうか? 何か参考になる例があれば教えていただけないでしょうか。 よろしくお願いします。

  • エクセル VBA Loop & Delete

    最近マクロの勉強を始めたばかりの初心者で、どうしても Loop 処理の構文が理解出来ません。 S列 T列 U列  0  0  0 10  5  8  0  4  0  ・  ・  ・  ・  ・  ・ 上記のようにS列(3行目)からU列(最終行変動)に0~20000位の値が入っていて、データの並び替えでS列(昇順)で並べ替えをした後、S列の値が0の場合のみS~T列をDelete Shift:=xlUP したいです。 もしくはS列が0の場合のみT列まで選択 Range("S3:U...") とし、S列が0の行をまとめて Delete Shift:=xlUp したいです。 並べ替えまでマクロすぐ出来たのですが、Loop For Next など構文が理解できません。 どなたかお知恵をお貸し下さい。