• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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/17068)
回答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

  • EXCEL VBA における個数のカウント方法について

    すいませんEXCEL VBAについて質問があります。     A列   1行  みかん 2行  みかん 3行  (空欄) 4行  みかん 5行  ぶどう 6行  みかん 7行  みかん 8行  ぶどう 9行  (空欄) ・ ・ 50行 A列は「みかん」若しくは「ぶどう」の値又は空欄のいずれかになっている。 空欄は無視して(1行~4行はみかんが3つ連続で並んだと考える)、 50 行までの間に「みかん」が最大で何回連続で並んだかを調べ、その最大の値をB1セルに入れる。 これをVBAで処理するにはどうしたらいいのでしょうか。 For ~NextとIfで条件分岐 というような形になるのかなと思ったのですが どうしても思い浮かびません。 どうぞよろしくお願いします。

  • エクセル VBA do loop if then

    いつもお世話になっております。 エクセルVBAからの質問です。 do until ----- if --- then ---- ---- ---- loop else --- loop このように loop とか next が二個になるのはエラーらしいですが、 ○○があれば××を通して△△へループする ○○がなければ、すっ飛ばして△△へループする このような分岐をともなう繰り返しコードはどうやって作るとよろしいですか。 おっさんサラリーマンにも分かりやすくぷりーず。

  • Excel VBA 配列処理後の動作について

    Dim v As Variant             1.配列を使用して処理    v = (範囲)    処理      Range("A200").End(xlUp).Select    2.セルをA列最終行に移動 Do  If Selection = Range("A2") Then    処理    Exit Do  Else    処理    Selection.End(xlUp).Select  End if Loop 上記のように記述すると、配列処理の後の動作がうまくいきません。 セルは最終行に移動しているのですが、Do Loop では Selection は常に セルA2 として 認識されてしまいます。 If文の Selection を Selection.Address とするとうまく動作することを偶然見つけたので、 そちらで処理していくことにしましたが、なぜSelection のみでは期待通りに動作しないのでしょう? どなたかご教示いただけないでしょうか。 よろしくお願いいたします。

  • excel VBAの分岐の書き方について

    excel VBAの分岐の書き方について 列Aに、 ああ  いいい  うううう  ああ いいい ええ ・・・ のようなデータがあるとします。 このときにVBAのフォームで、 ああ いいい うううう ええ をチェックボックスで選ばせ、該当する行のみに処理を行いそれ以外には処理をしない、というプログラムを考えています。 どのように実装するのが正しい書き方でしょうか? 処理すべき行数は200行程度。ああ、いいい・・・等は10種類ほどで可変です。 in演算子で、配列をみれるような仕掛けがあるといいのですが。。。

  • VBAでの処理分岐方法を教えてほしいです

    VBAの分岐処理で悩んでおります。 誰かお助けお願いします。 A列に昇順で番号があります。 1 2 4 4 5 6 9 欠番や重複した数値があります。 やりたいことは欠番箇所に行を挿入し、連番にしたいです。 この例で言うと、3行目に1行を挿入し番号を3と入れる、6行目に2行挿入し7,8と連番にする。 連番になった後に、重複した数値に色を付けます。 以下私が作成したコードです。callで呼び出す予定です。 Sub 欠番判定数式() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 3) = "=if(iserror(if(A" & i & "-A" & i - 1 & ">1,""○"","" "")),"""",if(A" & i & "-A" & i - 1 & ">1,""○"","" ""))" Next End Sub Sub 行挿入() Dim c As Range, Target As Range For Each c In Range("C2:C" & Cells(Rows.Count, 1).End(xlUp).Row) If c = "○" Then If Target Is Nothing Then ''(1) Set Target = c Else Set Target = Union(Target, c) ''(2) End If End If Next c If Not Target Is Nothing Then Target.Select Selection.EntireRow.Insert , copyorigin:=xlFormatFromLeftOrAbove End Sub Sub 空白連番入力() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = "" Then Cells(i, 1) = (Cells(i, 1).Offset(1, 0).Value) - 1 End If Next End Sub Sub 番号重複確認() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Application.WorksheetFunction.CountIf(Range("$A$2:$A$" & Cells(Rows.Count, 1).End(xlUp).Row), Range("A" & i)) <> 1 Then Cells(i, 1).Interior.ColorIndex = 3 End If Next End Sub このコードを順に全て実行した時、1回目の処理で3行目と5行目に行挿入、そして番号が3と7と入力され連番に色が設定されます。 再度「欠番判定数式」を行い、次は8行目に行挿入し8と連番を入力させ処理を繰り返しさせたいです。 欠番は例として最高2個にしてますが、これから2個以上の可能性もあります。 一度全処理終了後、再度最初の処理(欠番判定数式)に戻り、欠番がある場合は行挿入させという処理を行わせ、欠番がない場合は次の処理に進めるという分岐方法を教えてほしいです。 よろしくお願いいたします

  • Excel VBA 条件分岐のスマートな書き方

    すみません。すごく初歩的な質問なのですが、 Excel VBAで以下のような条件分岐をさせたい場合、 もっとスマートな書き方できませんか? 命題 AとBに対して if not A then 処理X end if if not B then 処理Y end if if not(A and B) then 処理Z(この処理の中には処理Xと処理Yの結果が含まれている) end elseifを使った書き方が思い浮かばず、 同じことを何度も書いているようで、もっと上手に書けそうな気がしまして・・・ どなたかご教示頂けたらと思います。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • Do whileとFor文の脱出処理について

    はじめまして。 VBについて素朴な質問なのですが For…Nextから抜けるにはExit for を使いDo…Loopから抜けるにはExit Doを使用しますが以下の場合はFor文の中でExit doを使用するのは可能なのでしょうか? Do while(条件) for i=1 to 12 if 条件 then exit do end if 処理1 next i 処理2 loop 本来ならfor文の中ではExit forを使用しますがfor文はDo while文 の中に含まれていますのでExit doでも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。

  • EXCEL VBAでセルの値が数値のときに2を掛ける方法について

    すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。

  • 【VB】セルが空になるまで処理を繰り返したい

    Excel VBAを使用してです。 列Aにデータがずらっと入っています。 そのデータを列Bに、 Do while ~loop か Do until ~loopを使って データが無くなるまでコピーするという処理を書きたいのです。 VB歴が浅いためひらめきません。よろしくお願いします。m(__)m

専門家に質問してみよう