• 締切済み

Excel2000のVBAについて教えてください

はじめまして。 現在、以下のような表があるとき、コードCがブレイクするごとに、データBに対する絶対値の最大値を求めるVBAを作成しようと思っています。 また、求めた絶対値の最大値を持つデータを抽出して、各コードCに対する最大値のみのデータを別シートに貼り付けたいとも思っています。 同一コードC内に絶対値の最大値が複数存在することもあります。 データ件数は処理ごとに変更がありますので未定です。 なお、Microsoft Queryはインストールされていません。 以上の条件でどのようなコードを作成すれば良いのか教えていただければ幸いです。 例として下記のような表1のデータを、表2のように変更したいと考えています。 よろしくお願いいたします。 表1 コードA コードB コードC データA データB データC 48     01     22   -179.4  2.402  3.864 48     20     22   -248.3  4.102  3.826 49     06     22   0.1031  -2.02  3.986 49     07     22   -153.9  1.773  3.902 50     01     22   -179.4  2.402  3.872 50     07     22   -153.9  1.773  3.886 51     08     21   -6.386  0.069  2.622 51     09     21   -74.24  0.073  2.538 52     09     21   -74.24  0.073  2.522 52     12     21   -85.48  0.084  2.508 53     10     20   0.2928  2.427  5.986 53     11     20   -198.4  -1.14  5.903 54     11     20   -198.4  -1.14  5.886 54     13     20   -231.3  -1.73  5.872 55     12     21   -85.48  0.084  2.499 55     26     21   -115.8  0.114  2.462 56     13     20   -231.3  -1.73  5.864 56     22     20   -320.2  -3.32  5.826 表2 コードA コードB コードC データA データB データC 56     22     20   -320.2  -3.32  5.826←コードCが20のグループでデータBが絶対値の最大値を持つデータ 55     26     21   -115.8  0.114  2.462←コードCが21のグループでデータBが絶対値の最大値を持つデータ 48     20     22   -248.3  4.102  3.826←コードCが22のグループでデータBが絶対値の最大値を持つデータ

みんなの回答

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

こういうのはシートデータをC列でソートする。そしてC列が変化するまでの間は、1行を読んだ際にデータA,データB、データCの各々(変数を対応して3つ割り当てる)について、その区画内で今までの絶対値より大きければ値を、今の行の値で置き換える。C列コードが変わったら直前の結果を新しいシートに書き出す。そのための行ポインタが必要で、書き出したら;+1しておく。 そしてC列で変わった今の(最初の)データで、データA,データB、データCの各々の変数をとりあえずセットする。 最終行に来たら処理後現状を書き出して終わる(一種の溜め込み処理なので吐き出すことを忘れないように)。 ーー これはプログラムで最大値を求めるロジックと同等である。 絶対値を見ること C列の同じ値の間だけで、考えること の違いがあるだけ。上記のロジックはコントロールブレークのアルゴリズムでも在る。 ーー 色々な仕組みを作るよりこの方が速いはず。コンピュター草創期からオフラインバッチ処理で頻用された手法である。 ーー 丸投げの質問なので、コードは省略。

lucifer398
質問者

お礼

ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

public function get_data(arg1, arg2, arg3)  dim n as long  dim res  res = 0  for n = 1 to arg1.count   if arg1(n) = arg2 then    if abs(arg3(n)) > res then     res = abs(arg3(n))     get_data = arg3(n)    end if   end if  next n end function つかいかた: =get_data(コードセル範囲,コード,データセル範囲) コードCが20のグループでデータAの絶対値の最大値を求めるセルに,次の式を入れる。 =get_data(C2:C100,20,D2:D20)

lucifer398
質問者

お礼

ありがとうございます。 早速試してみます。

関連するQ&A