- 締切済み
配列の中の最大値とそのインデックス番号を取得する方法
Visual Basicを学んでまだ10日です。 いま、配列中の最大値と、そのインデックス番号を取得する方法を考えています。 なるべく計算処理に時間が掛からない方法で行いたいのですが、なにか良い方法はありますか? For j = 0 To 100 For p = 0 To 415 scan1(p) = Sheets("Sheet1").Cells(j, p + 2) scan2(p) = Sheets("Sheet2").Cells(j, p + 2) Next p correlation(j) = Application.WorksheetFunction.Correl(scan1(), scan2()) Erase scan1 Erase scan2 Next j で、この後に correlation(j)配列の最大値とそのインデックスを求めたいです。 よろしくお願いします。 ちなみに、配列の中の値は、重複を含んでいません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tom11
- ベストアンサー率53% (134/251)
シートを使った例を上げます。 シートのデータに図の様にデータを並べ、降順にソートして 一番上が、その最大値になります。 Public Sub f() Range("A1:B10").Select Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Selection.Sort Key1:=Range("B2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Debug.Print Cells(2, 1).Value, Cells(2, 2).Value End Sub
- DOUGLAS_
- ベストアンサー率74% (397/534)
配列要素の最大値を求める方法は、[ANo.1] osamuy さんがお書きのように For ~ : If ~ Then ~ : Next で回す方法が通例になっているようですが、私には理由が分かりません(論拠を見つけられません)。 http://okwave.jp/qa/q4955645.html [ANo.5] Wendy02 さんが >配列の最大値を取る方法には、裏技があって、 >ふつうは、1次元配列で、ワークシートのMax を取ります。 と書いていらっしゃいます。 お示しの例でしたら、correlation は 倍精度浮動小数点数型 (Double) の 1次元配列ですから、普通に [Application.WorksheetFunction.Max 関数] で求められると存じますが。。。 With Application.WorksheetFunction [最大値] = .Max(correlation) [インデックス] = .Match([最大値], correlation, 0) End With ちなみに、Sheet3 A1:A100 に「correlation(1 To 100)」を配置して、 =MAX(A:A) =MATCH(MAX(A:A),A:A,0) を何度も計算させてみましたが、VBA の「Application.WorksheetFunction.~」の値と一致しました。 なお、「Cells(j, p + 2)」という記述がありますので、「For j = 0 To 100 」の部分は「For j = 1 ~」かと存じます。 なおなお、「Visual Basicを学んで~」とお書きですが、「Visual Basic for Application(VBA)」ですよね。
- osamuy
- ベストアンサー率42% (1231/2878)
最大値を覚えておく変数corr_maxと、j_maxを定義・適切に初期化しておいて、 correlation(j)を計算した直後に、 if correlation(j) > corr_max then corr_max=correlation(j): j_max=J ――としておくとか。
お礼
質問に答えてくださったお二方、ありがとうございました!! 質問を書いてから、やっぱり自分で考えてやってみたら、できました!そして今、この質問回答を見てみるとDOUGLAS_さんが書いている方法と同じでした! 自信がつきました。 ご指摘も含め、ありがとうございます。