- ベストアンサー
エクセルVBAの超初心者です
こんにちは。 VBAの勉強を最近始めた初心者ですがよろしくお願いします。 例えばセルのA1~A10まで適当な数値が入っており、その中の一番大きな数値を探し出し(例えばA4に入っている100が最大値として)、そのセル以下のセル(A5~A10)の中から最小値が入っているセル(A7に入っている20が最小とする)を探し出し最大値から最小値を引いた値を出したい(A4の100からA7の20を引いた80を出したい)場合はどのようにすればよいでしょうか。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 もしも、VBAの勉強でしたら、ご自身で考えたほうがよいですね。 ワークシート関数を使うのは実務型です。練習の時は、なるべくやめたほうがよいです。それを使っても、必ずしもVBAの実力を上げるものではありません。 ワークシート関数は、戻り値が、Variant 型なので、一般的には、二重の戻り値のデータ型を持っていることになります。だから、[明示的でない=暗黙的な変数]のデータ型(Variant 型)を処理しなければならないので、意味が分かっていないと、ごちゃごちゃになってしまいます。出来れば、本来は、上級になってからのほうがよいです。 まず、VBAを始めるにあたっては、変数のデータ型をきちんと決めてから取り掛からないといけません。どのような数値やデータを扱うか、考えておいたほうがよいです。出来るだけ、基本的なことは、入門時に癖をつけるようにしてください。 それから、入門時には、あまり込み入ったものは手を出さないほうがよいです。基本的な構文をなるべく多く、自分の手で入れるようにしたほうがよいです。プログラム言語を学ぶときには、受動的にはならないほうがよいです。間違っても良いから、能動的に、自分で書いてみることが大事です。他人のものをみても、入門時には勉強にはなりません。自分で書けるようになった時に、初めて相手の力や相手の考えが理解できるようになります。 そういう私も、今、昔、挫折した言語を勉強中です。VBAで覚えた勉強の方法を、そこでも実践しようとしています。 今回は、なるべく入門レベルにして書いてみました。 確かに、入門用ですが、どちらかというと、VBの教本に出てくるタイプの内容で、ある程度分かっている人向けです。VBA教本でいうと、入門編を終わった人の応用問題クラスですね。だいたい、1~2ヶ月ぐらい勉強した後の感じです。 初心者の方が、これを解けるかどうかは、少し疑問です。 この問題には、引っ掛け部分の落とし穴があります。つまり、たとえば、A3 に、10 があるとしても、最大値がA4 ですから、その以下から探さなくてはなりません。また、最大値が、A10 にあるとすれば、最小値は、0 ですから、差し引きは、100になります。 私は、仮の最大値と仮の最小値の入れるタイミングを間違えそうになりましたから、あながち簡単な内容とは言えませんね。 >そのセル以下のセル(A5~A10)の中から ここが、最大の問題点です。 また、変数を書くときは、VB6型の場合は、なるべく縦に書いたほうがミスが少ないです。横に書くと、つい、データ型を忘れがちです。 × Dim i, j, k As Integer ○ Dim i As Integer, j As Integer, k As Integer また、変則的な書き方は、ある程度なれてからのほうがよいです。意味が分からないままには、書かないほうが良いかもしれません。 '基本的には、標準モジュールに書き込みます。 '------------------------------------------ 'Option Explicit Sub PrcVBA_1() Dim intMax As Integer 'ここは本来はLong型でも可 Dim intMin As Integer ' '' Dim i As Integer '最大値の行数 Dim j As Integer 'ループ用 Dim k As Integer ' '' '最大値の検索 intMax = Cells(1, 1).Value '仮の最大値を入れる For i = 1 To 10 If Cells(i, 1).Value > intMax Then intMax = Cells(i, 1).Value j = i End If Next i '最小値の検索 intMin = Cells(j + 1, 1).Value '仮の最小値を入れる For k = j + 1 To 10 If Cells(k, 1).Value < intMin Then intMin = Cells(k, 1).Value End If Next k 'Debug.Print intMax - intMin MsgBox intMax - intMin '本来は、CStrで、文字列変換する End Sub
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
#6の修正です。 最小値が存在しない場合があります。その場合に、このようにすればよいかと思います。 'Debug.Print intMax - intMin If j < 10 Then MsgBox intMax - intMin Else MsgBox "最大値: " & CStr(intMax) & " ですが、" & _ "その場所が、" & j & "行目にあるために、最小値が存在しません。" End If
参考です。 Sub Macro() myMax = 0 myMin = 9999 For i = 1 To 10 If Cells(i, 1).Value > myMax Then myMax = Cells(i, 1).Value: Posision_Max = i Next If Posision_Max = 10 Then MsgBox "max=" & myMax & " Min= no way": Exit Sub For i = Posision_Max + 1 To 10 If Cells(i, 1).Value < myMin Then myMin = Cells(i, 1).Value Next MsgBox "max=" & myMax & " Min=" & myMin & vbCrLf & "Max-Min=" & myMax - myMin End Sub
お礼
ご回答ありがとうございます。 一つの数値を求めるのにも色々な方法があるんですね。今回のご回答を参考にして自分でも色々と考えてみます。
- zap35
- ベストアンサー率44% (1383/3079)
>そのセル以下のセル(A5~A10)の中から最小値が入っているセル つまりA8セルが最大値なら、A9:A10の小さい方が最小値になるというロジックでよろしいですか? 少し分かりにくいかもしれませんがこんなマクロではどうですか MAX関数で最大値を得たらMATCH関数でその行を取得して、その行より下でMIN関数を適用しています Sub Macro1() Dim minRow, maxRow As Integer maxRow = Application.Match(Application.Max(Range("A1:A10")), Range("A1:A10"), 0) If maxRow = 10 Then MsgBox (Cells(maxRow, 1)) Else minRow = Application.Match(Application.Min(Range(Cells(maxRow + 1, "A"), Cells(10, "A"))), _ Range(Cells(maxRow + 1, "A"), Cells(10, "A")), 0) + maxRow MsgBox (Cells(maxRow, "A") - Cells(minRow, "A")) End If End Sub でもA10が最大値ならどうするか質問には書かれていないので、最小値は0と見なしました
お礼
早速の回答ありがとうございます。 Match関数ってのもあるのですね。VBAどころか関数についてももっと学ぶ必要があると痛感しました。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)関数を使う方法 (2)ロジックで組む方法。 第1行目から10行まで、10回X2 Maxより大きいか、大きければMax=そのセルの値で置き換え Minより小さいか、小さければMin=そのセルの値で置き換え をやりつつ、10行目を終わると、Max-Minを計算する。 >セル以下のセル(A5~A10)の中から最小値が入っている これは普通はやらないのだが、特にここに意味はありますか。 少し複雑になります。最大が決まるのは全レコードを世も込んだ後出ないと決まらないし。 既回答もその点は意識してないようだが>
補足
早速の回答ありがとうございます。 今回は質問のとおり、最大値の入っているセルより下のセルの中(A5~A10)の最小値を探したい為よろしくお願いします。
それなら、VBAを使わない方法もありますよ。 答えを出したいセルに =MAX(A1:A10)-MIN(A1:A10) と記入すればそこに答えが表示されます。 …VBAを使いたいならこれはスルーでお願いします。
お礼
早速の回答をありがとうございます。 申し訳ありませんが、今回は最小値に関しては最大値の入力されているセルより下のセルの中から探したいのと、VBAの勉強を兼ねている為VBAに限らせていただきます。
- CaveatEmptor
- ベストアンサー率26% (126/470)
VBAでも関数は使えますので、関数を使ってはどうでしょうか? 答をB1のセルに入れるとすれば以下で求められます。 Sub work() Cells(1, 2) = WorksheetFunction.Max(Cells(1, 1), Cells(10, 1)) - WorksheetFunction.Min(Cells(1, 1), Cells(10, 1)) End Sub
補足
早速の回答ありがとうございます。 質問が分かりづらく申し訳ありません。 今回はA1~A10の中から最小値を探すのではなく、最大値の入っているA4より下のセル(A5~A10)の中で一番小さい値を探す方法をお願いいたします。
お礼
丁寧な回答をありがとうございます。