エクセルVBAを使って列に書かれている数値の中からFor~Next、もしくはDo~Loopの繰り返し処理とIf文などの分岐処理を使ってA列の中に無造作に書かれている数値から最大値を求めることはできるのでしょうか?
たとえば
A
12
56
-3
85
-18
・
・
・
などとA列に書かれているの文字の中から最大値=85と求めるようなものを分岐処理と繰り返し処理を使って作りたいのですが可能でしょうか?
わかりにくい文章で申し訳ありませんがアドバイス等くれると助かります。
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
の行をを加える。
再び回答ありがとうございます。
コードを見ると納得できるんですがなかなか自分だけで思ったとおりに組むのは難しいですね。
今度は配列を使ったやり方等やってみたいと思います。
ありがとうございました。
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
'-------------------------------------------
わざわざどうもありがとうございました。
まだ知らないことがたくさんあるのでこれから少しずつ覚えていこうと思います。
またわからないことがあったらよろしくお願いします。
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 型などの数値型の場合は、初期値に仮の最小値を入れていないといけないかもしれません。
回答ありがとうございます。
一応目的としていたものは組めました。
ひとつ組むのにも多くのやり方があって勉強になりました。ありがとうございます。
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などを咬ます必要が有る。
回答ありがとうございます。
最近になってVBに触れるようになりまだ全然初心者なのでこれからもっと勉強したいとおもいます。
最大値=~と隣に出すことも教えていただきためになりました。
また質問ですいませんが最大値=~に追加して最大値が何行目にあるのか求めて一緒に表示する場合はどうしたらよいのでしょうか?
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
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)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
【エクセル】区切り位置で分割...
-
値の入っているセルのうち、一...
-
Excel関数:「0」を除いた標準...
-
ピボットで複数の区切りでグル...
-
エクセルの日付書式を一発置換...
-
エクセル 8ケタの数字から日数...
-
エクセルに入力された日付「S40...
-
Excel関数で、範囲内の最後のセ...
-
エクセル 担当者ごとにブラン...
-
Excelのマクロで行を間引きたい
-
更新前と更新後の差分をVBAを使...
-
エクセル、正数のみの集計[(負...
-
Excelで順番を逆に
-
SUMPRODUCT関数 行が増えても...
-
ピボットテーブル 0個の行を...
-
《エクセル2000》重複している...
-
SUMIFで数値が入力されているセ...
-
エクセルで何種類のデータがあ...
-
期間指定をして件数を求める関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
Excel関数で、範囲内の最後のセ...
-
Excel関数:「0」を除いた標準...
-
【エクセル】区切り位置で分割...
-
更新前と更新後の差分をVBAを使...
-
ピボットテーブル 0個の行を...
-
値の入っているセルのうち、一...
-
SUMIFで数値が入力されているセ...
-
エクセルで何種類のデータがあ...
-
エクセル、正数のみの集計[(負...
-
エクセル 8ケタの数字から日数...
-
【Excel】歯抜けデータの集約
-
SUMPRODUCT関数 行が増えても...
-
correl関数の範囲指定
-
エクセルに入力された日付「S40...
-
Excelのマクロで行を間引きたい
-
Excelで複数列かつ複数行分の一...
-
Excelで順番を逆に
-
《エクセル2000》重複している...
-
Excelのマクロでソートがうまく...
おすすめ情報