VBAをLibreOfficeのCalcで始める (VBA | Calc)
LibreOfficeは、無料で使うことが出来るオフィスソフトです。LibreOfficeを使用すると、MicrosoftのOfficeソフト(ExcelやWordなど)と同じようなことができます。「オフィスソフトを使いたいが、使用料は払いたくない」という人にとって、LibreOfficeは無料で使えるのが魅力です。この記事では、LibreOfficeでVBAを動かす例として、簡単なサンプルコードを紹介します。
• 前準備
まず、Calcを開きます。次に、メニューから、「ツール」 → 「マクロ」→「マクロの編集」と進みます。 この記事では、「無題4」という名前のファイルです(下図)。
ここで、「無題4」を選択したまま、「マクロの選択」(下図)をクリックします。
下図のダイアログが出ます。ここで、「新規作成」をクリックします。
モジュールの名前を選択するダイアログが出ます。ここでは、デフォルトのまま「Module1」とします。
すると、下図のように「無題4」に「Module1」が作成されました。
この記事では、上図の黄色くマーカーを塗った領域にコードを書きます。
• LibreOfficeでVBAが動くようにする
どうやら、LibreOfficeではデフォルトではVBAが動作しないようです。VBAが動くようにするには、コードの冒頭に、次のコードを1行追加します。
• 最終行を取得するコード
表計算ソフトを使ってデータの集計をする場合、最終行の行番号を知りたいことがよくあります。たとえば、1行目から193行目までのすべてのセルに数字が書かれたデータがあるとします(下図)。
この表の、最終行の行番号である193という数字を取得する、VBAのコードを考えてみます。
サンプルコード
Dim LAST_ROW
Sub setLastRow
r = 1
Do While Cells(r + 1, 1) <> ""
 r = r + 1
Loop
LAST_ROW = r
End Sub
'メイン関数
Sub main
Call setLastRow
msgBox(LAST_ROW)
End Sub
#sample1で関数main
を実行すると、ポップアップウィンドウに「193」と表示されます。(main
にカーソルを合わせて、再生ボタンのマークのボタンを押すと、関数main
が実行されます。)
最終行の行番号である193が、正しく表示されました。
解説
#sample1の変数LAST_ROW
は、最終行の行番号を保持するためのグローバル変数です。setLastRow
プロシージャの内容は、以下のとおりです。
r = 1
という記述で、最初の行番号を指定する。- Do While文を使って、空白行の直前の行番号を記録する。この行番号が、最終行の行番号となる。
- 最終行の行番号をグローバル変数
LAST_ROW
に格納する。
なぜ最終行の行番号を取得するのか
たとえば、以下のような価格表を考えます。
この価格表のA列には、税抜き価格が書かれています。B列は税込み価格ですが、空欄になっています。この表のB列に、税込み価格を記入します。以下に、サンプルコードを示します。
[sample2]Dim LAST_ROW
Sub setLastRow
r = 1
Do While Cells(r + 1, 1) <> ""
 r = r + 1
Loop
LAST_ROW = r
End Sub
'メイン関数
Sub main
Call setLastRow
taxRate = 0.1 '税率:10%
Dim r as integer
For r = 2 To LAST_ROW
 Cells(r, 2) = Cells(r, 1) * (1 + taxRate)
Next r
End Sub
このコードの関数main
を実行すると、#価格表のB列に税込み価格が入力されます(下図)。
#sample2の黄色い部分は、#sample1から書き換えた部分です。関数main
では、For文で、2行目から最終行(LAST_ROW)までループを実行しています。
For文の部分は、グローバル変数LAST_ROW
を使わずに、以下のように書くこともできます。
しかし、この書き方だと、最終行の行番号が6以外の場合に対応できません。そのため、#sample2のように、最終行の行番号を取得する処理は関数化しておき、行番号の変化に対応できるようにしておくと便利です。
• まとめ
LibreOfficeでもVBAを実行できる
「Excelを持っていないがVBAを使ってみたい」という場合には、LibreOfficeを使うといいかもしれません。LibreOfficeのCalcは、Excelと似たようなことができます。ただし、私は会社のPCではExcelを使っているため、CalcよりもExcelのほうが使い慣れています。私が自宅のPCでCalcを使っているのは、Microsoft Officeを持っていないからです。
最終行の行番号を取得する処理について
表計算ソフトでデータを集計するとき、最終行の行番号を取得したいことがよくあります。そのため、最終行の行番号を取得する処理をプロシージャ(関数)にして、いつでも使えるようにしておくと便利です。
ad: