#5 LibreOfficeでVBAプログラミングを組む中での四苦八苦/The Trials and Tribulations of Programming VBA in LibreOffice
An English translation of this article is provided at the bottom of the page.
昨日の作業の続き。
昨日のファイルを開いて、マクロの編集をしようとすると…
昨日のマクロの記述が消えている!
LibreOfficeでマクロを記述する場合は、拡張子.odsで保存?
どうやら、拡張子を「xlsx」にして保存していたことが原因。
LibreOfficeでマクロを記述する場合は、ファイル保存で拡張子「.ods」にしておくのが良さ気かもですね…
LibreOfficeでVBAを使えると知り、小躍りしていたのですが、あくまでも今使っているのはExcelではなくLibreOfficeであり、Excelとはいろいろと勝手が違うようです。
昨日数時間かけて考えたプログラムが綺麗サッパリなくなっているのは、痛いところです…
"お試し用”のSubプロシージャを使う
インターネットで検索したり、自分で考えついたプログラムは、「Sub テスト用()」というように練習用のSubプロシージャに書いて、動作を確認するようにしています。
Option VBASupport 1
REM ***** BASIC *****
Sub 本番用()
命令文1
命令文2
End Sub
Sub テスト用()
動作確認するコード
End Sub
練習用のSubプロシージャで試して、書き方や動作を把握してから、本番用のSubプロシージャで使うことを心がけています。
この方法は、以前に読んだ『入門者のExcel VBA』でも紹介されていました。
さて、今日は、先日の投稿で作成した186部門表を用いて、以下のようなことを実現しようと考えました。
本日の作業の目標
- 186部門表の分類コードを1つずつ読み込んで、分類コード毎に新規ワークシートを作成する。
- 新規ワークシート名は、部門コード(4桁)に変更する
- ワークシート「国内生産額表」中の各細品目のデータ(コード、名称、単位、生産数量、単価(円)、生産額(百万円))を部門コードにしたがって、属するワークシートに転記する。
ワークシート「国内生産額表」は以下のようになります。

そして、以下が作成したVBAコードです。
Option VBASupport 1
REM ***** BASIC *****
Sub 本番用()
' 分類コードを読み込んで、分類コード1個毎に新規ワークシートを作成する
Dim bunruiCode As String
For i = 10 To 195
bunruiCode = Worksheets("内生部門").RANGE("G" & i).VALUE
Dim wSheet As Worksheet
' 最後尾にシートを追加
Set wSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
' シート名を変更
wSheet.Name = bunruiCode
' 列名を入力
wSheet.RANGE("A1").VALUE = "コード"
wSheet.RANGE("B1").VALUE = "名称"
wSheet.RANGE("C1").VALUE = "単位"
wSheet.RANGE("D1").VALUE = "生産数量"
wSheet.RANGE("E1").VALUE = "単価(円)"
wSheet.RANGE("F1").VALUE = "生産額(百万円)"
' データを入力
rw = 2
For cnt = 4 To 10000
If Worksheets("国内生産額表").RANGE("G" & cnt).Value Like bunruiCode & "*" Then
Worksheets(bunruiCode).RANGE("A" & rw).Value = Worksheets("国内生産額表").RANGE("G" & cnt).Value
Worksheets(bunruiCode).RANGE("B" & rw).Value = Worksheets("国内生産額表").RANGE("H" & cnt).Value
Worksheets(bunruiCode).RANGE("C" & rw).Value = Worksheets("国内生産額表").RANGE("I" & cnt).Value
Worksheets(bunruiCode).RANGE("D" & rw).Value = Worksheets("国内生産額表").RANGE("J" & cnt).Value
Worksheets(bunruiCode).RANGE("E" & rw).Value = Worksheets("国内生産額表").RANGE("K" & cnt).Value
Worksheets(bunruiCode).RANGE("F" & rw).Value = Worksheets("国内生産額表").RANGE("L" & cnt).Value
rw = rw + 1
End If
Next
Next
End Sub
本当は、上記の練習用プロシージャでトライアンドエラーしていった過程をnoteに記述する予定でしたが、コードを考えることに熱中してしまい、過程を省略するはめに^^;
実行すると…
おお。
186枚もの新規ワークシートが作成され、各ワークシートに細品目のデータが転記されています。

学生時代だったら、ワークシート1枚ずつ手作業で作成して、コピー&ペーストしていたんだろうなあ…
そんなことを思いながら、VBAさんがワークシートを作成していく様子を眺めておりました。
English translation part
Continuing from yesterday's work.
I opened yesterday's file to edit the macro, and then...
The macro code I wrote yesterday is gone!
When writing macros in LibreOffice, should I save with the .ods extension?
It seems the cause was that I saved the file with the ".xlsx" extension.
When writing macros in LibreOffice, it appears to be safer to save the file with the ".ods" extension...
I was thrilled to learn that LibreOffice supports VBA, but after all, I'm using LibreOffice, not Excel. It seems there are many subtle differences in how things work compared to Excel.
It's painful to see the program I spent hours on yesterday vanish so completely...
Using a "Test" Sub Procedure
Whenever I find a program online or come up with one myself, I make it a habit to write it in a practice Sub procedure, such as Sub Test(), to verify its operation.
Option VBASupport 1
REM ***** BASIC *****
Sub Production()
' Statement 1
' Statement 2
End Sub
Sub Test()
' Code to verify operation
End Sub
I try to test things in the practice procedure first to understand the syntax and behavior before implementing them in the main "Production" procedure.
This method was also introduced in a book I read previously, Excel VBA for Beginners.
Now, today I decided to use the 185-sector table created in my previous post to achieve the following:
Today's Goals
- Read the classification codes from the 185-sector table one by one and create a new worksheet for each code.
- Rename each new worksheet to the corresponding 4-digit sector code.
- Transfer each detailed item data (Code, Name, Unit, Production Quantity, Unit Price (Yen), Production Value (Million Yen)) from the "Domestic Production Value Table" to the respective worksheet based on the sector code.
The "Domestic Production Value Table" looks like this:

And here is the VBA code I created:
Option VBASupport 1
REM ***** BASIC *****
Sub Production()
' Read classification codes and create a new worksheet for each
Dim bunruiCode As String
For i = 10 To 195
bunruiCode = Worksheets("InternalSectors").RANGE("G" & i).VALUE
Dim wSheet As Worksheet
' Add sheet at the very end
Set wSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
' Rename the sheet
wSheet.Name = bunruiCode
' Enter column headers
wSheet.RANGE("A1").VALUE = "Code"
wSheet.RANGE("B1").VALUE = "Name"
wSheet.RANGE("C1").VALUE = "Unit"
wSheet.RANGE("D1").VALUE = "Production Quantity"
wSheet.RANGE("E1").VALUE = "Unit Price (Yen)"
wSheet.RANGE("F1").VALUE = "Production Value (Million Yen)"
' Transfer data
rw = 2
For cnt = 4 To 10000
If Worksheets("DomesticProductionValue").RANGE("G" & cnt).Value Like bunruiCode & "*" Then
Worksheets(bunruiCode).RANGE("A" & rw).Value = Worksheets("DomesticProductionValue").RANGE("G" & cnt).Value
Worksheets(bunruiCode).RANGE("B" & rw).Value = Worksheets("DomesticProductionValue").RANGE("H" & cnt).Value
Worksheets(bunruiCode).RANGE("C" & rw).Value = Worksheets("DomesticProductionValue").RANGE("I" & cnt).Value
Worksheets(bunruiCode).RANGE("D" & rw).Value = Worksheets("DomesticProductionValue").RANGE("J" & cnt).Value
Worksheets(bunruiCode).RANGE("E" & rw).Value = Worksheets("DomesticProductionValue").RANGE("K" & cnt).Value
Worksheets(bunruiCode).RANGE("F" & rw).Value = Worksheets("DomesticProductionValue").RANGE("L" & cnt).Value
rw = rw + 1
End If
Next
Next
End Sub
I had intended to document the trial-and-error process in my practice procedure on note, but I got so absorbed in figuring out the code that I ended up skipping the process entirely! ^^;
When I ran it...
Wow.
186 new worksheets were created, and the data for each detailed item was perfectly transferred to its respective sheet.

If this were my student days, I probably would have manually created each worksheet one by one and done all the copying and pasting by hand...
With those thoughts in mind, I sat back and watched as VBA generated all the worksheets for me.


と(2)をVBAで実現-300x169.jpg)