LibreOfficeをインストールしよう

#オープンソースの表計算ソフトを探そう
Excel が一番いいんだが、わたしはオープンソースを配布しているのに　その補助として Excel を用意してください、というのも不便だろう。
そこで今どきなら LibreOffice がいいのではないか。ダウンロードしてみよう。

#LibreOffice
Download site
http://www.libreoffice.org/

![201701311454a88.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ed3bcd72-fd05-d38d-c761-ad4168bdfaad.png)
（緑色の四角 [DOWNLOAD NOW] をクリック）

![201701311454a89.png](https://qiita-image-store.s3.amazonaws.com/0/159417/721f128f-91fd-a8f0-16d4-423c0094e82f.png)
日本語版もあるのか……。でもまあ　ゲーム開発の需要からすると　英語の方が　読者も多いだろう……。
しぶしぶ　英語のままで　[DOWNLOAD VERSION 5.2.5] をクリック。

![201701311454a90.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1798c07d-959a-7522-9be9-b3447f4176af.png)
（ブラウザの下の方を見ると　ダウンロードは始まっている）

![201701311454a91.png](https://qiita-image-store.s3.amazonaws.com/0/159417/7c33f489-1077-aeb1-010d-53dae5a5f415.png)
（ダウンロードが終わったらクリックする。インストール・ウィザードが出てきた）

あとは　どんどん [次へ]、[次へ]　と押していく。

![201701311454a92.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1a65b825-ae64-ccc0-2c73-c8da39728caf.png)
（／＿＼）　いったんグーグル・クロームを閉じて　続行する。

![201701311454a93.png](https://qiita-image-store.s3.amazonaws.com/0/159417/35974e6e-aec5-c23e-21e9-c68f045cc34e.png)
よし、インストールでけた。

ちなみに「できた」と言うと、**閾値１００％を超えていない「できた」は「できていないだ」という人がいた** ので配慮し、２０代の頃は「まだ進捗５０％です」とか細かく刻んでいたが　３０も過ぎると　めんどくさくなって「でけた」と　つぶやくことにしている。確かに日本語には　**１％できた**　という表現がない。**でけた**　はオヌヌメだ。おかげで言葉に不自由なく　日ごろから　１％ずつ**でけ**まくっている。

![201701311454a94.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1724b4b6-bbf3-91b5-bc62-4384ee16285d.png)
（Libre Officeを起動したときの画面）

おっ、何か出てきた……。
やりたいことは、１つのブックに　６つ程度のシートをまとめ、
このシートは　リレーショナル　にできていてデータがばらけているので、データを１つにつなげた見やすいビューを作ることだ。

![201701311454a95b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3b48043b-7b20-4c78-0af0-e2fb834c2d14.png)
（１つのトランジションは、複数のコンディションを持っている）

たとえば　この　コンディション　の方に……。

![201701311454a96.png](https://qiita-image-store.s3.amazonaws.com/0/159417/f73e11a1-c693-1608-fe15-94e40efff1b6.png)

トランジションの　見出しを付けてくれるだけでも　入力はたいへん楽になるはずだ。
……、よくよく考えると　エクスポートでも　コメント行ぐらい付けれるか。
だが　せっかくだし　表計算ソフトでやってみるか。

![201701311454a97b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ec943f30-59e4-ad73-bd2f-33a02434b3f2.png)
（とりあえず　ブックを新規作成してみよう）

![201701311454a98.png](https://qiita-image-store.s3.amazonaws.com/0/159417/451ab9f3-6990-aa13-c526-fb1254a2f322.png)
（新規作成）

**おおっ！** ぱっと見、Excel とはなんだったのかという同等の見た目をしているが、Excel のすごいところは VBA でマクロが組めることにある。Libra Office Calc は何まで　できるのだろうか。

![201701311454a99.png](https://qiita-image-store.s3.amazonaws.com/0/159417/bf2a45dc-4cab-34d1-a0a6-0d77149f9b88.png)
（マクロもありそうだが……）

![201701311454a100.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c88f9d83-a39e-73cd-1868-3a857d4b6043.png)
Python も入っているのか。

![201701311454a101.png](https://qiita-image-store.s3.amazonaws.com/0/159417/a1f80067-036d-3e0a-7dd4-e7628ef90f16.png)
（Python を実行するのに Java Runtime Environment(JRE) がいるのか。また今度にしよ）

Unity で開発しているゲームの　補助　として使いたいので、C#言語でもあればベストだったんだが無いし、Java Script も Java の上で動かすようだ。
Unity で Java は使わないので JRE をインストールしてない。ボタン１発でインストールできはするが……。使用者としては　相性が悪い。

Libre Office Basic マクロ とは何だろうか。
とりあえず様子見で　新規作成してみよう。

#Libre Office Basic マクロの様子見
![201701311454a103b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/21f1f95c-1d9f-103a-74c0-85984ab516fb.png)

今作ったばかりの「無題１」ブックに　マクロを新規作成してみたい。

![201701311454a104.png](https://qiita-image-store.s3.amazonaws.com/0/159417/cbecec60-ac11-9b54-06d5-f88a1cfc56cb.png)
（スクリプト・エディタが出てきた）

じゃあ、シートに　ボタンを置いて、そのボタンを押すとマクロを実行するようにして、それで　ファイル読み込み　とかできるのだろうか？

分かり次第、この記事に追記していきたい。

#Libre Office Basic のおべんきょをしよう

新人・若手SE スキルアップnavi　「LibreOfficeマクロ入門講座 最低限知っておきたいこと」
http://seskillup.jp/libreoffice-maro-beginner/

このサイトを頼りに　コーディングを進めてみる。

新人・若手SE スキルアップnavi　「【LibreOffice マクロ】実行方法」
http://seskillup.jp/%E3%80%90libreoffice%E3%83%9E%E3%82%AF%E3%83%AD%E3%80%91%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95/

![201701311454a105b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1282a1e4-860f-b805-5c02-3a9774fbd397.png)
（ハローワールドは　オッケ！）

help.libreoffice.org　「ボタンを挿入して編集する」
https://help.libreoffice.org/Common/Inserting_and_Editing_Buttons/ja

![201701311454a106b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ce74bf4b-d09f-c072-f271-2e080d5cf948.png)
（VTJ [表示(V)] - [ツールバー(T)] - [フォームコントロール(J)]）

**あれっ？**　日本語版にした覚えはないが　日本語だ。

![201701311454a107b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/716147b2-4cd1-7ae2-612e-3361a9c9afbe.png)
（ツールバーが出てきた）

これがボタンか。

![201701311454a108b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c3607765-83e6-3ba5-fd85-39cfd95937ca.png)
（マウスでドラッグして　シート上にボタンを配置して右クリック、[コントロール(T)]を選ぶ）

![201701311454a109b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/2e0f65fc-8461-aa62-a9de-d471c7c8fb56.png)
（サブ・ウィンドウが出てきた）

ここで色々設定できそうだ。

![201701311454a110b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/625cd2fa-c5a7-60ce-31d3-0b0e0a306d30.png)
（[イベント]タブをクリックし、[実行時]の横の[…]ボタンを押下）

![201701311454a111b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3cbe230a-0649-c4d7-b7c8-78765429c684.png)
（[マクロ(A)]ボタンを押せばいいのか）

![201701311454a112b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/9d767bdb-08e7-7d2f-052a-f7d28781b802.png)
（一瞬 JREを入れてくださいな画面が出たが無視して進む）

![201701311454a113b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/23ce6602-8f8b-dfba-a5eb-6e936b01548b.png)
（アクションが割り当てられたぞ！）

![201701311454a114.png](https://qiita-image-store.s3.amazonaws.com/0/159417/cf16d693-1684-0cec-bf1f-1a4f15053dfc.png)
（サブ・ウィンドウは閉じた）

今、デザイン・モードになっていると思うんだが、どこかに　デザイン・モードを解除するボタンがあるはず。

![201701311454a115b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/0bfe9ce4-3493-3ea5-8aac-5708787aa206.png)
（こんなところにあった）

![201701311454a116b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/d886ad08-e413-723a-6387-d631834093ae.png)
（はい、ボタン　オッケ！）

ファイルの入出力も、このあと　記事に追記していきたい。

#マクロでシートが追加できない
なんだか　サンプル・プログラムが動かない。やっぱ Java 入れてみるか……。

##Javaをインストールしよう
Java
https://www.java.com/

ここからボタン１発でインストールできる。
![201701311454a117.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c550e564-f66b-b29e-aa20-072dea2dbaa9.png)
（[無料Javaのダウンロード]ボタンをクリック）

![201701311454a118.png](https://qiita-image-store.s3.amazonaws.com/0/159417/376bbe87-e5df-90b6-1411-4e9342dfeea1.png)
（ボタン１発ではなかった）

![201701311454a119.png](https://qiita-image-store.s3.amazonaws.com/0/159417/6037b669-cbae-6905-3e03-5cd6c8eb39bb.png)
（インストールを進めていく）

![201701311454a120.png](https://qiita-image-store.s3.amazonaws.com/0/159417/8db28dd2-4bf5-7f7d-27e0-615429f577d3.png)
（途中でバージョンの古いJavaは消してくれたようだ）

##マクロのセキュリティを[高]から[中]へ下げよう
![201701311454a121.png](https://qiita-image-store.s3.amazonaws.com/0/159417/2eef2ec1-ce43-9040-bcdc-c5a3684b8290.png)
（Libre office calc を再起動したぞ）

**あれっ？** Java とか関係なくてセキュリティの問題だったのか？
![201701311454a122b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c8aae4fa-c329-36de-5f3a-fe0e0d778a6d.png)
（TO [ツール(T)] - [オプション(O)]）

![201701311454a123b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/b57be7f0-31e0-6154-4450-a50beb66613e.png)
（Y [LibreOffice] - [セキュリティ] - [マクロセキュリティ(Y)]）

トップ画面から [ALT]キーを押しっぱなしにして　[T][O][Y]　（**トイ**）で　マクロセキュリティ―に行けるじゃないかｗｗｗｗｗｗｗ

![201701311454a124b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/7b38f0bb-f5bd-87c0-aed6-4231294879b1.png)
（セキュリティーは [高] から [中] に下げよう）

続きはまた、この記事に追記していきたい。

#さて、マクロを編集するか……
Javaも入れて、マクロ・セキュリティーも下げたし、さて実行できるようになったのかどうか……。
![201701311454a125b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/39edc45a-a8f5-aabb-8c3f-b41f6177fd6f.png)
（今度は[編集]をクリック）

##スマートクォート問題
![201701311454a126b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/53bbdb3d-7f40-ce75-261a-9ee35cf4b869.png)
（**んっ？**　前は出てこなかったエラーが出ている）

これって、コピペ・プログラマを悩ます「**スマートクォート**」問題じゃないのか。 Qiita の引用欄では解決できているからといって　他のブログでもそうであるとは限らないことをすっかり忘れていた。

#信頼のおけるソースにする
![201701311454a127b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/09869f50-729f-dca1-b1fb-7052c725811f.png)
（それは置いておいて　まだ実行できない）

どこまで　マクロ・セキュリティーを下げればいいのか……。
![201701311454a128b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/b9e86892-c63c-0d77-0985-81d5b7eef90a.png)
（信頼のおけるソースにしておこう）

[Alt]+[T][O][Y] の出番だ。
マクロ・セキュリティーを**[低]にするのは嫌だ**。このフォルダーの中にあるマクロは **信頼する**、という機能を利用しよう。

![201701311454a130b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/458f6fd2-3377-ddc3-c5da-587abc9d1848.png)
（Libre office を一旦閉じて、信頼するフォルダーの中のファイルをダブルクリック）

Libre office を再起動して叩き直し。
![201701311454a129.png](https://qiita-image-store.s3.amazonaws.com/0/159417/cc5d26b9-7c9e-8341-1030-9ebf9b0d0d62.png)
（マクロは実行されるようになった）

![201701311454a131b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c0fe49f5-edf2-d87e-d41f-97cf40156e1e.png)
（[Rensyu2]シートが追加された）

ようやく　シートの１個を追加できるようになった。

続きはまた、この記事に追記していきたい。

#さすがに Libre office calc ブックを吐き出すプログラムはつらかろう
C#言語で CSV（comma separated value）ファイルを吐き出すのは簡単だ。ただのテキスト出力だ。シートを６つ程度吐くのも簡単だ。

できれば　Libre office calc マクロの方で　６つのCSVを１つのブックに読込んでくれた方が楽ではないか。そういうボタンを作りたい。

#まずはワークブックの作成だ
##サンプル・プログラムを読み漁ろう
新人・若手SE スキルアップnavi　「【LibreOfficeマクロ】WorkBook作成、書込、保存、閉じる」
http://seskillup.jp/%E3%80%90libreoffice%E3%83%9E%E3%82%AF%E3%83%AD%E3%80%91workbook%E4%BD%9C%E6%88%90%E3%80%81%E6%9B%B8%E8%BE%BC%E3%80%81%E4%BF%9D%E5%AD%98%E3%80%81%E9%96%89%E3%81%98%E3%82%8B/

LibreOffice Calc Basic fun!!!　「ドキュメントを上書保存する」
http://calibreblo.blogspot.jp/2011/04/blog-post_4128.html

LibreOffice Calc Basic fun!!!　「名前を付けてドキュメントを保存する」
http://calibreblo.blogspot.jp/2011/04/blog-post_13.html

LibreOfficeへの道　「Dir 指定したドライブの現在のカレントパスを返します」
https://libreoffice.jimdo.com/%E9%96%A2%E6%95%B0-%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88-%E3%83%9E%E3%82%AF%E3%83%AD/d-%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E9%96%A2%E6%95%B0-%EF%BD%BD%EF%BE%83%EF%BD%B0%EF%BE%84%EF%BE%92%EF%BE%9D%EF%BE%84-%E3%83%9E%E3%82%AF%E3%83%AD/dir/

Libre Basic Ref　「Libre:025 ワークシート名を変更する」
http://librebasic.momiji-mac.com/?p=76

LibreOffice Calc Basic fun!!!　「シートの取得 (2)」
http://calibreblo.blogspot.jp/2011/04/2_18.html

#ブックを新規作成し、シートを６つ作って保存しよう
やっと分かってきた。

```LibreOffice_Basic
REM  *****  BASIC  *****

Sub Main
msgbox "Hello World!!"

Dim oSheet as Object ' シート
Dim oSheets As Object ' シートのリスト
Dim sheetName As String ' シートの名前
Dim oDoc As Object ' 新しいブック
Dim Dummy() ' 使わない引数に

Dim folder As String ' 信頼のおけるディレクトリ
folder = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\" 'どうにかならんのか


oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Dummy()) ' ブックを新規作成
oSheets = oDoc.getSheets() ' シートのリストを取得

'--------------------------------------------------------------------------------
' 最初からあるシートを名前変更

oSheet=oDoc.Sheets(0)
oSheet.Name="Rensyu0"

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み0"

'--------------------------------------------------------------------------------
' ２つ目のシートを作成

sheetName = "Rensyu1"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,1)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み1"

'--------------------------------------------------------------------------------
' ３つ目のシートを作成

' シートの名前
sheetName = "Rensyu2"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,2)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み2"

'--------------------------------------------------------------------------------
' ４つ目のシートを作成

' シートの名前
sheetName = "Rensyu3"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,3)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み3"

'--------------------------------------------------------------------------------
' ５つ目のシートを作成

' シートの名前
sheetName = "Rensyu4"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,4)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み4"

'--------------------------------------------------------------------------------
' ６つ目のシートを作成

' シートの名前
sheetName = "Rensyu5"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,5)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
oSheet.getCellRangeByName("A1").String= "セルへの書き込み5"

'--------------------------------------------------------------------------------
'C:test.odsとして保存
oDoc.storeAsURL(ConvertToUrl( folder & "sample.ods"), Dummy())

'ファイルを閉じる
oDoc.dispose

End Sub
```

このコードで、
![201701311454a132b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/bf3c15a9-bcad-9b46-dcba-5c1522b6c792.png)
ブックを作って、シートを追加して、セルに書き込んで保存できた。

次は　ＣＳＶファイル読取　も調べてみたい。
続きはまた、この記事に追記していきたい。

#CSVファイルを読込もう
##まずはサンプル・プログラムを読み漁ろう
White Tiger　「CSVファイルを読み込む方法」
http://www7b.biglobe.ne.jp/~whitetiger/ex/liboffice032.html

OpenOffice.org Basic メモ
http://www.geocities.jp/penguinitis2002/computer/programming/OOo_basic.html

help.libreoffice.org 「Text Functions」
https://help.libreoffice.org/Calc/Text_Functions

##はいでけた
![201701311454a133.png](https://qiita-image-store.s3.amazonaws.com/0/159417/70cbf7b9-b3ed-0539-48d2-f245e4c6435d.png)
（CSVファイルを読込んだ。７つのシートを持ったブック）

LibreOffice には CSVファイルを読むという便利な関数が見つからなかったので、
自分で書いた CSVパーサー を LibreOffice Basic に書き直した。
ソースコードを置いておく。

```LibreOffice_Basic
REM  *****  BASIC  *****

Option Explicit

Sub Main
'msgbox "Hello World!!"

Dim oSheet as Object ' シート
Dim oSheets As Object ' シートのリスト
Dim sheetName As String ' シートの名前
Dim oDoc As Object ' 新しいブック
Dim Dummy() ' 使わない引数に
Dim folder As String ' 信頼のおけるディレクトリ
Dim file1 As String
Dim file2 As String
Dim file3 As String
Dim file4 As String
Dim file5 As String
Dim file6 As String
Dim file7 As String

folder = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\" 'どうにかならんのか
file1 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)parameters.csv" 'どうにかならんのか
file2 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)layers.csv" 'どうにかならんのか
file3 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)stateMachines.csv" 'どうにかならんのか
file4 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)states.csv" 'どうにかならんのか
file5 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)transitions.csv" 'どうにかならんのか
file6 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)conditions.csv" 'どうにかならんのか
file7 = "C:\Users\Takahashi\Documents\muzudho\Unity\KifuwarabeFighter2\KifuwarabeFighter2\_log_(AniCon@Char3)positions.csv" 'どうにかならんのか

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Dummy()) ' ブックを新規作成
oSheets = oDoc.getSheets() ' シートのリストを取得

'--------------------------------------------------------------------------------
' 最初からあるシートを名前変更

oSheet=oDoc.Sheets(0)
oSheet.Name="parameters"

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み0"
ReadCsv(file1, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ２つ目のシートを作成

sheetName = "layers"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,1)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み1"
ReadCsv(file2, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ３つ目のシートを作成

' シートの名前
sheetName = "stateMachines"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,2)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み2"
ReadCsv(file3, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ４つ目のシートを作成

' シートの名前
sheetName = "states"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,3)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み3"
ReadCsv(file4, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ５つ目のシートを作成

' シートの名前
sheetName = "transitions"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,4)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み4"
ReadCsv(file5, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ６つ目のシートを作成

' シートの名前
sheetName = "conditions"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,5)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み5"
ReadCsv(file6, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
' ７つ目のシートを作成

' シートの名前
sheetName = "positions"

' シートを追加
if oSheets.hasByName(sheetName) = false then
	oSheets.insertNewByName(sheetName,6)
end if
oSheet = oSheets.getByName(sheetName)

'作成したシートへの書込
'oSheet.getCellRangeByName("A1").String= "セルへの書き込み6"
ReadCsv(file7, oSheet) ' CSV読込

'--------------------------------------------------------------------------------
'C:test.odsとして保存
oDoc.storeAsURL(ConvertToUrl( folder & "sample.ods"), Dummy())

'ファイルを閉じる
oDoc.dispose

End Sub

'--------------------------------------------------------------------------------
' CSV読取
Sub ReadCsv(filename As String, oSheet as Object)

Dim fileHandle As Integer ' ファイルハンドル番号

fileHandle = Freefile
Open filename For Input As fileHandle ' 外部ファイルの内容をシートに読込む

Dim row As Integer
Dim source As String
row = 0
Do While not eof(fileHandle)
	Line Input #fileHandle, source

	'oSheet.getCellByPosition( 0, row ).String = source
	CsvLineParser( source, row, oSheet )
		
	row = row + 1
Loop

Close #fileHandle

End Sub

Sub CsvLineParser(source As String, row As Integer, oSheet as Object)

	Dim caret As Integer
	Dim column As Integer
	Dim cell As String

	If Len(source) < 1 Then
		Exit Sub
	End If ' 空文字列なら終わり

	caret = 1 ' 文字列の文字目は1スタート
	column = 0 ' テーブルの列は0スタート
	'Do While caret <  Len(source)
	'	oSheet.getCellByPosition( caret, row ).String = Mid(source,caret,1)
	'	caret = caret + 1
	'Loop
	'Exit Sub


	cell = "" ' １セル分の文字列
	Do While caret-1 < Len(source) ' このループで１行分に対応
		Select Case Mid(source,caret,1)
			Case ",": ' トークンを出力して次へ。
				caret = caret + 1
				oSheet.getCellByPosition( column, row ).String = cell
				column = column + 1
				cell = ""
			Case """":
				' ここからリテラル文字列処理へ
				caret = caret + 1

				' エスケープしながら、単独「"」が出てくるまでそのまま出力。
				Do While caret-1 < Len(source)
					If """"=Mid(source,caret,1) Then
						' これが単独の「"」なら終わり、２連続の「"」ならまだ終わらない。

						If caret + 1 - 1 = Len(source) Then
							caret = caret + 1
							Exit Do ' 「"」が最後の文字だったのなら、無視してループ抜け。
						ElseIf """" = Mid(source,caret+1,1) Then
							caret = caret + 2
							cell = cell & """" ' 2文字目も「"」なら、２つの「""」すっとばして代わりに「"」を入れてループ続行。
						Else ' 2連続でない「"」なら、次の「,」の次までの空白等をスキップ。//【改変/】2012年10月30日変更。旧： index++;//【改変/】2017年02月01日変更。次のカンマの次まで飛ばした。旧： index+=2;
							caret = InStr( caret, source, "," )
							caret = caret + 1
							Exit Do
						End If
					Else
						cell = cell & Mid(source,caret,1)
						caret = caret + 1 ' 通常文字なのでループ続行。
					End If
				Loop
				oSheet.getCellByPosition( column, row ).String = Trim(cell) ' 前後の空白はカット
				column = column + 1
				cell = ""
			Case Else: ' ダブルクォートされていない文字列か、ダブルクォートの前のスペースだ。
				cell = cell & Mid(source,caret,1)
				caret = caret + 1
		End Select
	Loop
End Sub
```

ボタンを押すと　ブックを作ってくれるようなアプリケーションとして　シートを１個作っておくと　いいのかもしれない。
続きはまた、この記事に追記していきたい。

#ファイルパスをセルから取ってくるようにした
![201701311454a134.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ac70b3f0-90c6-8712-f4fb-901fdd078171.png)
いまのところ　これで良しとしよう。

```LibreOffice_Basic
' アクティブ・シートを取得
oSheet = ThisComponent.GetCurrentController.ActiveSheet

' ( column, row ) is 0 start.
folder = oSheet.getCellByPosition( 5, 12 ).String ' folder. end is "\"
file1 = folder & oSheet.getCellByPosition( 5, 16 ).String ' parameters.csv
file2 = folder & oSheet.getCellByPosition( 5, 18 ).String ' layers
file3 = folder & oSheet.getCellByPosition( 5, 20 ).String ' stateMachines
file4 = folder & oSheet.getCellByPosition( 5, 22 ).String ' states
file5 = folder & oSheet.getCellByPosition( 5, 24 ).String ' transitions
file6 = folder & oSheet.getCellByPosition( 5, 26 ).String ' conditions
file7 = folder & oSheet.getCellByPosition( 5, 28 ).String ' positions
```

これで Unity上のStellaQLウィンドウ が CSV を出力し、
LibraOffice の [CSV Import]ボタンを押すと　７つのシートを持ったブックが作られる。

#自動再計算させるには？
![201701311454a135b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/7c5503e1-0765-855a-0c61-1d576fab53b8.png)
（セル番号を入力しても　数字を参照してこない）

何か設定があるのか。

![201701311454a136b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1a0bdbf4-79b6-0f1a-f207-0e87e30de26c.png)
自動計算には　設定されているようだが。

続きはまた、この記事に追記していきたい。

##シートを作り直すと再計算されるが……
気まぐれな空 「LibreOfficeの更新に伴う数式の不具合について」
http://d.hatena.ne.jp/Aki270/20130824/1377316150

じゃあ　シートを作り直そう。

![201701311454a137b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/17432a5f-365b-a05a-f637-8abc2cf0e3b6.png)
（自動再計算されないシート）

どうも、マクロで作ったシートが再計算されない。すべてのセルが文字列だと思われているのだろうか。

![201701311454a138b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/52e0ac03-44c6-79b7-f2ef-e1e4883625b6.png)
（マクロで作ったシートのセルの書式を見てみた）

どうもそのようだ。だが Standard に変えても再計算はされない。

![201701311454a139b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/540bf208-31a5-bce9-5ae0-385870feca09.png)
（マクロで作成するシートと、計算するシートを分けてみた）

![201701311454a140b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/313d2d7d-4f24-1d94-4c64-b33bd6d4128b.png)
（別シートの名前も取ってこれる）

Unityの方の話しなんだが、この Name というのは　ステートのラベルのことだ。欲しいのは Name ではなくて FullName なのだった。
StellaQL の方に頑張ってフルネームを取ってきてもらうか。

続きはまた、この記事に追記していきたい。

#がんばってフルパスを引っ張ってきた
![201701311454a141b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/454b8ed8-adce-f158-27cb-46f17eb96461.png)
（D列の ParentPath を Unityのステートマシンを再帰ループして拾ってきた）

Parent Path と Name を連結した文字列を　数字にしたのが nameHash だと思うんだが、Unityを触っていてもいまいちよく分からん。
多分、Name は ステートに書いているラベルで、ステート自体は FullPath を持っていないので　オブジェクトを辿って拾ってくる必要があるのだろう。

データが変わったので　また　CSVインポートして新しいブックを作りたいんだが、さて困った。
ビュー用のシートを　せっせと作っているところなのに……。
ビューと　インポート・データは　別ブックに分けて　読み取りに行く仕掛けにした方が良さそうだ。

続きはまた、この記事に追記していきたい。

#別ブック（別ドキュメント）のセルを引っ張ってこよう
![201701311454a142b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1f91f3cc-f560-0772-34eb-23ea7dc17626.png)
（別ブックのシートのセルを、引っ張ってきた）

できるのか。　ファイルパス設定用のシートを作って　文字列連結させてみよう。

![201701311454a143b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/f57b4f82-80d0-e210-fed8-f482d0f3f3aa.png)
（CONFIGシートに　ファイルパスが入っていて、それを文字列連結して INDIRECT( ) に入れると参照してくれる）

![201701311454a144b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/32bf42e1-71d6-b7bb-9a4f-f5de47137fa9.png)
（CONFIGシートにファイルパスを書いておこう）

ややこしい。計算式のところが　ぐちゃぐちゃになるのが嫌だ。

##中間シートを作る
![201701311454a145b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/2a10456e-2a5f-95cb-2db1-cc8a62731cb3.png)
（[OBJECT]シートを作った）

中間にシートを１つ用意しておいて、文字列連結は済ませてから　表の中で　これを使うことにしよう。

![201701311454a146b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/b4f5cb6f-1f27-3557-9e1a-4589911534bf.png)
この文字列のところに　自動連番が効くようにするには　どうすればいいんだろう。調べるか。

続きはまた、この記事に追記していきたい。

#自動連番の数字を文字列化する
![201701311454a147b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/608ef3e1-5fce-aca8-0360-3de867442b6c.png)
（末尾にM2、M3、M4……と付けたかったんだが、でけた）

```LibreOffice_Calc
& ADDRESS( ROW(セル番号), COLUMN(セル番号), 1, 1)
```

とすると、末尾にセル番号を文字列化して付けれるようだ。

#他のブックのセルを参照する
![201701311454a148b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/49da5b82-0702-f7e9-804d-20ed4193580f.png)
（CONFIGシート）

CSVファイルの場合、シート名には　ファイル名が入っていたので　ややこしかったが、少しずつ仕組みが分かってきた。

![201701311454a149b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/4e198353-3aa5-8c75-d49b-8f83dfb7b09e.png)
（中間シート）

```
ファイル名#シート名.行列番号
```

になってるわけだ。

![201701311454a150b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/010c4271-ab4e-8156-ab08-52d37d7c0d05.png)
（ビュー・シート）

これで、他のブックのセルを参照することは　でけた。

続きはまた、この記事に追記していきたい。

#入力シートを自動作成できないか
![201701311454a151.png](https://qiita-image-store.s3.amazonaws.com/0/159417/74b3cf06-19c2-8d48-a376-db08aa52a74e.png)
こういう感じで、各パラメーターの更新を　スプレッドシートに入力し、これを Unity 側でインポートして　データ入力装置として使えないか、という試みだ。

- データ入力できるパラメーターはどれか？
- そのパラメーターは int, float, bool, string  のいずれか？
- 空文字列にしたいときは　delete フラグを指定すればいいか？

といったあたりだろうか。

![201701311454a153.png](https://qiita-image-store.s3.amazonaws.com/0/159417/37ff87fd-9315-9405-31f2-a0edae60b7fa.png)
（考え中）

例えば　StellaQL に　列定義シート　も吐き出してもらって、これをもとに　LibreOffice Basic のマクロを使って　ビュー・シートを作成してはどうか。

続きはまた、この記事に追記していきたい。

##列定義シートを作成
![201701311454a154.png](https://qiita-image-store.s3.amazonaws.com/0/159417/701dfbe1-6567-d442-a85c-c0fcce7b7544.png)
（StellaQL で出力した列定義シート）

これをひとまず　ブックにまとめたい。

![201701311454a155b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/f5302d52-f5aa-8bd7-a896-6bc5e1bb674f.png)

なんつーか　Unity にデータベース連携機能がないので自分で　なんちゃってデータベース風スプレッドシートを実装する。
データ・シートと、列定義シートができたので、**なんちゃってデータ入力フォーム** を作ろう。

続きはまた、この記事に追記していきたい。

#ひとまずビューを手作りしよう
![201701311454a156.png](https://qiita-image-store.s3.amazonaws.com/0/159417/4d1b0bfb-8f17-6a22-8fa5-e3f484cdf080.png)
（左が手作りで作成中のビュー、右は出力されたデータ）

空白セルを参照すると　０　と表示されるのは　書式　が数字にでもなっているのだろうか？
Excelでは　＠を使って　書式も設定できたような気がするが、覚えてない。
０　を空白に置換するスクリプトを書くより、書式設定で楽したい。調べてみよう。

![201701311454a157b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/99b30d26-2570-0548-6b6d-1fa9e4015b3a.png)

というか、テキスト形式にしていて　０　と表示されるようだから、データ・シートの方で　空白は０だというふうに返しているんじゃないか。

![201701311454a158b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/25e1c61f-55aa-6a28-8009-bb11c49bc171.png)
（空白に見えて、書式が　数　になっている）

データを出力するときに、書式をテキストに設定する方法を探してみよう。

![201701311454a159b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/7ec41ef0-a03a-ea20-12f0-5eb3a604fd3b.png)
（IF文を使えば 0 を空白にすることもできるが……）

運用で対応した方が　楽じゃないか。　文字列型に 0 が入っていれば空白扱い、本当に "0" が入っているときは……うーむ。区別はどうするのか。

![201701311454a160b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/9cdd6d8c-344a-d50f-8329-74636cfe3212.png)

IsBlank関数で　空白だけを調べることができるので、取ってきた値の列、ＩｓＢｌａｎｋの列を２列余分に用意しておけば　空白は判定できるか。なんか無駄が多いけど。

![201701311454a161b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/538047a3-fefb-970d-f147-55f729fe7dcf.png)
（３列使って、空文字列をチェックだ）

なんかもっと便利な関数でも無いものか……。

続きはまた、この記事に追記していきたい。

#ビュー・シートを作るマクロを書こう
どうやったら Module2 が作れるのか見つからなかったんだが……
![201701311454a162b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/6ccf54ff-f2f1-e1b7-a1b9-6a94ffbe57f5.png)
（新しいモジュールを作るダイアログボックス）

[新規作成(N)] ではなく、[管理(E)...] から進むと　モジュールを作ることができるようだ。ややこしい……。

![201701311454a163b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/69a7db0d-e0a8-5ebd-262f-7370e8c7c12b.png)
（行の終わりに EOF を自動記入するようにした）

エンド・オブ・ファイル（ファイルの終わり）の記号 EOF を一応書いておく。

![201701311454a164b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3a7562e0-ee9b-89b7-0fb8-c99d03714e82.png)

あっ、エンド・オブ・ライン（行の終わり）の記号 EOL も付けとこ。２５年ぐらい前のエディタみたいだ。

![201701311454a165b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/308a6289-499b-79d3-2896-755a45295117.png)
（ビュー・シートを作成する土台）

ループが何をやっているのか　分かりやすくなった。

##EOFが役に立つ場面
![201701311454a166b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/b0bc0fea-e782-3a65-6cb7-aeafb6225535.png)
（ずぼらな自動連番の途中で　抜けることができる）

続きはまた、この記事に追記していきたい。

#中間ファイルを作ろう
![201702021805a1b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/19cd9d1f-86c4-c0be-b063-29711623c9a8.png)
（シート名の末尾に _obj　を付けた、中間ファイル）

データ・シート及び列定義シートから　ビュー・シートに　１ステップで変換すると　不具合発生時の問題の切り分けができなかったことから、一旦、中間ファイルを挟むことにした。
中間シートは、

- 列定義シートに　#Key、#FullPath　という２つのフィールドを追加した
- 列定義シートから、「キー用フィールド」「表示用フィールド」「入力用フィールド」を残し、「出力用フィールド」を除外した
- せっかく表計算ソフトを使っているのだし、ヘッダー行の色を変えてみるという恩恵を得てみた

というものだ。オープンソースでやっているので　ソースコードは後ほど　まとめて GitHub で公開する。

この中間シートを　タテヨコ入れ替えれば、ビューができそうじゃないか？　プログラマーにも実行時の状態を把握する能力の負担があり、中間シートで労力を軽減することで　むずかしさを減らすことができる。中間シート大切。

続きはまた、この記事に追記していきたい。

#ビューを作成した
##フィールドのスキップが勘所
![201702021805a2.png](https://qiita-image-store.s3.amazonaws.com/0/159417/95264c35-88a3-eb48-f7e5-449ce5bd2fcd.png)
（マクロで作ったビュー・シート）

入力できるフィールドだけカウントしていると　ずれたので、出力しないフィールドは　スキップする、といった処理も入れて、なんとか形はでけた。
列幅の自動調整にも　挑戦しているんだが　思った通りに動いてくれない。

続きはまた、この記事に追記していきたい。

##ウィンドウ枠も固定したし、できあがり
![201702022135gif54d.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/337fd2f5-7ab1-ccea-9785-a78d2c311258.gif)
（アクティブ・シートを切り替えながら　表を作成すると　動きが見れる）

シートをアクティブにしながら　メソッドを呼び出さないと　効き目がないメソッドがあるようだ。
列幅の最適化は　良く分からなかったので　パスで。
これで　ビュー・シート　は　でけたのではないか。

ひとまず　Libre Office　の記事を終わる。

#ソース公開中　Open source
https://github.com/muzudho/KifuwarabeFighter2