• 締切済み

指定範囲の条件に合致する順位

EXCELのVBAで以下のことをやりたいのですが、分かりません。 アドバイス頂けますでしょうか。 例として、1から40行固定の表があります。A、B、C、D列とあり、 A列は数値が必ず入っているセル(1~40)、 B列は時間のシリアル値で、値が入っているセルと入っていないセルの混在、 C列は文字列で値が必ず入っているセル、 D列は数値で、、値が入っているセルと入っていないセルの混在、という表があるとします。 この時に、 「”Bに値が入っていて、かつ、Dに値が入っていない行”の、”B列のトップ3”の、AとBのデータ」が 欲しいのですがどのようにしたらいいか分かりません。 お願いいたします

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.6

ANo.2です。 他の方の回答にもありますが、別シートにコピーしてからやればいいです。 以下のサンプルでは、Sheet2の101行目以降にコピーしてANo.2と同様のソートをして、結果をSheet2の先頭に貼り付けています。 ユーザフォームには、Sheet2のA2:A4とB2:B4の内容を表示させればよいでしょう。 Sheet2を見せたくないなら非表示にしておきましょう。 Sub Sample()   With Sheets("Sheet2")     '-----Sheet2の101行目以降にコピー     .Cells.ClearContents     Sheets("Sheet1").Range("A1:D41").Copy .Range("A101")     '-----Sheet2でオートフィルターを掛ける     .Range("A101:D141").AutoFilter     .Range("$A$101:$D$141").AutoFilter Field:=4, Criteria1:="="     .AutoFilter.Sort.SortFields.Clear     .AutoFilter.Sort.SortFields.Add Key:=.Range("B101:B141"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers     With .AutoFilter.Sort       .Header = xlYes       .Orientation = xlTopToBottom       .Apply     End With     '-----フィルタの結果をSheet2のA1にコピー     .Range("A101:D141").Copy .Range("A1")     .Range("A101:D141").AutoFilter   End With End Sub B列の時間のトップ3が早い時間のトップ3なのか遅い時間のトップ3なのかわからなかったので、「早い時間(昇順)」にしてあります。 降順にする場合は、Order:=xlAscending → Order:=xlDescending と、変更してください。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.5

>説明不足でしたが、そのトップ3の値をユーザーフォーム上に表示させたいのでVBAでやりたいのですが。 ユーザーフォームに表示したいなら、単純にその数式セルの値をテキストボックスなどに代入するだけでよいと思います。 ちなみに、VBAで対応する場合でも、すべてマクロコードで対応するのではなく、パフォーマンスの優れた関数などを併用して(隠しシートに記載して)、その値を取得するほうが実戦的にも有効な方法です。

  • nao-y
  • ベストアンサー率58% (111/190)
回答No.4

> これですと実際のシートの表示が変わってしまいますよね? > シートの表示を変えずに、トップ3のデータだけ欲しいのですが。。可能でしょうか? シートをコピーして、コピーしたシートで作業して、終わったらシートを削除 すれば良いと思います。

  • nao-y
  • ベストアンサー率58% (111/190)
回答No.3

横ですみません。 > 頂いた方法を表示上は変えずVBAで可能でしょうか? 動作をマクロ記録されればわかると思います。 VBAならもう少し簡潔に書けそうですね。 Range("A1").Currentregionに対して 1.B列をKeyに昇順に並び替え 2.オートフィルタでD列空白が空白のセルのみ表示 3.結果として取得できるセルの上から3行のA,B列を表示 という感じでしょうか。

demenori
質問者

補足

ありがとうございます。 これですと実際のシートの表示が変わってしまいますよね? シートの表示を変えずに、トップ3のデータだけ欲しいのですが。。可能でしょうか?

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

オートフィルタで出来ます。 A:D列の1行目には項目名が入っているものとします。 1.A:D列を選択してフィルタを掛けます。 2.D列のフィルタリング条件を空白にします。これでD列が空白の行だけが表示されます。 3.次にB列を降順、または昇順の条件でフィルタリングします。 これでお望みの順番に並んだデータが出来たはずです。

demenori
質問者

補足

ありがとうございます。 説明不足でしたが、そのトップ3の値をユーザーフォーム上に表示させたいのでVBAでやりたいのですが。 頂いた方法を表示上は変えずVBAで可能でしょうか?

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

トップ3のデータを表示するだけなら、関数で対応するほうが簡単かもしれません。 トップ3の意味が時間が大きい順に3つという意味でそのB列の時間を表示したいなら、例えばG2セルに以下の式を入力して下方向に3つオートフィルしてください(セルの書式は時刻にしてください)。 =LARGE(INDEX(($B$1:$B$40<>"")*($D$1:$D$40="")*$B$1:$B$40,),ROW(A1)) 対応するA列のデータを表示するにはF2セルに以下の式を入力して下方向にオートフィルしてください。 =INDEX(A:A,MAX(INDEX(($B$1:$B$40<>"")*($D$1:$D$40="")*($B$1:$B$40=G2)*ROW($B$1:$B$40),)))

demenori
質問者

補足

ありがとうございます。 説明不足でしたが、そのトップ3の値をユーザーフォーム上に表示させたいのでVBAでやりたいのですが。 頂いた方法を表示上は変えずVBAで可能でしょうか?

関連するQ&A

  • 範囲の合計が条件を満たす数を数えたい

       A列    B列   C列   D列 1行  5     3 2行 3行       8 4行  6     4    2 5行  3 60行 上記の様な表で同じ行の各セルの数値の合計 が8以上の行の数を数えたいのです。 (A1+B1+C1+D1が8以上かどうかの以下60行目まで繰り返し) 例では3個 一列ならばCOUNTIF($A$1:$A$60,">=8")でOKなのでしょうが‥ 作業列を用いずに出来ないものでしょうか?お助け下さい。

  • エクセルの表で条件を指定しての整列

    エクセルの表で条件を指定して整列させようとしています。 よろしくお願い致します。 画像のようにA列の商品名に、B列、C列の2つの条件が付いた商品がありD列に在庫数を入れています。 はじめは「画像C表」のように規則を設定したものに従って並んでいたのですが、操作ミスがあり「画像A表」のように行をバラバラにしてしまいました。 A列の商品名、B列、C列の条件とD列の在庫数の横の並び(1行づつの並び方)は元のままです。 A列の商品名、B列、C列の条件の記入内容は半角全角文字様々です。 「画像B表」のような在庫数だけ入っていない表は存在しています。 これを「画像B表」の整列規則に従って元のように並べ直すのに苦労しています。 例えば定型の表である「画像B表」のA2セルとB2セルとC2セルの値が共通の行の「画像A表」のD2セルの値を「画像B表」のD2セルに並べるという方法が出来ればと思うのですが数式をどう設定してよいのか判らない常態です。 実際の商品数(行数)は10,000程あり日常扱っている商品のためかなり焦っております。 確実に元に戻せればどのような方法でも結構です。 初歩的な内容かもしれませんが、よろしくお願い致します。

  • エクセルの条件範囲と合致したもの

    エクセルの条件範囲と合致したもの こんにちは。http://okwave.jp/qa/q5924759.htmlで質問していたのですが、 うまくいかないので、教えてください。 たとえば、同じシートで、 A1/B1/C1/D1・・・・・・←セル列 (スラッシュはセルだとします) A /1 /A /1 B /2 /B /2 D /3 /C E /4 /D /3 G /5 /E /4 I /6 /F / このように、列同士(A1の列とC1の列)が同じものがあった場合、A1の隣のセルであるB1のセルの数字をA4のセルに記載したい場合の数式を教えていただきたいです。D1に新たに追加されたものに関しては空白をしたいのです。 =IF(COUNTIF($A$1:$A$6,$C$1:$C$6)=0," ",IF(COUNTIF($A$1:$A$6,$C$1:$C$6)=1,B1)) この式を考えましたが、D1の列のDの部分の数字が"4"と記載されてしまい、本来なら"3"を 記載したいのですが、ずれてしまいます。 たぶん、条件の範囲のものとIFを合体させた数式になるのかなって思うのですが、 もし数式を教えていただければ幸いです。 何度も質問してすみません。。。よろしくお願いいたします。

  • Excelの2個の条件に合致した数値を入力

    B.xlsのA列とA.xlsのB列、B.xlsのC列とA.xlsのD列の行がマッチしたらA.xlsのF列、H列の数値をB.xlsのD,E列に添付の下図のように数値を入力したいのですがVBAコードが解る方宜しくお願いします。(同じく関数の方もわかればお願いします)

  • Excel 範囲内で条件を満たす異なる列の合計

    範囲内で条件を満たすセルで、異なる列の値を合計したい。 A1からA5に{10,20,30,40,50}という値が B1からB5に{0,1,2,3,4}という値が C1からC5に{5,6,7,8,9}入っている事とします。 A1:A5の範囲で複数の条件をつけます。 B列ではA列のセルの値が15<A<35となる、A2とA3と同じ行であるB2とB3の値 C列ではA列のセルの値が25<A<45となる、A3とA4と同じ行であるC3とC4の値 全部でB2,B3,C3,C4のセルの値を合計を返すセルを作成したい。 この場合目的のセルが返す値は1+2+7+8で18となる。 補助行を作ってでも構いませんので、このような加算が可能とするセルの作り方はないでしょうか。 Excel2000を使用しています。どうかよろしくお願いします。

  • 複数指定セル値と合致したセル値を返す

    A,B,C列に添付の値が入力されておりセルE2の値とF2~F7の値が両方一致したものがA,B列にあればC列の値をG列に順々に入力していきたいのですが。 どなたか関数が解る方、欲をいえばVBAコードが解る方ご教授願います。

  • エクセル ある数が含まれる範囲を調べ、その隣のセルの数を取得する

    聞きたい内容がうまく説明できないので、具体例を書かせていただきます。 下のような表があり、それとは別に1つ数値を入れるセルと結果を表示するセルがあります。 入力セルに例えば105を入れたとき、105は101(A列)~110(B列)の間の数値なので、その行のC列の値である3を結果セルに表示させたいのですが、どのようにすればよいでしょうか。 A列   B列   C列 1 100 0 101 110 3 111 120 2 121 130 5 131 140 2 141 150 2 151 200 3 201 1000 0

  • VBAで2つの条件に合致するものを、表から抽出する方法を教えてください

       A     B   C    D    E ・・・ 1        0  10%  20%  30% 2  0     0   1   1.2  1.6 3 100以上  2  2.3  2.5  2.6 4 200以上  3  3.1  3.4  3.8 5 300以上  3  3.2  3.5  3.7 6 400以上  4  4.3  4.5  4.8 上記のような表がシート1にあります。 A列は売上、1行には前年比があり それぞれの条件に合致する係数を取得したいのですが シート2のA1セルに「売上」、A2セルに「前年比」を入力することで B1セルに係数が反映するようにはできるでしょうか? 例えば、A1「250」A2「13」と入力すると B1「3.1」と反映させたいのですが… 他の作業もあり、できればVBAで作成したいと思っています。 よろしくお願いいたします。

  • 【Excel】日付を条件のひとつに指定してデータ集計

    Excel2003を使用しています。 A列(A7セル以下) → 日付[yy/mm/dd] B列(B7セル以下) → 文字列 C列(C7セル以下) → 文字列 D列(D7セル以下) → 数値 が入力されている表があります。 例えば、A列の日付が 06/09/29 以前で、かつ、B列にある特定の文字(仮にえくせるとします)が含まれるD列の数値を集計したいのですが、どのようにすればいいでしょうか? 関数で試してみたのですが、うまくいかなかったので、質問させていただきました。 よろしくお願いします。

  • EXCEL 2003で条件に合った合計を求めたい

    ______A ____B____ C_____D 1___111___ 1 ___10___ 60 2___111___ 2 ___10 3___222___ 2 ___10 4___333___ 1 ___10 5___333___ 2 ___10 6___333___ 3 ___10 7___444___ 1 ___10 8___444___ 3 ___10 9___555___ 1 ___10 Excel 2003環境において、上記A1:C9を対象に関数で下記条件を元に数式をD1に入力して値を求めたいです。 条件: A列の同じ値のセルを一つのグループとし、かつその中で、B列で1から始まる連番となっているグループを対象にC列のセルを合計する。 上記のセル範囲で条件に合う行は1,2,4,5,6,9行目で答えは60になります。 SUMPRODUCT関数やIF関数を併用してみましたが、うまく作ることができませんでした。 なんとか作業列やVBAを用いずに一つの数式で済ませたいです。 よろしくお願いします。

専門家に質問してみよう