Openpyxlにハマっておりました。
存在そのものは知っていたOpenpyxl。
この間、Noteの更新もしないでハマっておりました。
Openpyxl?
なんじゃそりゃって方もいらっしゃるかと思います。
Openpyxlはエクセルのファイルに対し、そうだなぁ、ちょっかいをだすことができるプログラム?スクリプト?、まあそういうものです。(以下はプログラムということで)
ちょっかいをだす?
例えば、売掛表はその月で前月の入金残高と当月売上を足したものから当月の入金を引き当月入金残高を計算するってのがキモですが、月変わり時(例えば7月が8月になった時)には、当月入金残高を前月入金残高に変える必要があります。
これをエクセルの関数だけでやるとしたら例えば1年間のシートをあらかじめ作り10月のシートの当月入金残高を11月のシートの前月入金残高に転送する式を入れる事で対応はできます。
けれどこんなリクエストないと思いますが、1年間の履歴はいらない。その月の内容だけのシートがひとつあればいいんだよ。って事になると繰越時の残高計算後、その月の明細を消去する必要がでてきます。
この手の処理は式や関数ではたぶん対応できません。
そこでOpenpyxl。
Openpyxlで翌月繰越用の残高計算後、明細行のクリアをするプログラムを作ってしまえば半永久的に使用できます。
Openpyxlはそんな事ができるプログラム機能です。
でも、それって普通マクロというやつでやるんじゃないの?
そう普通マクロでやるのが正解です。
なので、ここまでをまとめますとOpenpyxlってのは普通マクロでできることをカッコつけてプログラムでもできるようにしたツールです。
じゃあそのカッコつけ〜のOpenpyxlってナニ?って事になるんですが。。
だいたいのパソコンユーザーさんは、マイクロソフトというお釈迦様が広げた両手の間の世界以外を見ようとしません。
いや、そもそもマイクロソフトがパソコンを使う事でできる諸々の頂点だと思っている人たちが結構いらっしゃいます。
その様な方々からすれば、エクセルはマスト。
そんなマストなエクセル界の頂きに燦然と輝くのがVBA(マクロのスゴいやつ)。
VBAをマスターした人をたぶんその界隈では天狗と呼んでいるとかいないとか。
つまりたぶんだけどVBAとはそれほど尊いものなんだろうと。
そんな尊いVBAマクロの領域に土足で踏み込んでくるOpenpyxlなんてものは絶対に許さん!的な方々もいらっしゃいますが、Openpyxlの本家はPythonです。
Pythonってのは現時点で世界で2番目に愛されているプログラミング言語です。(どこかのサイトで見ました)
その世界で2番目に愛されているPythonというプログラム言語で何ができるかっていうと。
何千万いや数億のデータを読み込んでの解析やらAI関連のことやら画像に映り込んでいるものを解析やらWebサイト構築やら。。。、なんだか色々な分野で卒なく利用されている様です。
なのでPythonからすれば、エクセルも色々な分野のひとつのうち。
僕(Python)忙しいから、エクセルのことは分家のOpenpyxlやPandasにやらせているからそっちで聞いてね。って感じかなぁと思っています。
(そもそも本家分家の関係じゃないとは思いますが。。)
ということは、マクロというかVBA習得してVBAの世界にハローするよりもOpenpyxl経由PythonでPythonワールドでハローする方がなにかと衝撃的だと思います。
などと思いテンションは上がるのですが、プログラムを作る事ってとても面倒くさいのです。
また一度やり始めると寝ても覚めてもロジックの事ばかり考える様になり酔っ払ってもいないのに電車降りるの忘れるし買い物してお金だけ払って商品置いてくるしいいことなんてないのです。
なので、僕はこれまでプログラムをやっていた人という、いわゆる口だけ男でいたしこれまでいやこれ以降もそれを続けていくつもりでした。
けれど流れでOpenpyxlでプログラムを作る羽目になりました。
プログラムってコードを書くより、開発する環境をパソコン内に作ったり開発したシステムをWebサーバーに設置する方が結構難しく、それで挫折する人が多いそうです。
けれど、OpnepyxlというかPythonの場合、そこを後回しできます。
例えば、VScodeというテキストエディタの使い方をYoutubeでマスターすれば、プログラムを実行させながらコードを作っていけます。
昔プログラムを作っていた頃は、コードを入力してコンパイルかけてエラー潰し切った後始めてプログラムを実行させる事ができたものです。
その辺はMAMPでPHPを動かしていた時も思ったけど良い世の中になったものです。
つまり、開発環境に悩む事なくコードが書けてコードの実行結果もすぐにわかることができる昨今のプログラム開発は、すごいなぁと思いました。
で、実行環境はOpenpyxlの場合はエクセル。
つまり、実行結果をエクセル上に反映させられるのでこれまたハードルが下がりまくりって感じです。
そんな感じなので、費目別に作られたエクセルの予算表に対し実績を月別に横展開(列追加)するプログラムをなんだかんだ他の仕事をしながら2週間くらいで作れてしまいました。
このスピード感はちょっとすごいなぁと思います。
最初に悩んだのは、forを使ったエクセルの行と列からセルの値を取得するところ。
最初のforで行全体を取得して次のforでその行の列、つまりセル値を取得できるというのがわかってからはもう前方は光だけ。
私は最強〜♪って感じで進むx2!
あとエクセルで普段やっている操作をコード化する方法なんだけどここらへんはチャットGPTくんがナイスなアドバイスをくれたなぁ。
あと、費目別に予算を作った人がサム関数使ってグループ毎に集計しているだけどその予算列で作ったサム関数を実績列に流用するのはロジック考えてて面白かった。
良いか悪いかは別として、式を取得した文字列をリプレイスして別の列に変更できた時はちょっとガッツポーズしたものでした。
という感じで、最後らへんはかなり遊びながらやっていました。
で、思ったんだけど、OpenpyxlというかPythonで他人様の業務を楽にさせ対価を得るよりもまずは今自分の周りを自動化させる事に特化した方がいいのでは?と。
しばらくはOpenpyxlとPandasにどっぷり浸かってみようかな?って思っています。