• ベストアンサー

EVCEL VBA での最小値の検索

EVCEL VBAで飛び飛びの複数の指定したセル群から最小の値を持つセルのアドレスを抽出する記述を教えてください。 たとえば、あらかじめ指定したA2とB3とE5のセルの値のうち最小の値を持つセルの値とアドレスを取得する記述を教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >あらかじめ指定したA2とB3とE5のセルの値のうち最小の値を持つセルの値とアドレスを取得する記述を教えてください。 本来は、「あらかじめ指定したセル」に、きちんとした法則があれば、関数で可能なような気がします。たぶん、「あらかじめ指定したセル」は、名前定義を行うつもりなのでしょうね。だから、以下のSelection は、仮に、ということにしてください。 '-------------------------------------------- Sub FindMinimum()   Dim myRng As Range   Dim c As Range   Dim minVal As Double   Dim myFirstAddress As String   Dim buf As String     If TypeName(Selection) <> "Range" Then Exit Sub   Set myRng = Selection '名前定義の場合は、ここから   If WorksheetFunction.Count(myRng) = 0 Then MsgBox "範囲を指定してください。", vbCritical: Exit Sub   minVal = WorksheetFunction.Min(myRng)   Set r = myRng.Find(minVal)   With myRng    Set c = .Find(What:=minVal, LookIn:=xlValues, LookAt:=xlWhole)    If Not c Is Nothing Then      myFirstAddress = c.Address      Do       buf = buf & ", " & c.Address       Set c = .FindNext(c)      Loop Until c Is Nothing Or c.Address = myFirstAddress    End If   End With   MsgBox minVal & ": " & Mid$(buf, 2), , "最小値とアドレス"   Set myRng = Nothing End Sub

try2003
質問者

お礼

大変ご丁寧にアドバイスありがとうございます。 これで悩んでいたことがほとんど解決したと思います。 どうもありがとうございます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

Sub test() Dim sh As Worksheet Set sh = Worksheets("Sheet1") x = Application.WorksheetFunction.Min(sh.Range("a1"), sh.Range("c3"), sh.Range("d5")) MsgBox x End Sub をご参考に。 セル指定のニーズやパターンが質問から良くわからないが、プログラムの中に入れられるなら上記。 Cells(i,j)の形ででRangeを相対化できます。

try2003
質問者

お礼

大変参考になりました。最小値はこれで取得できましたが、アドレスが取得できなかったので、BLUEPIXYさんの構文と組み合わせてみてやってみます。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

CTRL+で飛び飛びの範囲を指定してマクロを呼び出すとして 概ね、こんな感じ Public Sub Sample() Dim x As Range, min As Range, minValue Dim wk As String, a, i 'minValue は、指定した範囲の最小値、空白セルが有る場合は0 minValue = Application.WorksheetFunction.min(Selection) wk = "" For Each x In Selection If minValue = x.Value Then wk = wk & x.Address & "," '同一の最小値が有る場合があるのでアドレスを集める End If Next If wk <> "" Then wk = Left(wk, Len(wk) - 1) '最後のカンマを取り除く End If a = Split(wk, ",") 'アドレスの集まりを配列にする For i = 0 To UBound(a) Debug.Print a(i) '配列で取り出す(テストプリント) Next End Sub

try2003
質問者

お礼

大変に長い構文例を作成していただきありがとうございました。 私の質問がわかりにくかったと思いますが、最小値のアドレスは取得できましたが、その値が取得できませんでした。 この構文を参考に研究してみます。 ありがとうございました。