こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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が絶対値の最大値を持つデータ

投稿日時 - 2011-03-04 10:22:51

QNo.6566781

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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

投稿日時 - 2011-03-04 23:40:08

お礼

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

投稿日時 - 2011-03-07 10:18:46

ANo.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)

投稿日時 - 2011-03-04 10:45:17

お礼

ありがとうございます。

早速試してみます。

投稿日時 - 2011-03-04 10:50:18

あなたにオススメの質問