VBAでmaxifとminif
条件付きで最大値、最小値を求めるコードを書いたのでメモ。
以上のようなデータがある時、赤組に限った場合の最大値を求めたい。
0)環境
1)準備:ReDim Preserve
ReDim Preserveを使えば、配列内のデータを保ったまま、配列の大きさを変更することができる。
例えば
Sub test()
Dim A()
For i = 1 To 3
ReDim Preserve A(i)
A(i) = i
Next
End Sub
とするとA(1)=1, A(2)=2, A(3)=3となる。
逆にpreserveがないと
A(1)="", A(2)="", A(3)=3
となる。これは、ただのReDimでは配列内のデータが初期化されてしまい、A(1)とA(2)の値が保持されないからである。
以下のサイトを参考にした。
VBAのReDim Preserveとは:エクセルマクロ・Excel VBAの使い方-配列
2)最大値を求めるコード
Sub maxif()
Dim RedArray()
Number = 0
Start = 2
Last = 12
For i = Start To Last
If Range("A" & i) = "赤組" Then
Number = Number + 1
ReDim Preserve RedArray(Number)
RedArray(Number) = Range("B" & i)
End If
Next
MsgBox WorksheetFunction.Max(RedArray)
End Sub
ここでRedArrayは、赤組のデータを格納する配列、Numberはその要素数である。
またStartとLastは入力データの最初の行数と最後の行数である。
For ~ Nextは、もしA列の値が"赤組"ならB列の値をRedArrayに追加していく繰り返し文である。
.Max(RedArray)は配列RedArrayから最大値を求める関数である。
最小値を求めたい場合は.Min(RedArray)とする。