- ベストアンサー
最小値を求める方法
VB初心者です。宜しく御願いします。 VB6で、最小値を求める方法ってありますか? 変数3つに値が入っていて、そのうちのいずれが最小値なのかを求めたいのです。 もっと言えば、「0(ゼロ)」を除いて最小値を求めたいのです。 なにぶんVBを初めたばかりで、分かりません。 どなたか、ご教授頂ければと思います。宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
面白そうなので汎用関数を作ってみました。 0(ゼロ)は除くって条件ですから汎用じゃないですが(笑) 1.引数は幾つでも構いません。(VBの制限内) 2.文字型でも数値と判断できれば比較の対象になります。 3.数値でなければ比較の対象から外れます。 4.判定不能の場合はEmpty値が返ります。 使用例 Dim Ans As Variant Ans = Min(hoge1, hoge2, hoge3 …) if IsEmpty(Ans) then MsgBox "判定不能" Else MsgBox "最小値は" & CStr$(Ans) & "です" End If 以下、汎用関数 Function Min(ParamArray Arg()) As Variant Dim Idx As Long, Evl As Variant, Rsl As Variant For Idx = LBound(Arg) To UBound(Arg) If IsNumeric(Arg(Idx)) Then Evl = Evaluate(Arg(Idx)) If Evl <> 0 Then Select Case True Case IsEmpty(Rsl): Rsl = Evl Case Rsl > Evl: Rsl = Evl End Select End If End If Next Min = Rsl End Function
その他の回答 (4)
- hanka2
- ベストアンサー率38% (15/39)
#4の改良版(笑) Function Min(ParamArray Arg()) As Variant Dim Idx As Long, Evl As Variant, Rsl As Variant For Idx = LBound(Arg) To UBound(Arg) If IsNumeric(Arg(Idx)) Then Evl = Evaluate(Arg(Idx)) Select Case True Case Evl = 0 'この行コメントアウトで汎用関数 Case IsEmpty(Rsl): Rsl = Evl Case Rsl > Evl: Rsl = Evl End Select End If Next Min = Rsl End Function
お礼
ありがとうございます。 助かりました。
- nac03056
- ベストアンサー率48% (203/419)
素で打ってますので文法等心配ですが、質問通りで考えるならこんな感じでは? min=0 if a<>0 then min=a if b<>0 and min>b then min=b if c<>0 and min>c then min=c これで、min に最小値が入ります。また min に 0 が残っているときは全ての値が 0 だったということです。と、ここまで打って a が 0 で b c ともプラスの時に正しい結果が出ないことに気付きました。 min=0 if a<>0 then min=a elseif b<>0 then min=b elseif c<>0 then min=c endif if b<>0 and min>b then min=b if c<>0 and min>c then min=c これならどうでしょう。
お礼
ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。 勉強になりました。
- imogasi
- ベストアンサー率27% (4737/17069)
こんなんの次のロジックでやるのは常識。 第1レコードを最小値にするm=r(1) 第2レコードから終わりレコードまで If R(i)<m then m=r(i) End If を行う ーー >0(ゼロ)」を除いて最小値を求めたいのです If R(i)=0 then 上記の処理をスキップ ーーーー エクセルVBAでやると(エクセルではMIN関数が使えるが、別にして) Sub test01() d = Range("a65536").End(xlUp).Row 'データ数 m = Cells(1, "A") For i = 1 To d If Not (Cells(i, "A") = 0 Or Cells(i, "A") = "") Then If m > Cells(i, "A") Then m = Cells(i, "A") End If End If Next i MsgBox m End Sub 実際は Cells(1, "A")などは、配列を指定とか、ファイルを読むとか色々だと思うが。
お礼
ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。 勉強になりました。
- himajin100000
- ベストアンサー率54% (1660/3060)
Option Explicit Function Minimum(arr() As Double) As Double Dim i As Integer Minimum = 0 For i = 0 To UBound(arr) If arr(i) <> 0 Then Minimum = arr(i) Exit For End If Next i If Minimum = 0 Then Exit Function End If For i = 0 To UBound(arr) If (Minimum > arr(i)) And (arr(i) <> 0) Then Minimum = arr(i) End If Next i End Function Sub main() '変数の値を配列に格納するのは自分で書いてください Dim a(5) As Double a(0) = 0 a(1) = 10 a(2) = 8 a(3) = 4 a(4) = 7 a(5) = 1 If Minimum(a) <> 0 Then MsgBox ("0を除く最低値:" & CStr(Minimum(a))) Else MsgBox ("全ての値が0だった。") End If End Sub '条件が「0でない」なので-8とかが最低値なら検出されます。
お礼
ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。
お礼
ありがとうございます。 関数まで作って頂いて恐縮です。 勉強になりました。