- ベストアンサー
エクセルVBAで最小値を求める方法
- エクセルVBAを使用して、表の最小値を求める方法について教えてください。
- 現在、エクセルVBAを使用して表の最大値を求める処理を実装していますが、同じ条件で最小値を求めようとしています。しかし、最小値を求めると代わりに0が表示されてしまいます。修正方法を教えてください。
- エクセルVBAを使用して、表の最小値を求める処理を実装していますが、最小値を求めると0が表示されてしまいます。どのように修正すればよいでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
何故か指定範囲とFALSE(=0)を対象に最大値を求めています。 MAXのままでしたら指定範囲の値が全て負の値でない限り、このままでも良いですが、MINに変更した場合は指定範囲に負の値がない限り常に「0」になると思います。 >.FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" 「,FALSE」を削りましょう
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
前の質問の時も、どういう状況か、文章で適格な説明がなく、又似たような質問をしているのでやってみた。 質問者の現状のレベルを超えたことをやろうとしているからだろう。 下記でも(説明の仕方も含め)参考にして勉強すること。 下記のようなのが普通のコードではないかと思う。 質問者の意図と違うところがあれば修正するか、無視しても結構。 ーー 受け取った内容 A1セルには最小値を考えるセル範囲の最上行のセルの行番号を指定(入力)する。E1も同じ。 開始セル行を可変で指定できるように考えているらしい。事情は不明。こういうニーズは実務で余りないと思うが? 式はA2、E2に入れる(これで正しいか?質問に書いてあるのか?推測で考えた) そしてA1の場合はC列、E1の場合はG列のセル範囲(の最小)を考えるらしい。 疑問点(前の回答がそうであったから、らしいが) (1)R1C1形式を使うことが疑問 R1C1形式など普通使わないのでは。 ーー Sheet1のシートモジュールに Sheet1のChangeイベントで Private Sub Worksheet_Change(ByVal Target As Range) Application.Volatile Select Case Target.Address Case "$A$1" 'A列 d1 = Range("C65536").End(xlUp).Row 'C列最終行 Range("A2").Formula = "=MIN(C" & Range("A1") & ":C" & d1 & ")" Case "$E$1" 'E列 d2 = Range("G65536").End(xlUp).Row 'G列最終行 Range("E2").Formula = "=MIN(G" & Range("E1") & ":G" & d2 & ")" End Select End Sub ーー Sheet1の テストデータ A1セル 4 A2セル 8 <--結果 関数は=MIN(C4:C9) データ範囲は C3:C9と仮定 10 8 21 34 52 15 11 ーー E1 3 E2 9 <-結果 式は =MIN(G3:G9) G3:G9 9 23 43 54 56 12 34 ーー A1、E1やセルデータを色々変えて、やってみて。 ーー こういうデータ例を質問には書いて質問すること。
お礼
丁重にご教授いただきありがとうございます。 じっくり勉強させていただきます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
例えば With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With を次のようにしてはどうでしょう。 With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .Value = WorksheetFunction.Min(Range(Range("B2"), Range("B" & Range("A1") + 1))) End With
お礼
ありがとうございます。 参考にさせていただきます。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! たびたびごめんなさい。 E1セルデータ変更時のコードを忘れていました。 もう一度コードを載せておきます。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1,E1")) Is Nothing Then Exit Sub If Target < 1 Or Target = "" Then MsgBox "数値が不正です。" Target.Select Exit Sub End If Dim i, k, N As Long If Target = Range("A1") Then k = Cells(Rows.Count, 1).End(xlUp).Row If k > 10 Then Range(Cells(10, 3), Cells(k, 3)).ClearContents End If N = Target For i = 10 + N - 1 To k Cells(i, 3) = WorksheetFunction.Min(Range(Cells(i - N + 1, 2), Cells(i, 2))) Next i Else k = Cells(Rows.Count, 5).End(xlUp).Row If k > 10 Then Range(Cells(10, 7), Cells(k, 7)).ClearContents End If N = Target For i = 10 + N - 1 To k Cells(i, 7) = WorksheetFunction.Min(Range(Cells(i - N + 1, 6), Cells(i, 6))) Next i End If End Sub 何度も失礼しました。m(_ _)m
お礼
ありがとうございます。 こういうやり方もあるのですね。 勉強になりました。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 修正ではないのですが・・・ 最大値の場合はお示しのコード(最終行までの範囲)で問題ないと思いますが、 最小値を求める場合はデータがある範囲を指定してやる必要があると思います。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If Target < 1 Or Target = "" Then MsgBox "数値が不正です。" Target.Select Exit Sub End If Dim i, k, N As Long k = Cells(Rows.Count, 1).End(xlUp).Row If k > 10 Then Range(Cells(10, 3), Cells(k, 3)).ClearContents End If N = Target For i = 10 + N - 1 To k Cells(i, 3) = WorksheetFunction.Min(Range(Cells(i - N + 1, 2), Cells(i, 2))) Next i End Sub こんな感じではどうでしょうか?m(_ _)m
お礼
ありがとうございます。 できました。 完璧です。