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