「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2599
現在:2


自作関数の配布

ページOpenOffice.org FAQの登録ページ
投稿者nguyen
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2008-06-04 23:39:21 (水)
OSUbuntu
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

自作関数の配布に関して困っています。 (内容はアラビア数字をベトナム読みする関数です) エクステンションとして配布すれば簡単かと思ったのですが、エクステンション(拡張機能)として保存するためにライブラリをStandardからvietに変更して移した上に保存したら関数として認識してくれませんでした。

しょうが無いのでソースファイルとして人に渡したりしましたが、説明が大変でした。(うまくいきませんでした)

自作関数をエクステンションとして配布する簡単な方法は無いでしょうか?


LoadLibrary が必要かと思います。

Tora (2008-06-05 00:22:28 (木))

エクスポートする手順は正しく行われているようです。
インポートする手順も正しく行われているようです。

1. インポートした側の OpenOffice.org で、「ツール」「マクロ」「マクロの管理」「OpenOffice.org BASIC」を選択します。
2. 「マイマクロ」の + マークをクリックするなどして、展開します。
3. インポートしたライブラリのアイコン等の色を確認してみてください。
 白い場合は、そのライブラリはロードされていないことを意味しています。
4. そのライブラリをダブルクリックします。すると、色が変わるかと思います。
 色が付いている場合は、そのライブラリがロードされていることを意味しています。
5. Calc に戻って、=その関数名() などで、動作確認してみてください。
 期待通り、動作するようになった場合、エクスポートおよびインポートの作業は正しく行われたことになります。

さて、OpenOffice.org を起動するたびに LoadLibrary をマウスのダブルクリックで行わなければいけないのは、なんか違うような気がいたします。

拡張機能でインポートしたライブラリのロードを自動的に行うには、どうすればいいのかしらん。ご存知の方、お願いいたします。

loadLibrary("ライブラリ名")

Tora (2008-06-05 00:33:40 (木))

以下の BASIC のコードを実行すると、ライブラリ名をマウスでダブルクリックしたのと同様、ライブラリ名で指定したライブラリが読み込まれます。

globalscope.BasicLibraries.loadLibrary("ライブラリ名")


でもさ、そのコードを実行するためには、さて、どうしましょうか。

Calc シート関数として

はにゃ? (2008-06-05 02:45:31 (木))

これは、もしかして Basic で Calc のシート関数として作成したのでしょうか?その場合、Standard 以外のライブラリに入れると動作しません。

Calc Function in a Macro as an Extension
http://www.oooforum.org/forum/viewtopic.phtml?t=63565

この場合、ほとんど自動化させるには上記リンクに書かれている ooomacros で公開されているような Add On Installer などを使うしかありません。

Add On Installer

はにゃ? (2008-06-05 03:04:24 (木))

Add On Installer を使ったことが無かったので少し中身を見てきました。

Standard に利用しようとするとインストーラごとインストールされますね。また、アンインストールでは指定してあるライブラリすべてのモジュールを削除してしまいます。ライブラリにモジュールを追加インストールできると言われていた割りに作りがあr。

というわけで、Standard に使うには少し不安が残ります。

エクステンションを添付しました。

nguyen (2008-06-05 11:47:46 (木))

Tora様、はにゃ?様
どうもありがとうございます。
LoadLibraryですが、白から黄色に色が変わっても関数としては認識しませんでした。
Standardに移せば認識いたします。
プログラムは滅多にしないので稚拙なマクロですが添付いたしました。ご確認ください。
=mothaiba(A1)等として使います。

認識しないとは?

Tora (2008-06-05 13:00:52 (木))

=mothaiba(A1) を入力すると、どのエラーがでますでしょうか。

a) #NAME?
b) #VALUE!
c) その他

#NAME? の場合は、関数名が認識されていません。

#VALUE! の場合はは、関数名は認識されていて、その関数を実行させてみたところ、何かしらのエラーが発生しているという状況だと思います。

なんとなくすっきりしません。

Tora (2008-06-05 13:41:16 (木))

> その場合、Standard 以外のライブラリに入れると動作しません。


> Standardに移せば認識いたします。

という事実が、いまひとつ、疑問です。不具合かもしれないかと。

確かに、以下のようなドキュメントをじぃ〜くりっと読んでみると、
http://documentation.openoffice.org/manuals/oooauthors2/0312CG-CalcMacros.pdf

Standard に入れておくと、自動的に読み込まれるよ。といようなことが記述されています。が、その他のライブラリにいれたら動かないよとは、書いてありませんし。。。

よ〜わからんです。

#VALUE!

nguyen (2008-06-05 13:47:24 (木))

Tora様
確認した所、Standar以外だと#VALUE!が表示されます。

Re: #VALUE!

Tora (2008-06-05 14:11:52 (木))

nguyen 様、
確認、ありがとうございます。

私のところ OpenOffice.org 2.3 でも、同じようになりました。

OpenOffice.org を再起動した直後の、Standard 以外のライブラリ内に含めた関数で、そのライブラリをダブルクリックしてロードする前では、#NAME? というエラーになりました。

その後、そのライブラリをダブルクリックや + をクリックするなどしてロードした後では、#VALUE! に変化しました。

ということで、その関数名は、認識されている。と言えるのではないかと思います。しかしながら、期待通りには動作しない。という不具合(バグ)のような気が、なんとな〜くですけど、しませんか。

とりあえずは、
拡張機能ではなく、通常の Calc のファイル .ods の Standard 部分に関数を入れておく。という配布方法で、よくわからん不具合みたいな現象を回避する。というアイデアもありかと。

「マイマクロ」ではなく Calc ファイルでは、動作しますね。

Tora (2008-06-05 14:29:53 (木))

「マイマクロ」の中では、Standard ライブラリ内においた Function のみが動作するみたいですね。

一方、Calc ファイルの中では、Standard ライブラリに加えて、他の自作ライブラリの内においた Function も動作しますね。

さて、日本語化した不具合の可能性もあるかと思い、OpenOffice.org 2.3 Linux 英語版 で試してみました。が、同じような動作のようです。

調査ありがとうございます。

nguyen (2008-06-05 19:08:05 (木))

Tora様
 いろいろと調査ありがとうございます。
 英語版でも同様ですか。不具合の可能性もあるようですね。

 特に記しませんでしたが.odsでの配布は一応試したのです。試用としては充分だと思うのですが、常用するとなるとマイマクロに移さねばならず、手間がかかってしまいます。
 一応以下の三種類で配布を試みました。

*.bas
 説明が面倒でした。
 その上うまく伝わらなかったのか動作しないといわれました。

*.oxt
 ライブラリの移動が必要なので断念中。

*.ods
 試用には一番便利。常用にはマイマクロへの移動が必要。

不具合・・・ですか?

ponkan (2008-06-05 20:22:01 (木))

実の所
oxtでの配布についてですが、貴殿がこのスレに添付されているoxtについでさえ
インストールするのは、心臓バクバク、ドキドキものでした。
自作関数の配布については、ヘルプではコピーペーストするように書いて有ります。

それは、仕様(?)なのか、セキュリティに対する概念からくるものかは不明ですが
現状では、関数のソースに対する安全性は自身が確認するしか手段が無いようにも思われます。

セキュリティのために参考までに書きますが、oxtをzipで解凍し内部のxbaを適切なプロジェトエディタで確認する事をお奨めします。

人の性根善説なのか・・・
例えば、貴殿は私が作成したoxtを無条件にインストールしてくれるのでしょうか?
長くなりましたが、利便性の追求には相応のリスクが発生するだろうし
リスク回避には、膨大な労力が必要となる場合もあるだろうという話です。

取敢えずヘルプに記載されている方法が仕様(?)だという事で。
因みに、ods配布でライブラリの移動をマクロで組めば良いのではないですか?

まとめ

はにゃ? (2008-06-05 22:09:22 (木))

勝手にまとめると

アプリケーションライブラリにあるとき

  • Standard: 問題なし
  • その他: #VALUE! エラー

    ドキュメントのライブラリにあるとき
  • Standard: 問題なし
  • その他: ライブラリを読み込んでからセルに入力すると動く
    しかし、保存して開きなおすと #NAME! エラー。再計算しても効果なし。これはドキュメントを開くときのイベントに該当ライブラリをロードするマクロを割り当てておいても効果なし (これは順番の関係?)。

関連 issue
Starbasic functions residing in user-created library cannot be called from Calc cell
http://qa.openoffice.org/issues/show_bug.cgi?id=53615

配布マクロ

はにゃ? (2008-06-05 22:24:25 (木))

>因みに、ods配布でライブラリの移動をマクロで組めば良いのではないですか?

昨日書いてみました。fileLibInstaller_020.odt

使い方

  1. 上記ファイルを開く
  2. 作成した関数などを含むモジュールをモジュールの管理ダイアログから Ctrl + ドラッグなどでファイルの適当なライブラリにコピーする
  3. このとき、相手のライブラリになさそうなモジュール名にしておく
  4. ファイルの LibInstaller ライブラリを Basic IDE で開く
  5. Module1 の最初付近にある下記の部分を編集します
  6. 上書き保存して終了

    Sub Define_ModuleNames
     sSourceLib = "Standard" ' インストール元ライブラリ名 (このファイル内)
     sDestLib   = "Standard" ' インストール先ライブラリ名
     
     ' インストールするモジュール名
     sModuleNames = Array( _
       "Module100", "Module200" )
     
     ' インストールするダイアログ名
     sDialogNames = Array( _
       "" )
    End Sub

    sSourceLib にファイルに入れておいたインストールしたいモジュールを入れたライブラリ名を指定します。sDestLib にはアプリケーションライブラリにインストールするときのライブラリ名を指定します。あとは、インストールしたいモジュール名を sModuleNames に配列として与えます。この配列にリストされていないモジュールは無視されます。削除時も同じ名前のもののみ削除します。

    インストール、アンインストールはドキュメントに配置してあるボタンで行います。

>セキュリティのために参考までに書きますが、oxtをzipで解凍し内部のxbaを適切なプロジェトエディタで確認する事をお奨めします。

セキュリティ問題から拡張機能はインストール時などになにかコードを実行したりできないようになっています。しかし、じょぶコンフィグレーションをインストールするとイベント設定などが設定できますし、Py-UNO コンポーネントのインストールに失敗するものをいれておくとユーザー設定を復旧が難しい状態に壊すこともできます (こうなると起動すらしませんが)。
また、拡張機能に電子署名を行うことができるようになる予定があったような気がします。

ありがとうございます。

nguyen (2008-06-06 10:03:13 (金))

ponkan様

セキュリティについての説明ありがとう御座いました。
私はフリーウェア等なんの不信感も無くダウンロードして実行してしまうタイプなので普通の人と感覚がずれているのかもしれませんね。

ところでプロジェトエディタとはどのようなものなのでしょう? テキストエディタで開いてみたりはしたのですが……。

はにゃ?様
マクロの作成ありがとうございます。これで簡単に配布が出来そうです。
まだ試していませんが、試したら報告いたします。

動きました!

nguyen (2008-06-06 15:47:48 (金))

はにゃ?様
 ありがとうございます。無事インストーラー動きました。

 一つ疑問だったのはモジュール名を配列として指定するという部分です。
 よく分からなかったので二つともmothaibaと入れてしまいました。

 

モジュール名を配列として

はにゃ? (2008-06-06 22:07:50 (金))

配布するモジュールが一つであれば、配列に要素を一つだけにしてください。複数ある場合には複数していということで。複数同時にモジュールを配布したいときにも一度にできるようにしてあります。

そういえば、Standard モジュールにゴミが入っているかもしれません…。

了解です。

nguyen (2008-06-10 15:30:45 (火))

はにゃ?様
 了解しました。
 これで簡単に関数を配布することが出来るようになりました!

 希望者に渡した所喜んでもらえました。大変嬉しいです。

お名前:
題名:


添付ファイル: fileLibInstaller_020.odt 1411件 [詳細] filemothaiba.oxt 664件 [詳細]