• ベストアンサー

エクセルVBAで分岐処理と繰り返し処理を使って最大値を求める方法

エクセルVBAを使って列に書かれている数値の中からFor~Next、もしくはDo~Loopの繰り返し処理とIf文などの分岐処理を使ってA列の中に無造作に書かれている数値から最大値を求めることはできるのでしょうか? たとえば A 12 56 -3 85 -18 ・ ・ ・ などとA列に書かれているの文字の中から最大値=85と求めるようなものを分岐処理と繰り返し処理を使って作りたいのですが可能でしょうか? わかりにくい文章で申し訳ありませんがアドバイス等くれると助かります。

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

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

#3です。 >最大値=~に追加して最大値が何行目にあるのか求めて一緒に表示する場合はどうしたらよいのでしょうか? そのための情報を保持する変数を1つ持ちます。 私のコード例では If Cells(i, "A") > mx Then mx = Cells(i, "A") を If Cells(i, "A") > mx Then mx = Cells(i, "A") Mgyo=i End If として、今回のデータが今までの最大で有るとき、mxを変えた都度、Mgyoもその行のiで変えておく。 始めの方の mx = Cells(2, "A") もMgyo=2を加える。 最後の Cells(i + 1, "A") = "最大値= " & mx の下へ Cells(i + 2, "A") = "最大値の行= " & Mgyo の行をを加える。

britzbie
質問者

お礼

再び回答ありがとうございます。 コードを見ると納得できるんですがなかなか自分だけで思ったとおりに組むのは難しいですね。 今度は配列を使ったやり方等やってみたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (5)

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

こんばんは。 #4 の回答者です。 >ひとつ組むのにも多くのやり方があって勉強になりました。 本当は、そんなことはないはずです。変数名は様々(注1)であっても、ワークシートの関数を使わない方法としての解法は、微妙な違いはあっても、ほどんど、ひとつしかないと思います。今回、ご質問の本来の目的が書かれていませんので、一般的な問題として考えれば、常識的な範囲のエラーへの対処を考えなくてはなりません。 私は、VBAを始めて、6~7年経ちますが、本来のVBのコーディングの勉強が足りないせいか、今回のような問題に出会うのは初めてです。VBAではなく、VBの範囲で出てそうな内容です。そして、非常にミスをしやすいコードだというしかありません。 *注1:(一般公開されていませんが、ある程度の表記ルールはあります--ハンガリアン表記法は現在は一般的ではありません) こういうデータを使ってやってみてください。 A列(A1~A10) ------------------------------------------- -10 -2 -6 -17   ( A5:=[全角空白]) -8 #N/A ( A7:=NA() ) -4 -15 -19 ------------------------------------------- 以下のコードは、一列でしかできませんがワークシート関数を使った例です。そのまま、Max関数は使えません '------------------------------------------- Sub TestMacro2()   Dim ar As Variant   Dim mx As Double   Dim rw As Variant   With ActiveSheet   ar = WorksheetFunction.Transpose(.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Value)   For i = LBound(ar) To UBound(ar)     If Not IsError(ar(i)) Then       ar(i) = ar(i)     Else       ar(i) = ""     End If   Next i   End With   mx = WorksheetFunction.Max(ar)   On Error Resume Next   rw = WorksheetFunction.Match(mx, ar, 0)   If rw = 0 Then     rw = "ErrNull"   End If   On Error GoTo 0   If IsNumeric(rw) Then     MsgBox rw & "行目: " & mx   Else     MsgBox rw   End If End Sub '-------------------------------------------

britzbie
質問者

お礼

わざわざどうもありがとうございました。 まだ知らないことがたくさんあるのでこれから少しずつ覚えていこうと思います。 またわからないことがあったらよろしくお願いします。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 うっかり間違うところでした。数値が無い場合と、検索される数値が、空の場合は、0と扱われます。ですから、数値自体が、全部がマイナス値ですと、空白値が最大値となって、0になってしまいます。 なお、IsNumeric は、IsError と同じ意味ですから、あまり組み合わせには扱えません。これは、VBA1年ぐらいのレベルでは、及第点は取れそうにもありません。なかなか難しいと思います。もし、問題集でしたら、きちんと、ポイントがクリアされているか、解答と比較してみたらよいと思います。 >最大値=~に追加して最大値が何行目にあるのか求めて一緒に表示する場合 '------------------------------------------- '標準モジュールのみ '------------------------------------------- Sub MacroTest1()   Dim i As Long   Dim Mx As Variant   Dim n As Long   For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row     If IsNumeric(Cells(i, 1).Value) Then       If Cells(i, 1).Value <> "" _        And (IsEmpty(Mx) Or Cells(i, 1).Value > Mx) Then         Mx = Cells(i, 1).Value         n = i       End If     End If   Next i   MsgBox n & "行目:" & "Max =" & Mx End Sub '------------------------------------------- Mx を、Double 型などの数値型の場合は、初期値に仮の最小値を入れていないといけないかもしれません。

britzbie
質問者

お礼

回答ありがとうございます。 一応目的としていたものは組めました。 ひとつ組むのにも多くのやり方があって勉強になりました。ありがとうございます。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

この問題は、プログラムやBASICまたはアルゴリズムの解説書・教科書のまず始めに例題で出る問題だよ。どのようにしてVBの勉強を始めたのかな。 出来るだけ、多数の変数や配列にデータを溜め込まないで処理する、昔の人(コンピュタ利用草創期、メモリが少なかった)の知恵が入っている点を注意。 セルデータの合計を出すロジックと相通ずるところあり。 標準モジュールに Sub test01() d = Range("A65536").End(xlUp).Row MsgBox d mx = Cells(2, "A") For i = 3 To d If Cells(i, "A") > mx Then mx = Cells(i, "A") Next i Cells(i + 1, "A") = "最大値= " & mx End Sub 例データ 数 12 56 -3 85 -18 最大値= 85 ーー 質問のデータの「A」は列番号と解釈した(データかどうか紛らわしい)。セルに文字列も有るなら、IsNumericなどを咬ます必要が有る。

britzbie
質問者

お礼

回答ありがとうございます。 最近になってVBに触れるようになりまだ全然初心者なのでこれからもっと勉強したいとおもいます。 最大値=~と隣に出すことも教えていただきためになりました。 また質問ですいませんが最大値=~に追加して最大値が何行目にあるのか求めて一緒に表示する場合はどうしたらよいのでしょうか?

すると、全ての回答が全文表示されます。
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

A列に値がまったく無い場合とか、数字以外しかない場合なども考えると、ちょいと面倒ですね。 数値が無い場合は、Mx(=最大値用変数)はEmptyのまま、数値があればその中の最大値になります。 Sub test() Dim rw As Long, Mx As Variant, tmp As Variant For rw = 1 To Cells(Rows.Count, 1).End(xlUp).Row  tmp = Cells(rw, 1).Value  If tmp <> "" And IsNumeric(tmp) Then   If IsEmpty(Mx) Or Mx < tmp Then Mx = tmp  End If Next rw MsgBox ("MAX=" & Mx) End Sub

britzbie
質問者

お礼

回答ありがとうございます。 A列には数字だけということを書き忘れてしまいました。

すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

以下のマクロでいかがでしょう Dim m_Max As Integer, i As Integer m_Max = 0 For i = 1 To 10 If m_Max < Range("A" & i).Value Then m_Max = Range("A" & i).Value End If Next i Range("B1") = m_Max ちなみに関数だとMAX関数が使えます =MAX(A:A)

britzbie
質問者

お礼

回答ありがとうございます。 これをヒントにしてきちんと最大値を出すことが出来ました。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A