excel macro
分けあってエクセルをばんばん使うようになったのだが、 CSV で書き出して Ruby かなんかで処理するのがめんどくさいので、 マクロを覚えることにした。
次のコードは temp という新しいシートを作って、 それ以外のシートの内容を全部 temp にコピーするというもの。
Sub etude1() Dim ws As Worksheet Dim wstemp As Worksheet Set wstemp = Worksheets.Add With wstemp .Name = "temp" End With For Each ws In ThisWorkbook.Sheets If ws.Name <> "temp" Then maxrow_src = ws.Cells(65536, 1).End(xlUp).Row maxcol_src = ws.Cells(1, 256).End(xlToLeft).Column maxrow_dst = wstemp.Range("A65536").End(xlUp).Row ws.Range(ws.Cells(1, 1), ws.Cells(maxrow_src, maxcol_src)).Copy Destination:=wstemp.Cells(maxrow_dst + 2, 1) End If Next End Sub
なんか良くわからんのだが、整数は型宣言しなくて良いのかな。 Worksheet みたいのは Dim で型宣言したり、 代入するときに Set とか使わんといかんのかな。 VBA の For 文には continue ないのかな。
Cells(65536, 1).End(xlUp).Row だけど、一番左端のカラムしか見てないので、 他にもっと長いカラムがあるとアウトだ罠。 同じように Cells(1, 256).End(xlToLeft).Column だと一番上の行しか見てないので、 もっと長い行があるとまずいわけです。 空でないセル全体を選択する方法ってなんか一発でありそうなもんだけど、 ネット検索するかぎりではなさそう。 ていうか、まあ、実用上特に問題ないから良いんだけど。
Cellsってのが Cells(row, column)なので、 Cells(x,y)ではなくむしろCells(y,x)になっているのが一瞬違和感がある。
OpenOffice.org でもマクロ作れるらしいがこちらは OpenOffice.org BASIC という VBA 互換(?) っぽい BASICか、 Pythonか、 BeanShell (Java風スクリプト言語)か、 JavaScriptが選べるらしいのだが、 どれもいまいちだ罠(笑)。 というわけでまずは Excel で VBA を地味に勉強しようと思います。
ていうか、こまごまテキストいじるには MySQL にデータぶち込んで自前のインターフェイス作るよりは、 手元で Excel でやった方がはるかにまし。 AccessとかSQLiteとかの選択肢もあるのかもねぇ。 AccessってGUIが充実してるのかな。
OpenOffice.orgにもデータベースというのがあって、 MySQL に接続するには Connector というものをまず OS 側にインストールすれば良いらしいのだが、 これまた複雑怪奇というかなんというか。 もう Excel で全然良いじゃんということで逃げた。 だがこの辺はいずれちゃんとやらにゃならんのかという予感もしなくはない。 ていうかとりあえず Excel VBA をマスターするぜっ。 高校生までは N-BASIC とか N60-BASIC などを使っていたのだが、 あまり記憶にない。 というより当時の BASIC とはだいぶ違うんだろうなこれって。