VBAでmaxifとminif

条件付きで最大値、最小値を求めるコードを書いたのでメモ。 

f:id:haitenaipants:20180605234712p:plain

 以上のようなデータがある時、赤組に限った場合の最大値を求めたい。 

 

0)環境

 Microsoft Excel for Mac 2011

 

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はその要素数である。

 

またStartLastは入力データの最初の行数と最後の行数である。

 

For ~ Nextは、もしA列の値が"赤組"ならB列の値をRedArrayに追加していく繰り返し文である。

 

.Max(RedArray)は配列RedArrayから最大値を求める関数である。

最小値を求めたい場合は.Min(RedArray)とする。