こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAを使ってテキストファイルを加工したい

R1,a,・・・
R2,b,・・・
R2,a,・・・
R3,c,・・・
R4,a,・・・
R4,b,・・・
R4,a,・・・
R5,a,・・・
R5,b,・・・
といった感じのテキストファイルにおいて、各行の最初にあるカンマの前に記載されている文字(上の場合、R1/R2/R3/R4/R5に相当)が2つ一致している行をチェックし、該当しない行は削除するマクロを作成したいと考えています。
※マクロ実行後
R2,b,・・・
R2,a,・・・
R5,a,・・・
R5,b,・・・

なお、文字の重複は、必ず上下の列で連続して発生するようになっています(R5の後にまたR2が発生する事はありません)。このようなマクロを作る場合、大まかにどういった手順でプログラムを作成すればよろしいでしょうか?

投稿日時 - 2008-01-10 17:54:41

QNo.3667493

すぐに回答ほしいです

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

まだ、問題がありました。
最終行のときは、このロジックに引っかかりませんので、
そのときだけ、
s0 = s1 and s1 <> s2
のような形で処理する必要があります。
いろいろ申し訳ありません。

投稿日時 - 2008-01-11 09:29:46

お礼

思った通りのプログラムが出来ました♪いろいろ親切にどうもありがとうございました!

投稿日時 - 2008-01-11 22:24:00

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

またまた失礼
s0 = split(strText,",")

a = split(strText,",")
s0 = a(0)
でした。

投稿日時 - 2008-01-11 09:25:38

ANo.5

必ず半角カンマで区切られているのであれば、

dim a as variant
dim strText as string
a = split(strText,",")
とすることによって、
a(0)にカンマより前の部分が格納されます。

do while not eof(1)
line input #1,strText
t3 = t2
s3 = s2
t2 = t1
s2 = s1
t1 = t0
s1 = s0
t0 = strText
s0 = split(strText,",")
if s0 <> s1 and s1 = s2 and s2 = s3 then
't1とt2をファイルに書き出す。
end if
loop

のような形で処理できると思います。 
(ファイル処理、変数宣誓、デバッグは行っていません。)
半角カンマでない場合は、replace関数などで識別詞を統一する必要があります。
またスペースなどが付随している可能性がある場合は、trim関数などで、消しておく必要があります。

ちなみにVBAはアクセスではないですよね。
(アクセスなら、リンクテーブルを作って、クエリ処理すればよいだけです)

投稿日時 - 2008-01-11 09:23:51

ANo.4

no1です。 
間違い
変数を3個用意して→
変数を4個用意して

下の二つの変数の頭が(Rnの部分)が一致し三つ目と一致しない場合は、→
中の2つの頭がのみが同じとき

でした。 申し訳ありませんでした。

投稿日時 - 2008-01-11 08:23:48

お礼

どうもありがとうございます。
私はプログラミングという行為自体に余り慣れていないのですが、16Augustさんの方法が一番シンプルで分かりやすいのでまずはこの方法でトライしようと思います☆
・・・ところで、基本的な質問で申し訳ないのですが、各行の最初にあるカンマの前に記載されている文字の一致・不一致を比較するにはどうしたら良いのでしょうか?ちなみに、上記例題が悪かったですが、全てRで統一している訳では無く、例えばC201とかL101などが並ぶ事もあります。

投稿日時 - 2008-01-11 09:00:23

最初のデータが、変わるまでの個数をカウントする変数nを考える。
たとえば、下のようなイメージ。
n
1R1,a,・・・
1R2,b,・・・
2R2,a,・・・
1 R3,c,・・・
1 R4,a,・・・
2 R4,b,・・・
3 R4,a,・・・
1 R5,a,・・・
2 R5,b,・・・

変わった時(1の時と終了後)に前が2ならば出力対象。
2つ前と1つ前を出力。
このデータは、チェックとは別に、nを添え字として、1と2の時だけ覚えておく。
出力対象は、添え字が1と2の物だけだから。

という考え方は、どうでしょう。

p.s.
実際は、nが0から始まる方がプログラムが書き易いと思います。

投稿日時 - 2008-01-10 22:43:08

お礼

どうもありがとうございます。人によっていろいろアイディアがあるのですね!非常に参考になります☆

投稿日時 - 2008-01-11 07:39:54

ANo.2

(準備)
前レコードのキー(このたびはカンマでスプリットして、最初の配列に入るR2など)を保持する変数を持つ。仮にmとします。
それと1レコード分を変数にストックするため、変数を決める。
現在溜め込みアリかどうかのフラグの変数を決める(YかNの2値)
(毎回の主要事)
第1レコードは別にして、第2レコード以下を読み込む都度、Mと一致するか聞く、
mには次のレコードを読みに行く前に、現在のキーを毎回代入する。
ーー
(初回の特別対応)
第1レコードはストック(溜め込む。変数に値を保持)。
(前回と同じ場合)
次レコードを読んで、前回キーmと今回キーが同じなら、書き出す
そのときストックありならストックを先に書き出す。
そして今回読んだものを書き出す。1-2(ストック)-2
もし溜め込み(ストック)が無ければ、今回のものを書き出す。1-2-2-2の最後の2
(前回と違う場合)
違えば今回をストックし書き出し処理なし。1-2の例、2をストック。
以上を最終レコードまで繰り返す。溜め込みをする場合はレコードの終わりは要注意。しかし本課題では最後の溜め込み分は捨ててよい。
ーー
溜め込みはできれば、しないほうが良い。しかし次のレコードを読まないと、自分と同じものが次ぎに来て、「ペーアーあり」になるかどうか絶対判らないので、溜め込みは不可避。
上記ロジックは結構ややこしい。コントロールと昔は言った。(VBではコントロールは違う意味だが。)パソコン以前のずっと昔のバッチ処理を思い出しつつ。

投稿日時 - 2008-01-10 21:50:21

お礼

どうもありがとうございます。
私はVBA(と言うかプログラミング自体)に余り慣れていませんのでちょっと難しそうな感じですが、こういうやり方もあるという事で今後の参考にさせて下さい☆

投稿日時 - 2008-01-11 07:41:57

ANo.1

変数を3つ用意して、
一行ずつファイルを読み、
ずらしながら入れていく。
下の二つの変数の頭が(Rnの部分)が一致し三つ目と一致しない場合は、その二つを新規ファイルに書き出す。
でできると思います。

投稿日時 - 2008-01-10 18:20:13

あなたにオススメの質問