プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

どうもありがとうございます。

お礼日時:2006/02/12 11:53

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を相対化できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/12 11:51

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
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2006/02/12 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!