LibreOffice マクロの 概 要 と 実 用 例 谷 列 樹 株 式 会 社 アシスト 2015/07/17 OSS オフィスフェスタ 1 K.K. Ashisuto
はじめに 発 表 者 は 2013 年 - 2014 年 にかけて 日 経 Linux 誌 で LibreOffice マクロ 記 事 を 連 載 していました 今 回 は LibreOffice マクロの 概 要 と その 記 事 で 紹 介 し た 実 際 に 動 作 するサンプルを 解 説 します 同 じ 内 容 の 発 表 を LibreOffice mini Conference 2014 Tokyo/Japan でも 行 い ました https://wiki.documentfoundation.org/ja/events/libocon_mini_jp OSS オフィスフェスタ 2
発 表 者 の 紹 介 谷 列 樹 ( たに つらき ) 出 身 地 : 奈 良 現 在 の 肩 書 : 株 式 会 社 アシスト 情 報 基 盤 事 業 部 プログレス 推 進 部 大 阪 の 小 さいベンチャー 企 業 でプログラマ 兼 SE みたいな 仕 事 をしていたら いつのまにか 東 京 で 働 いていました OSS オフィスフェスタ 3
私 と LibreOffice LibreOffice が StarSuite(StarOffice) だったころから 触 っています 昔 は Debian GNU/Linux 上 で 使 ってい ました 10 年 以 上 前 OpenOffice.org マクロ をテーマにし た 記 事 を 雑 誌 に 連 載 して 欲 しいという 依 頼 が 来 て たまた ま 私 が 担 当 することになりました 最 初 は 全 くわからない 状 態 で 手 探 りで 調 べながら 記 事 を 書 いていました OSS オフィスフェスタ 4
1. マクロの 概 要 OSS オフィスフェスタ 5
LibreOffice マクロとは LibO の 操 作 の 自 動 化 するプログラムのことです 操 作 の 自 動 化 には UNO と 呼 ばれる LibO の API を 利 用 します UNO を 利 用 するプログラムのうち LibO の 内 部 や ODF ファイルの 内 部 に 含 まれるものを LibO マクロと 呼 びます OSS オフィスフェスタ 6
UNO とは UNO とは Universal Network Objects の 略 LibO 自 身 の 実 装 方 式 実 際 に LibO のソースコードを 確 認 すると UNO に 則 って 実 装 されていること がわかります 各 部 品 に 柔 軟 にアクセスできるようになっており 結 果 として LibO の API としても 利 用 可 能 OSS オフィスフェスタ 7
UNO の 特 徴 画 面 上 の 操 作 は ほぼ 全 て 自 動 化 可 能 マクロ 以 外 のプログラム 言 語 環 境 でも UNO にアクセス することができる 拡 張 機 能 LibO をサーバーとみなしてアクセス LibO を COM とみなしてアクセス (Windows のみ ) LibO SDK にサンプルコードや 開 発 環 境 が 含 まれています SDK に 含 まれている 言 語 以 外 にも 独 自 バインディングが 開 発 されている 言 語 などもあります OSS オフィスフェスタ 8
UNO を 利 用 しないプログラム ODF を 操 作 編 集 することが 目 的 であれば 必 ずしも UNO( LibO) を 利 用 する 必 要 はない UNO( LibO) 自 体 も ODF を 操 作 するフロントエンドの 一 種 にすぎません ODF = ZIP で 圧 縮 された XML ファイルなので ODF を 操 作 するのに 特 別 なライブラリや API は 必 要 ない とはいえ 少 し 煩 雑 なので Perl, Python, Ruby, Java などに 存 在 する ODF 操 作 用 ライブラリを 利 用 すると 便 利 これらは UNO を 利 用 していない 実 は MS Office でも ODF 編 集 ができるので MS Office の VBA や COM, DotNetFramework の Office 拡 張 などでも 可 能 OSS オフィスフェスタ 9
LibreOffice マクロと 他 の ODF 編 集 プログラムの 関 係 性 ODF を 操 作 編 集 するプログラム ODF 内 の XML を 直 接 編 集 する MS Office のライブラリを 利 用 する 言 語 の ODF 編 集 ライブラリを 利 用 Java, Python, Perl, Ruby UNO を 利 用 するプログラム コマンドラインで 操 作 する 外 部 からのオートメーション (LibO サーバーの UNO にアクセス ) COM (Windows 限 定 ) UNO マクロ LibO Basic Python JavaScript BeabShell 拡 張 機 能 Java LibO Basic Python C++ OSS オフィスフェスタ 10
ここまでのまとめ LibO のマクロとは LibO の 操 作 を 自 動 化 するプログラム で UNO を 利 用 する UNO は LibO の API で マクロ 以 外 にも 様 々な 言 語 環 境 か ら 利 用 可 能 また UNO を 利 用 せず ODF を 直 接 操 作 編 集 する 方 法 ある OSS オフィスフェスタ 11
LibreOffice マクロの 種 類 プログラミング 言 語 的 には 以 下 の 4 種 類 Python, JavaScritpt, BeanShell, LibreOffice Basic マクロの 保 存 場 所 は 以 下 の 3 種 類 マイマクロ, LibreOffice マクロ, ODF ドキュメント 最 も 標 準 的 な 組 み 合 わせは LibreOffice Basic プログラ ムを ODF ドキュメント 内 に 含 める 方 法 本 発 表 で 紹 介 するサンプルも 全 て LibO Basic のマクロになります 後 ほど 紹 介 する VBA 互 換 機 能 も LibO Basic がベースになっています OSS オフィスフェスタ 12
LibreOffice Basic の 具 体 的 な 使 用 方 法 記 事 では 以 下 のような LibO Basic の 具 体 的 な 使 用 方 法 を 書 きました GUI の 機 能 LibO Basic マクロの 構 成 設 定 類 の 説 明 マクロ 記 録 の 使 い 方 ここでは 詳 細 は 割 愛 します 翔 泳 社 実 務 で 使 える LibreOffice にも 詳 しく 書 きました OSS オフィスフェスタ 13
本 当 に 必 要 だったものは? 本 当 にプログラムの 実 装 は 必 要 か? Calc や Base の 豊 富 な 標 準 機 能 で 問 題 解 決 できないか? プログラムが 必 要 だったとして マクロは 最 適 な 方 法 か? OSS オフィスフェスタ 14
2. Calc の 操 作 OSS オフィスフェスタ 15
記 事 の 概 要 LibO Basic の 基 本 BASIC 言 語 です ベースとなる 文 法 は VBA と 同 じですが API が 異 なるため ほぼ 別 言 語 Calc を 操 作 するマクロ ドキュメント シート セルの 操 作 など 開 発 手 法 の 紹 介 UNO の IDL(API リファレンス ) マクロ 開 発 を 補 助 する 拡 張 機 能 MRI OSS オフィスフェスタ 16
サンプルの 動 作 BMP 画 像 を 読 み 込 んでセルの 背 景 色 で 表 現 する OSS オフィスフェスタ 17
ソースコードのポイント BMP データを 配 列 に 変 換 する 部 分 BMP の 仕 様 を 調 べたりしました LibO Basic は バイナリ 操 作 が 不 得 意 な 言 語 ですが 工 夫 する とこんなこともできます エラー 処 理 は 全 く 入 っていません OSS オフィスフェスタ 18
サンプルに 関 するコメント 少 し 実 用 性 がなさすぎたかもしれません 以 下 のようなサンプルにしたいという 目 標 があったので 実 用 性 は 犠 牲 になりました 動 作 が 派 手 なもの 記 事 の 内 容 にある 程 度 沿 ったもの Calc や Base などについている 標 準 機 能 の 組 み 合 わせで は 実 現 できないもの OSS オフィスフェスタ 19
3. Writer と Impress の 操 作 OSS オフィスフェスタ 20
記 事 の 概 要 Writer を 操 作 するマクロ テキストの 編 集 検 索 置 換 など ドキュメントの PDF 変 換 など Impress を 操 作 するマクロ スライドの 編 集 画 像 オブジェクトの 挿 入 など OSS オフィスフェスタ 21
サンプルの 動 作 対 象 フォルダ 以 下 にある 全 xls, doc, ppt, ods, odt, odp 内 の 特 定 の 文 字 列 を 別 の 文 字 列 へ 全 置 換 するマクロ フォルダを 指 定 LibreOffcie フォルダ A A C B D Calc Writer Impress A' C' B' D' E F 再 帰 的 に 全 対 象 フ ァイルを LibO で 読 み 込 む ファイル 内 にある 文 字 列 を 置 換 して 別 名 保 存 E' F' OSS オフィスフェスタ 22
ソースコードのポイント 実 務 で 使 用 することを 前 提 に 作 ったため 正 常 系 以 外 の 多 くの 仕 様 が 入 っています File の 読 み 書 きに 失 敗 する 途 中 まで 処 理 が 進 んでる 最 中 に LibO が 落 ちる などを 想 定 し 途 中 から 再 実 行 できるようする これらの 仕 様 やエラー 処 理 が 全 体 の 8 割 くらいを 占 めてます 今 回 は 6 種 類 のファイルのみ 対 応 LibO が 対 応 しているファイル 種 であれば 追 加 できる OSS オフィスフェスタ 23
サンプルに 関 するコメント この 回 のサンプルは 前 回 の 目 標 を 踏 襲 しつつ かなり 実 用 的 なものになりました 実 は 社 内 の 某 部 署 から 実 際 に 頼 まれて 作 ったものです OSS オフィスフェスタ 24
4. イベントとダイアログ OSS オフィスフェスタ 25
記 事 の 概 要 イベント 画 面 上 での 設 定 方 法 マクロでの 取 り 扱 い 方 画 面 上 で 設 定 できないイベント 類 ダイアログ 画 面 上 での 作 成 方 法 マクロでの 取 り 扱 い 方 OSS オフィスフェスタ 26
サンプルの 動 作 ストップウォッチを 表 示 する 機 能 OSS オフィスフェスタ 27
ソースコードのポイント ダイアログが 表 示 されている 間 も シートを 操 作 したり シー ト 上 に 時 間 をコピペできるようにしてる ( モードレスダイア ログ ) 表 示 時 間 がずれていかないように 微 調 整 を 行 っている OSS オフィスフェスタ 28
サンプルに 関 するコメント 前 回 に 比 べると 実 用 性 コード 量 ともに 物 足 りない ダイアログやイベントは テーマとしては 必 要 だが そのものが 目 的 ではなく 他 のマク ロのための UI として 使 われるものなので 特 化 したサンプルが 作 りにくい OSS オフィスフェスタ 29
5. 拡 張 機 能 OSS オフィスフェスタ 30
記 事 の 概 要 拡 張 機 能 基 本 的 な 作 成 方 法 拡 張 機 能 内 部 の 構 成 メニューやツールバーへのボタンの 配 置 ファイルの 同 梱 や ライセンスの 同 梱 と 表 示 OSS オフィスフェスタ 31
サンプルの 動 作 項 目 のインデントと 番 号 付 けを 行 う 拡 張 機 能 WBS などの 作 成 時 に 利 用 ツールバー OSS オフィスフェスタ 32
ソースコードのポイント ツールバーのアイコン 画 像 はパブリックドメイン 番 号 付 け 部 分 は スマートな 再 帰 処 理 でリファクタリングし たかったが ひとまずそのまま 設 定 方 法 に 改 良 の 余 地 あり OSS オフィスフェスタ 33
サンプルに 関 するコメント この 回 のサンプルは 再 度 実 用 的 なものになりました 実 はこれも 社 内 の 某 部 署 から 実 際 に 頼 まれて 作 ったもので す 以 下 のような 拡 張 機 能 の 特 徴 を 踏 まえています 特 定 のドキュメントには 依 存 せず LibO の 使 い 勝 手 を 良 くする 方 向 性 のもの LibO 本 体 には 取 り 込 まれそうにない 特 化 した 機 能 OSS オフィスフェスタ 34
6. VBA 互 換 機 能 OSS オフィスフェスタ 35
記 事 の 概 要 VBA 互 換 機 能 の 基 本 的 な 動 作 設 定 類 など 簡 単 な VBA サンプルを 用 意 し 動 作 の 説 明 動 作 しない 場 合 の 対 応 方 法 Excel 上 で 別 の VBA コードに 修 正 LibO 上 で LibreOffice Basic コードに 修 正 OSS オフィスフェスタ 36
VBA 互 換 機 能 とは Excel VBA のコードがそのまま Calc(UNO) で 動 くように LibO Basic の 実 行 環 境 を 拡 張 したもの VBA が 入 った Excel ファイルを 読 み 込 むと 自 動 的 に LibO Basic の 環 境 に VBA のコードが 展 開 される LibO Basic 上 で VBA を 編 集 すると 編 集 結 果 を Excel ファイル に 戻 すことは 出 来 ない 編 集 結 果 を 残 したい 場 合 XLS ではなく ODF で 保 存 する OSS オフィスフェスタ 37
UNO VBA 互 換 機 能 の 概 要 図 VBA コード LibreOffice Excel xls ファイル ファイル 読 み 込 み LibO Basic 実 行 環 境 読 み 込 まれた VBA モジュール Option VBASupport 1 ' 後 は 元 の VBA のコード Sub hogehoge ''''' End Sub OSS オフィスフェスタ 38
記 事 のポイント 動 かない VBA も 技 術 的 には 対 応 可 能 ただし 対 応 工 数 はケースバイケース ステップ 数 が 多 いほど そのままでは 動 かない 可 能 性 が 高 い OSS オフィスフェスタ 39
記 事 に 関 するコメント VBA 互 換 機 能 を 利 用 する 場 合 元 の Excel マクロの 仕 様 や 目 的 を 良 く 把 握 することが 必 要 エンドユーザーが 作 成 したマクロは 無 駄 な 挙 動 や 潜 在 的 なバグ が 含 まれている 可 能 性 がかなり 高 い 場 合 によっては 元 仕 様 をシンプルで 合 理 的 なものに 見 直 すほ うが 良 い OSS オフィスフェスタ 40
VBA に 関 する 余 談 Excel2003 Excel2010 のマクロの 移 行 も 実 はかなり 大 変 MS 製 の 互 換 性 チェックツール マクロには 本 格 的 なテスト 仕 様 が 無 いことが 多 く 潜 在 的 なバグ に 気 づきにくい よって 明 確 に 動 作 がおかしい 箇 所 のほうが むしろ 修 正 しやすく て 助 かる OSS オフィスフェスタ 41
質 問 等 ございましたらどうぞ 御 清 聴 ありがとうございました OSS オフィスフェスタ 42