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が選べるらしいのだが、 どれもいまいちだ罠(笑)。 というわけでまずは ExcelVBA を地味に勉強しようと思います。

ていうか、こまごまテキストいじるには MySQL にデータぶち込んで自前のインターフェイス作るよりは、 手元で Excel でやった方がはるかにまし。 AccessとかSQLiteとかの選択肢もあるのかもねぇ。 AccessってGUIが充実してるのかな。

OpenOffice.orgにもデータベースというのがあって、 MySQL に接続するには Connector というものをまず OS 側にインストールすれば良いらしいのだが、 これまた複雑怪奇というかなんというか。 もう Excel で全然良いじゃんということで逃げた。 だがこの辺はいずれちゃんとやらにゃならんのかという予感もしなくはない。 ていうかとりあえず Excel VBA をマスターするぜっ。 高校生までは N-BASIC とか N60-BASIC などを使っていたのだが、 あまり記憶にない。 というより当時の BASIC とはだいぶ違うんだろうなこれって。