jobtagという厚生労働省がやってる職業情報サイトのオープンデータを使ってやりたいことがあった。慣れてるPerlとかPHPで書きたいところだけど、見てもらうための実行環境を作ることを考えるとVBAで書いてExcelで見てもらう方が簡単。まあ、昔Visual Basicやってたし、初めてのプログラムとしてVBAを勉強する人も多いみたいだから何とかなるでしょ。これを機会に新しい言語をひとつ覚えるってのもいいしね。
とか思ってたら甘かった。甘甘の甘だった。年末年始の休みを全部使ってようやくひとつプログラムを書くのが精いっぱいだった。しかもなんかバグってるし。
そもそも、手元にExcelなんか持ってるはずがないので、LibreOfficeのCalcで先頭行に、
Option VBASupport 1
付けてやってたんだけど、で、基本的には大丈夫なんだけど、どうやらフォームコントロールのオブジェクトを取得するあたりで互換性なくなるみたいね。
Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(SHEET_NAME)
と、
Dim oSheet As Object oSheet = ThisComponent.Sheets.getByName(SHEET_NAME)
の違いみたいな。知らんけど。
つーかさー、VBAさー、言語レベルで持ってない機能多すぎでしょ。なんでソートも持ってないんだ。適当でいいやと思ってバブルソートしたら2,114,124回もスワップしてたじゃん。
まあでも、そもそもVBAの中で完結してプログラムを組もうとしてたのが間違いっぽいね。
もともとは、
- セルから配列にデータを移す。
- その配列をソートする。
- ソートした結果をセルに移す。
とやろうとしてたんだけど、直接Excel上でソートするのが正解だったみたい。
ws.Range("A2:Z10").Sort Key1:=.Range("C1"), Order1:=xlDescending, Header:=xlNo
みたいな。
Excel上での操作をVBAにやらせる、というスタンスが正解なんかな?
でもさー、これはLibreOffice側の問題なんだろうけど、呼び出したサブルーチンの処理が終わる前に次に行っちゃうのやめてほしいなー。なんでも非同期にすりゃいいってもんじゃないだろ。
Sub foo btnBar.Enabled = False baz() btnBar.Enabled = True End Sub Sub baz blah1 blah2 blah3 End Sub
みたいなときにさー、bazが終わってないのにbtnBarが押せちゃう的な。
なんかロックすればいいの?知らん。デッドロック怖いし。納品したプログラムがデッドロックしてすごい怒られたことあるし。あー思い出したらつらくなってきた。
まあ、そもそもVBAよくわからないままに「ChatGPTに聞けばできるかな?」みたいな感じで調べつつ書いてるし、引数の渡し方のコツとかいまいちピンと来なかったんでグローバル変数使ってるし、はいはい、僕が悪いんでしょうね。
変数の値が、たとえばボタンをクリックしてその関連の処理が終わったら破棄されるんではなくて、Excel(LibreOfficeだけど)が起動している間は保持されてるってのもびっくりしたな。ExcelはIDEなわけじゃなくて、実行環境そのものなんだもんね。
など、いろいろ書いてますが、一番衝撃だったのはLibreOfficeで書いたVBA付きの(マクロ付きの?)ファイルを、直接Excelに持って行けないことね。LibreCalcで.xlsmのファイルに書いてたVBAがあっさり消えたから、うすうす気付いてはいたけどね……。ExcelがLibreOfficeの形式のファイル読めたりしないかなーと思ったけど、ま、無理よね。でも、プログラム部分はテキストファイルで持って行くとして、配置したボタンとかはまたExcelで最初からやり直すんだろうな。あー、めんど。
大人は黙ってExcelを買えというか、時間を買うみたいな感覚が必要なんだろうけど、それもなー。負けた気がするもんな。
まあでも、久しぶりにまとまったプログラムを書いて、試行錯誤してプログラムを動くように直していくの楽しかったし、「これ終わるのか?」とドキドキしちゃう感覚も味わえたし、これはこれで良かったなかな。仕事じゃないから最悪終わらなくても良いわけだしね。
本当はこの冬休みは本を読んだりChatGPTの勉強をしようと思ってたんだけど(特にGPTs)、まさかVBA書いてつぶれるとは思わなかった。年末年始用に図書館から本を27冊も借りてたのに……。
これじゃVBAはVBAでも、Visual Basic for Applicationsじゃなくて、じゃないですか。
つーかVBA is Baka-na Appliacationだな再帰的に言うと。
明日からがんばって働きます。
今日はもう寝る!
で、夜中に目が覚めると。
What a Very Bullshit Awaking.
うける。