• 締切済み

エラー値を除く最大値を求めるには

VBA初心者です。  1  3  4 #DIV/0!  5  0 #DIV/0!  8 上記の列を指定してエラー値を除く上位3位の値を取りたいと思ってます VBAマクロでやるにはどうしたらいいでしょうか 調べましたがわかりませんでした教えてください。

  • keed
  • お礼率62% (10/16)

みんなの回答

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

ではVBAの一例です。 一旦配列に取り込み、大きい方から1~3位を表示します。 Sub test01() Dim myAr() Dim n As Long, i As Integer For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp)) 'A列の各データが If Not IsError(c.Value) Then 'エラーでなければ ReDim Preserve myAr(n) '配列に取り込む myAr(n) = c.Value n = n + 1 End If Next c For i = 1 To 3 MsgBox i & "位:" & Application.Large(myAr, i) Next i End Sub

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.3

#1のrukukuです 別解です。 「降順で並べ替え」を行うと、以下のようになります。 #DIV/0! #DIV/0! 8 7 4 3 1 0 エラーの部分を除いて「上から3つ」取ればOKです。 実際のプログラムの例を以下に示します。 Macro1を実行し後、Macro2を実行してください。 Macro1は「マクロの記録」を使用しただけなので、効率の悪いコードになっていますがご容赦ください。 Sub Macro1() Columns("A:A").Select Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin End Sub Sub Macro2() Dim Line Dim i Dim Max(3) Sheets("Sheet2").Select For Line = 2 To [A2].End(xlDown).Row If Not IsError(Cells(Line, "A")) Then i = i + 1 Max(i) = Cells(Line, "A") End If If i = 3 Then Exit For Next Line MsgBox Max(1) & Chr(13) & Max(2) & Chr(13) & Max(3) End Sub

keed
質問者

お礼

お礼遅くなってすいません とても詳しく教えていただきまして有難うございます。 うまくできました!! 感謝感謝します。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.2

訂正です 「重複がある場合」で ×:=IF(ISNA(G3),I2,G3) ○:=IF(ISNA(G3),H2,G3) です。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

はじめまして >VBA初心者です。 EXCELのVBAと想定して回答します。 (WordやAccessにもVBAがありますので) 重複がなければ、 質問の値がA2から順に下に入っているとして、 C2に =RANK(D2,D:D) D2に =IF(ISERROR(A2),"",A2) 以下、データが入っているオートフィル F2→1 F3→2 F4→3 としておいて G2に =VLOOKUP(F2,$C$2:$D$9,2,FALSE) 以下G4までオートフィルでできます。 重複がある場合にはさらに、 H2に =G2 H3に =IF(ISNA(G3),I2,G3) で、H3をH4にオートフィルです。 関数だけでできてしまいましたが、「マクロ」というならば、この関数をマクロで入力すればOKです。

関連するQ&A

  • 改ページ条件を簡単に設定する方法

    大変困っております。 データベースのある列を指定して、入っている値が変われば改ページという設定をしたいのですが、調べてもなかなか出てきません。いくつか答は見つかったのですが、VBAを書いて実現する方法ばかりで、初心者の私にはチンプンカンプンです。 なんとか、上記のしくみをマクロなどで簡単に実現する方法はないでしょうか?お願いします!!

  • エクセルVBAのDeleteキーによるエラー

    VBA初心者です。エクセル(2003)のVBAについて質問です。 セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、 入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。 下記のコードをシートモジュールに入力し、 標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。 A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると 隣のC列に結果が入力されるようにしたいのですが、 A・B列の値をDeleteキーで消去するとエラーになってしまいます。 BSキーで値を消去するとエラーは出ません。 Deleteキーでもエラーが出ない様にする方法はありますでしょうか。 どなたかご教授お願いします。 ----------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then If Target.Value <> "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_TRUE Case "A3" Call マクロ3_TRUE Case "A5" Call マクロ5_TRUE End Select ElseIf Target.Value = "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_FALSE Case "A3" Call マクロ3_FALSE Case "A5" Call マクロ5_FALSE End Select End If End If End Sub

  • Excel複数列の複数の条件を満たしたデータを抽出

    2列(N列,O列)に1~3の数字が入ってる行を、指定したsheetへ抽出させるVBAのマクロを 作成したいのですが、VBAが全く分からず困っています。 または、Excel上でも簡単に上記の事が出来るのでしたら、その方法も教えて下さい。

  • エクセルのマクロについて

    お世話になります。 エクセルで、列に入力された値が有る範囲を超えた場合、 その値のみを赤色に変換したいのですが、 どのようにマクロを組めばよろしいでしょうか。 VBAに関しては、全くの初心者ですので わかりやすく教えて頂ければ幸いです。

  • エクセル2007 エラー値の表示を違う文字に表示

    エクセル2007での質問です。      A      B      C  1   2      0      =A1/B1*100 (表示 #DIV/0!)  2   0      0      =A2/B2*100 (表示 #DIV/0!)  C列には上記のような数式を入れました。 すると表示はエラー値になるのですが、 C1 の表示を -  C2 の表示を 0 にしたい場合はどのような関数を入れればいいのでしょうか。 つまりA列の数字が1以上 B列 0 の場合、- 表示 A列、B列ともに 0 の場合、 0 表示 エラー値になったら文字入力していたのですが、さすがに面倒になってしまい・・・ 初心者な質問ですがよろしくお願いします。

  • VBAでのエラーです・・。

    最近VBAマクロを本を片手に勉強しています。シートを選択するVBAを作っていて次のような記述ができないのか考えています。 dim A as String A = "sheet2,sheet3" Sheets(Array(A)).select とやると、Arrayの行で「インデックスが・・・」というエラーで落ちます。Arrayを変数で指定することができないのですが・・。なにか記述に問題があるのでしょうか?(変数Aに"sheet2", "sheet3"と値が入るようにしても結果はNGでした・・。) 宜しくお願いします。

  • エクセルマクロでエラーの処理

    次のようなマクロを組みました。 1列目の値を2列目の値で割り、その答を3列目に表示するというものです。 Sub Macro1() ' On Error GoTo ErrRtn: R = 1 FLAG1: Do While Cells(R, 1) <> "" Cells(R, 3) = Cells(R, 1) / Cells(R, 2) R = R + 1 Loop End ErrRtn: Cells(R, 3) = "ゼロ割" R = R + 1 GoTo FLAG1 ' End Sub ゼロ割が発生したときのエラー処理として3列目に「ゼロ割」を表示させて次の行について処理を継続するようにしていますが、上記のプログラムだと全データのうち最初のエラーは思い通りになりますが、続けて処理をしていって2番目に発生したエラーではエラーメッセージが出て止まってしまいます。 どう直せばよいのでしょうか? なお、上記だと2列目がゼロであるか否かを先に判定してやればよいのですが、エラー処理の質問をしたいために例として上記のような簡単なプログラムをあげているものです。 よろしくお願いします。

  • worksheet_changeの一時無効化

    VBAエクセル初心者です。 セルの値を手入力変更すると赤字で表示されるようWorksheet_Changeメソッドを利用しています。 これをあるマクロ(Subプロシージャ)の実行中だけ無効にすることはできますか? 外部データを参照し列や行を削除や挿入して更新するマクロなのですが列を選択するとこのChangeメソッドにひっかかってしまい、エラーがでてしまいます。 何かよい方法はあるでしょうか・・・?

  • エクセルのマクロについて教えてください

    エクセルのマクロで教えてほしいのですが、たとえば、指定した範囲の中でK列の値が"1”のとき、列F~Kの値をクリアするマクロはどう組めばよいでしょうか? 逆に、指定した範囲の中でK列の値が"1”以外のとき、列F~Kの値をクリアするマクロもどう組めばよいでしょうか?

  • エクセル2013 マクロの最大値

    エクセル初心者です。セルをダブルクリックしたときに、最大値に+1の値をセルに自動入力したいのですが・・・。まず、シート1のC列とシート2のC列から最大値を探し、その値+1の数字を入力したいです。現在の時点で3、4、5の列にデータが入力されているのでC6をダブルクリックしたときに、マクロ実行されるようにしたいです。データは、増えていくのでC6は固定ではありません。C列の未入力のセルをダブルクリックしたときに、自動入力されるということです。 おわかりの方がいらしたら、ご教示お願いいたします。

専門家に質問してみよう