• 締切済み

VBAの計算式で値を検出し別シートに貼り付ける

例でA.xls sheet1に添付のデータがありB.xls sheet1のB列に検索値がありC列に記載のとおりの計算式が入力されています。関数入力はC2セルにの計算式を入力しそれを元にオートフィルでC3以降入力しているが膨大な計算式になりExcelを開いたりするのに処理に時間がかかりすぎる為セルに計算式をいれるのではなくVBAで計算式を入力しオートフィルみたいに連続した計算の値のみを入力したいのですがコードが解る方宜しくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1です。 下記がピンと来ない場合は無視してください。 VBAで、マッチングという方法でやることを提案してみる。 予想では、骨子部分は15行ぐらいのコード行数か。 ーー ・エクセル関数を使わない(シートに関数を設定しない) ・VBAのFindメソッドも使わない ・多分10万行ぐらいなら、早く終わる、方法の提案。 VBAで関数式を作って、セルにセットするなんてVBAではふつう考えない。 >VBAで計算式を入力しオートフィル 計算式を作る、式の複写を作る、のが結構むつかしいと思うが。 VBA経験者はそういう発想をしないのではないか。 ーー 1日に1回まとめてする処理や1か月に1回まとめて処理などに最適。 オフラインバッチ処理というものです。レガシー的やり方ではあるが、応用が 広いものです.窓口でお客と対応しているときに検索するような処理には 適しません。 ーー 両ファイルとも、事前に目的のキーで、エクセルのソート機能を使って ソートする必要がある。  Aファイル  ○順でソート  Bファイル  ○順でソート   ○はVLOOKUP関数の第1引数の列のデータ。 シートの処理最初行は(第2行から始まると仮定した場合)   AファイルSheet第2行目をポイント   BファイルSheet第2行目をポイント。   (ポイント(値)はそれぞれ専用の変数を設け、それに値を持ち、参照にはCells(ポインタ変数、列記号)で セルの値を参照・取得することです。(初回のみA.Bファイルを両方読まないと比較できないので両方読む。両方読みモードをONにする。) ーー (x)Aファイルのシートのデータ行のポイントしている行を読む。初回のみBファイルも読む A,B両方読みモードONなら、A,B両方読みモードOFFにして(y)へ でなければ、比較(c)へ。 (y)Bファイルのシートのポイント行を読む。 (c)AファイルからのキーとBファイルからのキーについて 両者のキーを比較する(IF文などで)。  3つの場合がある ーー   A=Bの場合(見つかった場合)     Aファイルの行からほしいデータ列のデータを取得する     Cファイルに書き出す。キーやなど。     A、B、Cのファイルで次行へポイントを進める(列番号を+1) A、B両方読みモードにして(x)へ行く。   A<Bの場合(BはAの現在行キーを飛び越えた)     Aのポイント行を1つ進めて、     (x)に行く   A>Bの場合(AはBの現在行キーを飛び越えた。BはAに見つからなかったということ。       その処理(見つからないという注記など)をする     Bのポイント行を1つ進めて、     (y)に行く ーー   AまたはBファイルのポイント行が最終行以下を指す様になったとき、終了に持ち込む手法。      終わったフィルの方の最終行の次の行にHIGHVALUEをセット。      比較(c)に行って比較を続ける。   A=Bのルーチンの中にAのキーがHIGHVALUEか聞くステップを入れる。 http://www.gizcollabo.jp/vbtomo/log/archive/choshoqa_22071_0.html 等しければ本件全体処理終了。  AとBの行を1回読む処理時間で終了するはず。事前処理にソート時間が加わるが。計算は全くしていない。行数に1加える部分だけ例外。 毎回画面処理をさせないため、Screenupdating=FALSEは入れること。

kuma0220
質問者

お礼

ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

質問の表現が要領を得ず、内容がはっきりわからない。画像もぼやけてよくわからない。 VLOOKUP関数を使っている点を、VBAでやるということか?。 データ数のオーダー(例1万、10万、それ以上)など質問に書くべきだろう。 それなら第1引数に当たる値で第2引数のセル範囲の最左列を検索し、指定列のデータを取ってきて、どこかにセットすればよい、という内容か?。 そのためには、(1)VBAでもVLOOKUP、MATH関数などが使えるが、(2)普通はFind関数を使って、第1引数の値で第2引数の範囲の最左列を検索し(一番初めに見つかる行を見つけて)、その行の右列指定列のデータを取ってくればよい。 第1引数の値は複数行で見つかる場合はないのか(ユニークという)。これは質問に書いておくべき事項。 複数行で見つからないならFilterでやることもないのだろう。 ただし(1)、(2)ともデータ数が多いと、検索に時間がかかり、関数より早いかどうかやってみないとわからない。 (3)Accessでの処理などに転向するのも検討しては。 (4)関数式をシートにVBAでセットするというアイデアは馬鹿げているように思う。 (「>VBAで計算式を入力し」のやり方。) >「膨大な計算式」は、(セル)数のことか、式の入力文字数が多いということか。 質問の表現からして、エクセルにどの程度慣れているのか、心配。VBAの経験があるのか。 ーー 関数を利用のアイデアを断ち切り、VBAのデータ処理(VBAの中に検索や計算などのプログラムを作る)に切り替えてやってみて、処理時間がガマンできるなら、その考えを取ればよい。 しかしVBAのプログラムを組む力があるのか。質問の表現ぶりからして、プログラムを組む力は無いように見えるので、丸投げしてコードを教えろということか。

kuma0220
質問者

お礼

ありがとうございます。

関連するQ&A