2020年1月3日金曜日

MAXIFSは重たいのでどうするか?VBAを組んでみた。

 MAXIFS(MAXIF)は、EXCEL2016+365以降のため、365なしの場合、MAXとIFに配列数式{}(Alt+Shift+Enter)で代替する訳だが、これが相手するデータ量が大量だともの凄く時間がかかり、とても実用には適さない。そこで、これはもう、VBAを組むしかなくなる。  つまり、IFの代替としてのフィルターAutofilterで条件(例えば、A列に*りんご*というKeywordが含まれる。*はワイルドカードで含まれるという条件を実現する)となる行を絞り、MAX関数の代替としてのworksheetFunction:=subtotal(4,Range(targetRow:tagetRow))でターゲットの列(例えばE列)の最大値を求めればよいだけだ。たとえば、Sheet2のCells(1,1)つまり、Rnage("A1")に結果を入れる。
With WorkSheet("sheet1")
    .Range("A1").AutoFilter _
         Field:=1,Criteria:="りんご"        ' --- 検索のkeywordはりんごで、A列即ち、Field:=1だ
 EndWith
WorkSheets("Sheet2").Cells(1,1).Value = WorksheetFunction.Subtotal(4,Worksheets("sheet1").Range(E:E))  '4 means MAX
 MAX+IFに対して、Autofilter+SubtotalのVBAコードは、1ケタぐらい所要時間が短縮できた。つまり、120分が10分ぐらいになった。