表計算と言えばExcel。でも、表計算アプリケーションとしてドラスティックに登場したのはLotus123。マクロ機能で操作が記憶できるというのも魅力だった。Windows版になって、複数のSheet Tabが利用できるようになった。
123のこの仕様を見て、多数の仕入れ先へのFax発注の合理化を思いついた。しかしながら、それ以前はマクロ機能は123もExcelも独自のものだったのが、ExcelではVBを基本としたVBA(VB for Application)になった。これで勝負あった、と思ってExcelに切り替えた。
ちなみにプレゼンテーションのことをパワーポイントというくらいだが、そもそもはLotus Freelance。
ブラウザにしてもそうだが…… DOS自体も人の作品を買ったものらしいし。
VBAは生産性が高いし、VBが使用できる人には簡単。最初はマクロ記録という操作を記憶してもらう機能が便利。しかし、これは簡単なものならよいが、少し複雑になると遅い。作業を忠実に再生されても時間の無駄である。
処理速度を上げるために、コーディング画面で無駄な工程を削除するとともに、
画面の更新を止めたり、Application Screen Updating = False
発生するイベントを無視したり、Application.EnableEvents = False
自動再計算を止めたり、Application.Calculation = xlCalculationManual
これらは、終了時に明示的にもとに戻しておく。念のため。
これで、記録の まんま再生 みたいなモッサリ感はなくなるが、データ量が多いとチーンと画面が固まったままで、……何待ちなの? みたいな。
表計算アプリケーションは高機能なのでセルは非常に多くの情報を持っている。 セルは重い。 なので、出来るだけセル参照を避けてメモリを活用するというのが速度向上に効果的。
これには配列とクラス・コレクションが有用。
クラス・コレクションはXMLと感覚が似ている。XMLにメソッドを持たせた感じ?
SELECT A.CurrentYM, A.PrefId, A.TypeId, A.ItemId, A.Data,
iif(isNULL(L.CurrentYM),INT((A.Monthserial-12)/12) & RIGHT(A.CurrentYM,2),L.CurrentYM) AS LASTYM,
iif(isNull(L.Data),0,L.Data) AS LDATA,
(SELECT AA.DATA FROM tmpPrefA as AA WHERE AA.CurrentYM=A.CurrentYM AND AA.PrefID=A.PrefID
AND AA.TypeId=A.TypeId AND AA.ItemId='8701') as Store,
iif(isNull(L.Data),0,(SELECT LL.DATA FROM tmpPrefA as LL WHERE LL.CurrentYM=L.CurrentYM AND LL.PrefID=L.PrefID
AND LL.TypeId=L.TypeId AND LL.ItemId='8701')) as LStoe
FROM tmpPrefA AS A LEFT JOIN tmpPrefA AS L ON (A.MonthSerial = L.MonthSerial + 12)
AND (A.PrefId = L.PrefId) AND (A.TypeId = L.TypeId) AND (A.ItemId = L.ItemId)
WHERE A.CurrentY=2024;