• ベストアンサー

最小値を求める方法

VB初心者です。宜しく御願いします。 VB6で、最小値を求める方法ってありますか? 変数3つに値が入っていて、そのうちのいずれが最小値なのかを求めたいのです。 もっと言えば、「0(ゼロ)」を除いて最小値を求めたいのです。 なにぶんVBを初めたばかりで、分かりません。 どなたか、ご教授頂ければと思います。宜しくお願い致します。

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

  • ベストアンサー
  • hanka2
  • ベストアンサー率38% (15/39)
回答No.4

面白そうなので汎用関数を作ってみました。 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

Mark0817
質問者

お礼

ありがとうございます。 関数まで作って頂いて恐縮です。 勉強になりました。

その他の回答 (4)

  • hanka2
  • ベストアンサー率38% (15/39)
回答No.5

#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

Mark0817
質問者

お礼

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

  • nac03056
  • ベストアンサー率48% (203/419)
回答No.3

素で打ってますので文法等心配ですが、質問通りで考えるならこんな感じでは? 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 これならどうでしょう。

Mark0817
質問者

お礼

ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。 勉強になりました。

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

こんなんの次のロジックでやるのは常識。 第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")などは、配列を指定とか、ファイルを読むとか色々だと思うが。

Mark0817
質問者

お礼

ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。 勉強になりました。

回答No.1

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とかが最低値なら検出されます。

Mark0817
質問者

お礼

ありがとうございます。 Excel関数みたいにMINとかないのですね。 こういう風にロジカル的にやらないといけないのですね。

関連するQ&A

専門家に質問してみよう