[[20190415095938]] 『探す対象が複数のセルにある場合、findでは何番目』(skyblue) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『探す対象が複数のセルにある場合、findでは何番目を示すかが不明』(skyblue)

 関数のMAXで最大値を見つけ、その行を知りたいのですが、最大値が複数ある場合に、2番目の最大値の行を選択します。
先頭からとか最後尾からデータを選ぶようにはならないでしょうか?何か良い方法が有れば教えてください。
マクロは(1)、データは(2)です。

(1)マクロ
Sub test14()
Set aa = ThisWorkbook.Sheets("memo")
行数 = 8
Set w = Range(aa.Cells(1, 9), aa.Cells(行数, 9))
myMax = WorksheetFunction.Max(w)
Set q = w.Find(myMax)
If Not q Is Nothing Then

    r = q.Row
End If
MsgBox q & " " & r
Stop
End Sub

(2)データ
100
45
34
8
100
43
8
100

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 Sub test()
     Dim x, rng As Range
     With Range("I1", Range("I" & Rows.Count).End(xlUp))
         x = Filter(.Worksheet.Evaluate("transpose(if(" & .Address & "=max(" & .Address & "),row(" & .Address & ")))"), False, 0)
     End With
     If UBound(x) = 0 Then
         '単一の場合
         Range("I" & x(0)).Select
     Else
         '複数の場合
         Range("I" & x(1)).Select  '<- 上から2番目
         Range("I" & x(UBound(x) - 1)).Select '<- 下から2番目
     End If
 End Sub
(seiya) 2019/04/15(月) 11:29

 早速の回答をありがとうございます。
中身が難解で即座には理解できないので、時間を頂いて検討させて頂きます。
取り急ぎお礼まで。

欲を言えば、元のマクロの改良例が有れば助かります。

(skyblue) 2019/04/15(月) 12:07


 質問を読み違えました...

 Set q = w.Find(myMax, w.Cells(w.Count))

 に変更してください。
(seiya) 2019/04/15(月) 12:21

 どうもありがとうございました。
理由は今後検証しますが、結果が出ました。
素晴らしい。

 実は、中身が分からないまま、ご提示いただいたマクロにsheet情報を入れテストしました。
ご回答いただいたマクロでは、最大値が存在する複数のセルから上から2番目、下から2番目の行を得られるようです。
 しかし、中間の行の情報を得ても、残りの行情報を得るためには後の処理が煩雑になるので、当方の案からの進捗が無く、次の質問を用意しているところでした。

 データ数が膨大で、関数で処理しないと長時間がかかるので、今回の回答は本当に助かります。
(skyblue) 2019/04/15(月) 12:45


 複数ある場合は上・下から2番目を取得と勘違いしました。

 Findメソッドは範囲の左上端(今回の場合、一番上)の次のセルから検索を始めます。
 なので、第二引数に範囲の右最下のセルを指定やると次のセル、すなわち左上端から検索します。
(seiya) 2019/04/15(月) 12:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.