• ベストアンサー

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

  • エクセル2007 マクロについて教えてください

    エクセルのデータが2個あります。 それぞれ、ファイル名は 顧客データ.xlsと個別シート.xlsです。 顧客データ.xlsには、10名のお客様の情報があり、A1セルには ID番号 と入力してあり、 A2~A11セルにID番号が入力されています。 『個別シート.xlsにマクロで顧客データ.xlsのデータをコピーし、ID番号のフォルダをデスクトップに新規作成し、ID番号を付けて保存する』マクロを作成中です。 顧客番号が1234のお客様のデータを、個別シートにコピーし、デスクトップに1234というフォルダを新規作成し、その中に 個別シート_1234.xls というファイル名で保存をしたいです。 顧客データを自動でコピーするまではできましたが、それ以降ができません。 MkDir "C:\ Documents and Settings\xxx\デスクトップ\nknk\ID " ChDir "C:\ Documents and Settings\xxxi\デスクトップ\nknk\ID " ActiveWorkbook.SaveAs Filename:="個別シート_" & ID & ".xls" ActiveWorkbook.Close マクロを実行すると『実行時エラー76:パスが見つかりません』とエラーになります。 (フォルダ作成の命令文のところが黄色くなります。) ちなみに、個別シートの指定したセルに、IDはコピーされています。 正しく実行できる文を教えてください。また、以降の命令文は正しいでしょうか。 よろしくお願いします。  

  • IFとVLOOKUP関数

    VLOOKUP関数を使って検索結果を出そうと思いましたが、 データ量が93000行X8列になりますので、 共通分けして複数のシート(A、B、C、D)に分けました。 あるセルに『A』と入れると『シートA』の表から検索を行う、 あるセルに『B』と入れると『シートB』の表から検索するといった感じにするには、 IFとVLOOKUPを使用するなら、どのような式を入れたらいいのでしょうか? また、他の関数を使う式があるのでしょうか? マクロやVBAも考えましたが、 あまり知識がありません。 データ量から考えると マクロやVBAで行った方がいいのでしょうか?

  • エクセルマクロでマクロをアクティブにしたくない

    エクセルのマクロをひとつの「マクロA」という名前で、データーファイルからセルに入っている内容などを呼び出しながらまくろAのシートにデーターを貼り付けながら作業をしています。 Workbooks.Open Filename:= _ "C:\Documents and Settings\owner\My Documents\マクロ.xls" Application.Run "マクロ.xls!マクロ" と記載すると、マクロXLSがアクティブになってしまいます。 その為記載に'ActiveWindow.WindowState = xlMinimized と入れたりするのですが、アクティブになるシートがマクロ以外にうまくいかないことがあるのです。 データーシートは、毎回データーが変わる関係で、DATA.xlsがAのときやBのときが発生します。

  • VLOOKUPのような操作ができるマクロ

    VLOOKUPのような操作を マクロで行いたいのですが、 その組み方を教えていただけませんでしょうか。 下表のように 入力作業を行うシート「sheet作業」(シート数は10あります)と データが入力されているシート「sheetデータ」があり、 「sheet作業1」(~「sheet作業10」)のセルにNo.を入力すると、 「sheetデータ」のNo.列を参照して、 同じ番号の、"姓"から"点数"までのデータをコピーして、 「sheet作業」の、"姓"から"点数"までのセルに、 値のペーストで貼り付ける というような形でマクロを組みたいのですが、 どのように組めばよろしいでしょうか? ------------------------------------------------- 「sheetデータ」 No.  姓   名  点数 101  あい  うえ  10 102  かき  くけ  20 103  さし  すせ  25 104  たち  つて  30 105  なに  ぬね  45 ------------------------------------------------- 「sheet作業1」 No.  姓   名  点数 102 (かき) (くけ) (20) ↑ (No.を入力してマクロを実行すると、  "姓"から"点数"までのデータがペーストされる。) 「sheet作業2」 No.  姓   名  点数 105 (なに) (ぬね) (45) ------------------------------------------------- 分かりづらい文章ですみません。 よろしくお願いします。

  • VLOOKUPについて

    EXCEL2000のvlookupについての質問です。 下記のような使用法方法 =VLOOKUP(RC[-1],[コード.xls]Sheet1!R1:R65536,2,FALSE) はできるようになったのですが、 複数ファイル(シート全体)を検索する場合は どのように記述すれば良いのでしょうか? また、下記のエラーについて悩んでいます。 あるシートの値をvlookupで検索すると見つからないの ですが、普通に編集→検索をすると見つかります。 これはvlookupで検索できないということでしょうか?

  • シート単体の時のみマクロを有効に。

    メニュー画面となる「menu.xls」ファイルと、コードごとの管理の為の「コード.xls」ファイルがあります。 「menu.xls」はシート「メニュー」・「リスト」・「フォーマット」の構成で、この「フォーマット」シートにコードの名前をつけて保存したものが、「コード.xls」となっています。 「フォーマット」シートにはいくつかのVBAを施してあるんですが、これを 「menu.xls」として開くときには実行させず(無効化)、「コード.xls」として開くときには実行(有効化)させたいのです。 現在、「コード.xls」としてシート「フォーマット」を開いた時はマクロがWorkbook_Openで動作してくれて構わないのですが、「menu.xls」として開いた時もシート「フォーマット」のWorkbook_Openが動作してしまい、エラーが出てきてしまいます。 「フォーマット」シートに実行判定を付ければいいのでしょうか? どうしたらいいか全くわかりませんので、ご教授頂きたくお願い申し上げます。

  • エクセルのマクロ

    以下の処理をするマクロを教えて頂きたいのですが。 ファイルab.xlsのSheet1のA1からA100までのデータを、ファイルcd.xlsのSheet3のC列にコピーする。 ただし、Sheet3のC列には既にデータが入力されているので(空欄も有)、一番末端に付け足す形にする。 続けて、ファイルab.xlsのSheet2のA1からA100までのデータを、ファイルcd.xlsのSheet3のC列に、前と同様のやり方でコピーする。 宜しくお願いいたします。

  • エクセルマクロ Vlookupに似たマクロはありますか?

    度々すみません。 わからない事がいくつか出てきてしまって。どなたかご教示いただけると嬉しいです。 今は手作業で以下のような作業をしております。 データ元のシート(以下(1))とそれ加工して作るシート(以下(2))があります。 (1)のデータを2度sortするのですが、一度目のsortでtotalが入っている行は全てdelete。 残ったデータでもう一度sortし、種類別に並び変えます。 その後、コラムAがUSDである物はシート(2)のUSDページに貼り付け、コラムAがEURであればシート(2)のEURページに貼り付け・・・としていきたいのですが、マクロの記録を使おうにも、毎回コラムAは目視で確認しコピー・貼り付けをしていますのでマクロの記録は使えないですし、エクセル関数ではVLOOKUPがありますが、それをマクロに書き込む方法もどこにも載っておらず、どうしていいか息詰まった状態です。 sortするのはマクロの記録を使って作成できましたので、 ・コラムAがtotalになっている行より下はdelete ・コラムAがUSDならシート(2)のUSDシートへ貼り付け・・・ のマクロを作成したいです。 どうか宜しくお願い致します。

  • VLOOKUP 参照について

    ファイルAのなかにリストと重量のシートがあります。 VLOOKUP'重量'にて参照させてます。 同じファイルを数人に分散し、結合時にファイルBに追加したら、VLOOKUP'[データA.XLS]重量'となりました。再起動時に「このブックには他のデータソースへのリンクが含まれている」とメッセージが出ました。 各自、「重量シート」にないものは、任意入力してますので、ファイルBの式を追加分にコピーしたら任意入力したものが消えてしまいます。 最終的にはファイルBのみ保管したいのですが、良い方法があれば教えて下さい。

  • vlookup関数の引数を変数で指定することはできますか?

    エクセルのVBAでマクロを組み、同じフォルダ内にあるファイルにvlookup関数でリンクを張ろうかと考えています。 ファイルの構成は以下の通りです。 マクロを組んでいるファイル:Book1.xls マクロが適応されるファイル:Book2.xls vlookup関数で参照されるファイル:Book3.xls 実際にBook1に組んだマクロは以下の通りです。 Workbooks.Open ThisWorkbook.Path & "\Book2.xls" Workbooks("Book2.xls").Activate myFile = ThisWorkbook.Path & "\" & "Book3.xls" b = 2 Do Until ActiveSheet.Cells(b, 1) = "" ActiveSheet.Cells(b, 6) = "=VLOOKUP(E" & b & ",myFile!$A:$F,5,0)" b = b + 1 Loop 上記マクロで実行すると、Book2が開き、vlookup関数が挿入されるところまではいきますが、 変数myFileが正常に変換されないらしく、ファイルが見つからない状態となってしまいます。 myFileの代わりにフルパスでファイルをしていすると正常にマクロは起動することは確認しましたが、 毎回作業するフォルダが変わる為、フルパス指定はできるだけ避けたいです。 基礎的な質問で恐縮ですが、 vlookup関数の引数(参照範囲)を変数で指定する方法を教えてください。 よろしくお願いいたします。

専門家に質問してみよう