• 締切済み

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/17068)
回答No.2

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

lucifer398
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答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

  • excel関数

    excelで作成した表のなかで a列には各コードが入力 b列は文字列 c列は数字 別にシートを作りコード順に 最小値と最大値、平均を求めたい b列に文字が入っていないデータを探して、別シートに入力したa列コードと一致するデータをc列から探し(複数データあります)その中で更に最小値と最大値、平均を求めたいのですが 関数が分かりません。 教えていただけば助かります。 よろしくお願いします。

  • Acessの使用方法について

    はじめまして。よろしくお願いします。 アクセス(初心者)を使用して以下のことを行おうとしていますが、どのようにすれば良いでしょうか。 ※環境:access2000 (1)大元のデータ(A)から、様々な抽出条件により、クエリa、クエリb、クエリcを作成する。(今は選択クエリですが、必要に応じて変更可) (2)各クエリa,b,cに対応するデータがそれぞれ何件あるか、一度に算出する。 ------------------------------------------------------------- 作成したクエリa,b,cをそれぞれ手動でオープンして、何件あるか目視するのは、数が多いため不可能。そのため、クエリX(クエリa,b,cのデータが何件あるか一度に算出する)を作成してcount関数を使用し算出しようとしましたが、1クエリの場合は可能ですが、複数クエリを一度に算出しようとするとカウントデータ結果が不正になる(クエリ*クエリでデータが重複する)。 何か素人にもできる簡単な方法で、各クエリの件数が何件あるか一度で算出できる方法はないでしょうか。 ※同様に、どのクエリにも該当しないデータも算出する方法も検討しています。(これは上記が可能なら、その応用だと思っています。) お願いします。

  • マイクロソフトアクセスについて

    アクセスでデータベースを作っているのですがテーブルを結合させてクエリを作成しているのですが巧く動きません。一般的なものは、自分でできるのですが今回は、ちっょと悩んでいます。 <組合せの内容は> (1)AテーブルにAコード:Bコードがあります。 Aコードは、2000レコードあり重複していません。 Bコードは、同じものもあります。 (2)BテーブルにBコード:C1~C171までのコードが Bコードは、170レコードあり C1~C171までは、同じものもありますし空白のものもあります。 今回作成したいのがAコード:C1~C171コードです。 自分でクエリを作成してみたのですがデータが表示されません。 何かよいヒントを教えてくださると助かります。

  • EXCEL2013 重複データかつ複数条件

    添付ファイルの通り、A列、B列、C列にデータがあります。 以下の条件すべてを満たす件数を表示したいと考えております。 ・A列 2016/2/15 ・B列 重複するデータを一件とする ・C列 X この表で言うと4件という結果になる計算式を作成したいところです。 シンプルな計算式をご教授いただきたいと存じます。 どうぞよろしくお願いします。

  • excel2000 ある列の項目名をカウントしその件数表示をする

    エクセルで表10行×5列の表があります。1列目にあるデータが入っております。その項目名をカウントし多い順に別の表にその項目名と件数を表示させたい。できるだけ自動的におこなうためにはどうすればよいでしょうか。 例 :ある表 1列 A B c B c A D E F B 結果 別の表 項目 件数 B   3 A   2 C   2 D   1 E   1 F   1

  • Excel2003で式のコピー

    下記質問のやり直しです。 http://oshiete1.goo.ne.jp/qa5310983.html 実際に使用する式の作成のためにサンプル表を作って練習してます。 A1(=$B$1*5+$C$1/5+$D$1+10) B1(5) C1(60)   D1(20)                     B2(=B1*5) C2(=C1/5) D2(=D1+10) 目的はA1に=$B$1*5+$C$1/5+$D$1+10を貼り付けたいのです。B2,C2,D2の式を順番にA1に貼り付けたいのですが、絶対参照は置いといて、B2はクリック、コピー、形式選択、数式でA1に=B1*5は貼り付け出来ますがC2、D2を追加で貼り付け出来ません。A1に手入力ではなく、作成済みの式をコピーする方法が知りたいです。 又、作成済みの式の相対参照を一括で絶対参照に変更するにはどうしたら良いのでしょうか? どうぞ宜しくご教示下さい。

  • AccessVBA

    Accessのシステムを作っています。 Excelファイルを取り込みたいのですが、中身は表形式になっています。 この表を取り込みそのままテーブルにします。 これと取り込み表のA3から最終行までのキーとなるコードをいれた別テーブルの作成。 次にのテーブルを元に、 A1クエリ(一行目だけを取り込んで店名)とB1クエリ(取り込み表の2行目以下最終行商品)を作成する。 2つのクエリと1つのテーブルを元に、 形を変えた表をCSVファイルにして作成したいと思っています。 どのように、コードを書いたらいいのでしょうか? 教えて下さい。 1.元の取り込み表 販売店名        a店   b店  c店 商品コード/店コード  a0111 b0112  c0113 a301z 1 1 b501z 2 3 c101z 4 5 2.出力したい結果 出荷日 販売店名 販売店コード 商品コード  数量  到着予定日 12/1   a店    a0111  a301z 1 12/5 12/1   a店    a0111  c101z 4 12/5 12/1   b店    b0112  b501z 2 12/5 12/1   b店    b0112  c101z 5 12/5 12/1   c店    c0113  a301z 1 12/5 12/1   c店    c0113  b501z 3 12/5 出荷日・到着予定日は、出力後に手入力します。 以上となります。 宜しくお願い致します。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • EXCEL2007でVBAが動かない

    私の知り合いがWindowsMeを使っていて、個人的に株の取引をしています。知り合いから頼まれて、その株の管理をするための表をEXCELで作りました。そして、その管理表の空白部を非表示にするため、次のようなプログラムをVBAで作りました。 "If ActiveSheet.Name = "銘柄別取引明細" Then ActiveSheet.Unprotect Rows(CStr(1) & ":" & CStr(登録最大件数 + タイトル行 + 1)).EntireRow.Hidden = False 表示最大行 = 表示最大行検索((タイトル行 + 1), "A") Rows(CStr(表示最大行 + 2) & ":" & CStr(登録最大件数 + タイトル行)).EntireRow.Hidden = True ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If End Sub" 登録最大件数=100と最初に定義しています。表示最大行検索は別にサブプロシジャを作っています。 さて、知り合いのパソコンが壊れて、新しくパソコンを買いました。当然、Vistaです。新しいパソコンに、このEXCELファイルをメモリから読み込ませ、開いてみると、動きません。セキュリティの問題かと思い、「全てのマクロを有効にする」にして、さらに「開発者を信用する」をオンにしてみましたが、動きません。 調べてみると、VBAの、"Rows(CStr(1) & ":" & CStr(登録最大件数 + タイトル行 + 1)).EntireRow.Hidden = False"でプログラムが止まってしまっています。 理由が分かりません。誰か教えてください。 しかし、何でEXCEL2007になると、突然、プログラムが動かなくなるのでしょうか。EXCEL2007では不具合になるようなことがあったとしても、自動的に、EXCEL2007に合うよう、変換するサービスがあってもいいと思うのですが。 それも含めて助けてください。

  • 【Excel VBA】日付の代入

    現在以下の操作を行いたく、コードを作成しています。 ・20~23行で各最大値を抽出し、C列に代入する ・最大値に紐づく日付をD列に代入する ・D列の日付が入ったセルを改行し、 2行目に"(曜日)"を入力する <現在のExcelデータ詳細> A20:"処理1" A21:"処理2" A22:"処理3" A23:"処理4" B19~AF19:日付 B20~AF23:任意の数字 C31:処理1の最大値 C33:処理2の最大値 C35:処理3の最大値 C37:処理4の最大値 D31、D33、D35、D37:日付 L(曜日)を入力予定 最大値に紐づく日付をD列に代入するところで 躓いています。 ご教示いただけないでしょうか。 現在のコードは下記の通りです。 Sub 最大値の取得() Dim max As Long Dim row As Integer Dim column As Integer For row = 20 To 23 max = 0 For column = 2 To 32 If Cells(row, column).Value > max Then max = Cells(row, column).Value End If Next Cells((row - 20) * 2 + 31, 3).Value = max For i = 4 To 1 Step -4 '編集中 Cells((row - 20) * 2 + 31, 4).Value = Cells(row - i, column - 1) '編集中 Next End Sub

専門家に質問してみよう