IDA Life Blog

HOME  >  勉強
カテゴリー : 勉強 - プログラミング
•VBA •LibreOffice •Calc •オフィスソフト

公開日: 2023-12-16
最終更新日: 2023-12-16

VBAをLibreOfficeのCalcで始める (VBA | Calc)


img_8

LibreOfficeは、無料で使うことが出来るオフィスソフトです。LibreOfficeを使用すると、MicrosoftのOfficeソフト(ExcelやWordなど)と同じようなことができます。「オフィスソフトを使いたいが、使用料は払いたくない」という人にとって、LibreOfficeは無料で使えるのが魅力です。この記事では、LibreOfficeでVBAを動かす例として、簡単なサンプルコードを紹介します。

Contents
• 前準備
• LibreOfficeでVBAが動くようにする
• 最終行を取得するコード
◦ 解説
• まとめ

まず、Calcを開きます。次に、メニューから、「ツール」 → 「マクロ」→「マクロの編集」と進みます。 この記事では、「無題4」という名前のファイルです(下図)。

image 1

[ 画像1. ファイルを選択する。 ]

 

ここで、「無題4」を選択したまま、「マクロの選択」(下図)をクリックします。

image 2

[ 画像2. マクロの選択 ]

 

下図のダイアログが出ます。ここで、「新規作成」をクリックします。

image 3

[ 画像3. 新規作成 ]

 

モジュールの名前を選択するダイアログが出ます。ここでは、デフォルトのまま「Module1」とします。

すると、下図のように「無題4」に「Module1」が作成されました。

image 4

[ 画像4. Module1を選択する。 ]

 

この記事では、上図の黄色くマーカーを塗った領域にコードを書きます。


どうやら、LibreOfficeではデフォルトではVBAが動作しないようです。VBAが動くようにするには、コードの冒頭に、次のコードを1行追加します。

Option VBASupport 1

参考:
"Option VBASupport Statement". help.libreoffice.org.


表計算ソフトを使ってデータの集計をする場合、最終行の行番号を知りたいことがよくあります。たとえば、1行目から193行目までのすべてのセルに数字が書かれたデータがあるとします(下図)。

193行目までデータが入った表

[ 画像5. 193行目までデータがある。 ]

 

この表の、最終行の行番号である193という数字を取得する、VBAのコードを考えてみます。

[sample1]
Option VBASupport 1

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が表示された。

[ 画像6. ”193”が表示された。 ]

 

最終行の行番号である193が、正しく表示されました。

#sample1の変数LAST_ROWは、最終行の行番号を保持するためのグローバル変数です。setLastRowプロシージャの内容は、以下のとおりです。

  1. r = 1 という記述で、最初の行番号を指定する。
  2. Do While文を使って、空白行の直前の行番号を記録する。この行番号が、最終行の行番号となる。
  3. 最終行の行番号をグローバル変数LAST_ROW に格納する。

たとえば、以下のような価格表を考えます。

image 7

[ 画像7. 税込み価格が空欄の価格表 ]

 

この価格表のA列には、税抜き価格が書かれています。B列は税込み価格ですが、空欄になっています。この表のB列に、税込み価格を記入します。以下に、サンプルコードを示します。

[sample2]
Option VBASupport 1

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列に税込み価格が入力されます(下図)。

B列に税込み価格が出力された。

[ 画像8. 処理実行後の価格表 ]

 

#sample2の黄色い部分は、#sample1から書き換えた部分です。関数mainでは、For文で、2行目から最終行(LAST_ROW)までループを実行しています。

For文の部分は、グローバル変数LAST_ROWを使わずに、以下のように書くこともできます。

For r = 2 To 6

しかし、この書き方だと、最終行の行番号が6以外の場合に対応できません。そのため、#sample2のように、最終行の行番号を取得する処理は関数化しておき、行番号の変化に対応できるようにしておくと便利です。


「Excelを持っていないがVBAを使ってみたい」という場合には、LibreOfficeを使うといいかもしれません。LibreOfficeのCalcは、Excelと似たようなことができます。ただし、私は会社のPCではExcelを使っているため、CalcよりもExcelのほうが使い慣れています。私が自宅のPCでCalcを使っているのは、Microsoft Officeを持っていないからです。

表計算ソフトでデータを集計するとき、最終行の行番号を取得したいことがよくあります。そのため、最終行の行番号を取得する処理をプロシージャ(関数)にして、いつでも使えるようにしておくと便利です。