dポイントプレゼントキャンペーン実施中!

エクセルVBAを使って列に書かれている数値の中からFor~Next、もしくはDo~Loopの繰り返し処理とIf文などの分岐処理を使ってA列の中に無造作に書かれている数値から最大値を求めることはできるのでしょうか?
たとえば

12
56
-3
85
-18



などとA列に書かれているの文字の中から最大値=85と求めるようなものを分岐処理と繰り返し処理を使って作りたいのですが可能でしょうか?
わかりにくい文章で申し訳ありませんがアドバイス等くれると助かります。

A 回答 (6件)

#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
の行をを加える。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/11 16:48

こんばんは。


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

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

お礼日時:2009/07/14 03:44

こんにちは。



うっかり間違うところでした。数値が無い場合と、検索される数値が、空の場合は、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 型などの数値型の場合は、初期値に仮の最小値を入れていないといけないかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/11 16:45

この問題は、プログラムや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などを咬ます必要が有る。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/09 23:19

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

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

お礼日時:2009/07/09 23:14

以下のマクロでいかがでしょう



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

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

お礼日時:2009/07/09 23:13

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