• ベストアンサー

ifとvlookupに代わるようなマクロ

お願いします。 一行1件で900件程度のデータがあります。1件当たりの項目(列)は150ほどです。住所録.xlsというファイルです。 これとは別に、個別1.xls~個別30.xlsというファイルがあり、それぞれシートが30ずつあります。 このシート全てに同一の個票フォーマットを作りました。vlookupやifとvlookupの組み合わせ関数をそれぞれの該当セルに入れれば各データは取り出せるのですが、非常に重く実用に向きません。こういった作業を効率よく行えるマクロをお教え願えませんでしょうか? 宜しくお願いいたします。

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

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

なぜ、重くなるのか、というと、Vlookup などは、その戻り値を確保していないので、複数の場所に、そういった関数があると、すべてが連動してしまうからです。簡単な方法は、再計算を手動にすることですが、意外に効率が落ちます。 それをそのまま、マクロに以下のように移植してあげればよいわけです。 Rtn = Application.WorksheetFunction.Vlookup(検索値,範囲,列番号,検索の型) を、Rangeオブジェクトと、数値で与えてやればよいはずです。 Rtn は、エラーも返ることもあるので、注意してください。 If IsError(Rtn) =False Then   MsgBox Rtn End If とでもしてください。 難しく考えないでよいと思います。 ただし、.Formula = "=式" のようなスタイルにはしないでください。 結局のところ、ワークシート関数にまさるマクロ関数はないと言っても過言ではありません。Find メソッドなど、VBAネイティブメソッドと比較すると、遥かに、ワークシート関数のほうが処理が速いです。 最後に、そのようなファイルは、Accessなどのデータベースに移したほうがよいのではないか、と個人的には思います。

gs-wing
質問者

お礼

ありがとうございます。 明快なご回答、是非使わせていただきたいと思います。 Accessは…会社のOfficeのバージョンアップのため、現在使用禁止令が出ていなければ使いたいところです。

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

その他の回答 (2)

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.3

言葉足らずでした。ワークセルにMATCHで行を求めてINDEXにはそれを使えば検索が一度だけで済むという意味です。

すると、全ての回答が全文表示されます。
  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.2

間違えてたらごめんなさい。VLOOKUPが見つけるのは全て同一行ですか?ならMATCHで行を決めてINDEXで取り出すと飛躍的に変わる筈。

gs-wing
質問者

お礼

ありがとうございます。 vlookupとindexでそんなに変わるとは知りませんでした。参考にさせていただきました。

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

関連するQ&A