• ベストアンサー

VBA offsetで持ってきた範囲に特定の文字列の有無を判断し列を追加したい

いつもお世話になっております。 皆様のご助言のおかげで順調でしたがまたわからない事にぶつかってしまったので、お力を借りれればと思い質問させていただきます。 エクセルのVBAを使って、ファイルAのボタンでフォルダ内の複数ファイルの特定のシートからデータを抽出しファイルAにまとめる作業を行っています。その際他ファイルからデータを持ってくるときは抽出元ファイルのフォーマットが同一の為、offsetを用いて該当ファイルがなくなるまでループさせています。 今ぶつかっているところは抽出したデータを持ってきて、その持ってきた範囲のある列(例えば列A)に特定の文字列が複数ある場合は1、ない場合は0を持ってきた範囲の最後尾の列(例えば列G)の全てに追加したいのです。その後、次のファイルに行くという処理を行いたいです。 いつもご迷惑をおかけして申し訳ありませんが、お力添えをお願いします。 xp、excel2000です。よろしくお願いします。

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

>範囲の最後尾の列(例えば列G)の全てに追加したいのです 「最後尾の列の値(文字列)に1(または0)を付加えるのか」または「範囲の次の列に1(または0)のみのデータを追加する」のか定かでありませんが、後者と仮定しました。(質問文を文章通り読むと前者ですが) >に特定の文字列が複数ある場合は1ない場合は0 一つだけある場合が不明でしたが、1と解釈しました。 また、文字の比較は完全一致(含まれていたらではない)と仮定しました。 ペーストした時のRangeはわかっているでしょうから、これをrngとします。 比較したい文字列をhoge、比較する列番号をcol(1<= col <= rngの列数)とすれば、 rslt = 0 For Each c In rng.Resize(rng.Rows.Count, 1).Offset(0, col - 1)  If c.Value = hoge Then rslt = 1 Next c  rng.Resize(rng.Rows.Count, 1).Offset(0, rng.Columns.Count).Value = rslt c(range)、rslt(integer)は作業用変数です。なお、rngの範囲は変化しないようにしています。 実質的には1回一致したところで、ループを抜けてしまった方が速いですが、そのままにしてあります。 rngの範囲をもとに相対的に記していますので、少々まわりくどい表現になっています。実際はどこかが固定値だったり、変数になっていたりするでしょうから、もっと間略化できますね。 また、もとの範囲が複数のエリアの複合であることは想定していません。

tapian
質問者

お礼

ありがとうございます。 質問のわかりづらかったようでお手数おかけしました。 fujillinさんの解釈で合っています。 解説までつけていただきありがとうございます。 参考にさせていただきます!

その他の回答 (1)

  • howarage
  • ベストアンサー率20% (2/10)
回答No.1

ループがんがん回せばできそうですが。。。ここではExcelの関数を用いた方法をご紹介します。 特定の文字列を"hogehoge"とします。 G列に  =If(CountIf(抽出したデータ範囲のA列の参照,"hogehoge")>1, 1, 0 ) 抽出したデータ範囲のA列の参照は、ファイルをループさせるときに、行をカウントしておいて、文字列として構築してはいかがでしょうか? ( 例: "A" & startRow & ":A" & endRow )

tapian
質問者

お礼

ありがとうございます。 ループを使ってというのはわかるんですがいかにして他ブックの値を参照しようかな・・・・と考えていたんですが・・・。 難しいですががんばります。参考にさせていただきます。ありがとうございます!