マイマクロのStandard以外のライブラリの関数を呼びたい

マイマクロの、Standard以外のライブラリに
VBAの関数を置いたのですが、
= function_name ( param )
で呼び出した時に、エラー504が出ます。

これは、何故ですか?
また、呼び出す方法はあるのでしょうか?

ちなみに、私の環境で
https://extensions.libreoffice.org/en/extensions/show/27434
を動かしたところ、同様にエラー504が出ました。
パラメータの渡し方が間違っていたのかも知れませんが、
Calcの?バグの可能性ありと
判断して投稿させていただきます。


Version: 7.5.3.2 (X86_64) / LibreOffice Community
Build ID: 9f56dff12ba03b9acd7730a5a481eea045e468f3
CPU threads: 24; OS: Linux 5.10; UI render: default; VCL: gtk3
Locale: ja-JP (ja_JP.UTF-8); UI: ja-JP
Calc: CL threaded

以下の、別ブックに関数を置けば、
そのブック内では関数を利用できました。

[myFunction.ods|attachment]
(upload://mYAwlwnlb8dm1sS7BHB6uEQMq93.ods) (9.7 KB)

myFunction.ods (9.7 KB)

アップロードに失敗したようなので、再度アップします。
以下の関数が埋め込んであります。

Option VBASupport 1
public Function lunar(p_date)
Y = year(p_date)
M = month(p_date)
D = day(p_date)
C=(((Y-2009) mod 19) * 11 + M + D ) Mod 30
lunar = C
End Function

一部、訂正します。

https://extensions.libreoffice.org/en/extensions/show/27434

こちらは、正常に動作しました。
パラメータの与え方が間違っていただけでした。

拡張機能として関数を作り、配布できるようにしたいと考えていますが、
それだとVBAではなくPythonでコードを書かねばならないように思えます。
何かいい方法はないものでしょうか?

XLOOKUP では、IDLコンパイラ(LibreOffice-SDKに付属)を呼び出して、インターフェースを作成し、Pythonで実装していました。

これだと、VBでは使えない、ということでしょうか??

オンラインハックフェストの中で、英語での質問も投稿されましたが、さっそくMike Kaganskiから返事がきてますね

私なりに調べた結果です。
稚拙ですが、それなりに有益なのではと思っています。
ask91230.odt (33.0 KB)

2 Likes

PythonからBasic呼び出し
ask91230-2.odt (97.5 KB)

日付シリアル値の設定を変更するとうまくいきませんでした

Hdm360.oxt_.pdf (16.5 KB)

ファイル名を強制的にPDFにしました。
こちらの環境で、うまく動かないです。
いくら見ても正しそうなのですが、動くものとDiff取れませんでしょうか?

よろしくお願いします。

解凍するとHdm360フォルダの中にMETA-INFフォルダ他各種ファイルが入っていますが
Hdm360フォルダの中身だけがZip圧縮されるように
という説明でわかっていただけるでしょうか。


手順書zip-50.odp (921.3 KB)

2 Likes

ありがとうございます! 圧縮時のフォルダ構成を忘れておりました。
着実に進みました。 (エラー504がでましたが、ちょっと調べてみます)
また結果を書き込みます!

6月6日 16
6月7日 17
6月8日 18
6月9日 19
6月10日 20
6月11日 21
6月12日 22
6月13日 23
6月14日 24
6月15日 25
6月16日 26
6月17日 27
6月18日 28
6月19日 29
6月20日 0
6月21日 1
6月22日 2
6月23日 3

Hdm360.oxt.pdf (239.7 KB)

できました!
ありがとうございます!

1 Like

検索やタイトルを見てたどり着いた方のために
(拡張機能ではありません、一般的な呼び出し方です)


英語版Askで投稿されているように

ユーザー定義の Basic シート関数 は、ドキュメント内に保存されたものか マイマクロ&ダイアログ の standard ライブラリ に書かれた関数のみが利用可能で、これらの場所以外の関数を 直接 呼び出すことは出来ません。

通常 LoadLibrary か invoke のどちらかの方法で、直接実行可能なライブラリ(standard ライブラリ等)から呼び出します
ライブラリ「 Hdm360 」にある関数を利用する場合

  • LoadLibrary によりあらかじめライブラリを読み込んでおく
    Help : ドキュメントイベントの監視
    Api : LibreOffice: XLibraryContainer Interface Reference
    呼び出す関数の前に GlobalScope.BasicLibraries.LoadLibrary("Hdm360") を追加します
    この場合は呼び出す先の関数名と同じ名前を使うと 自身を呼び出すことになり、名前を変える必要があります
    Function xlunar(p_date)
      GlobalScope.BasicLibraries.LoadLibrary("Hdm360")
      xlunar = lunar(p_date)
    End Function
    
    複雑なコードで 2重読み込みが懸念される場合 以下のようにした方が無難な場合もあります
      With GlobalScope.BasicLibraries
        If Not .IsLibraryLoaded("Hdm360") Then .LoadLibrary("Hdm360")
      End With
    
  • invoke により識別名で呼び出す
    Help : BasicからPythonの呼び出し
    Api : LibreOffice: XScript Interface Reference
    呼び出し先の関数名と同じ名前でも呼び出すことが可能です
    関数が書かれているモジュール名が「 Module1 」の場合
    Function lunar(p_date)
      uri = "vnd.sun.star.script:Hdm360.Module1.lunar?language=Basic&location=application"
      lunar = ThisComponent.getScriptProvider.getScript(uri).invoke(array(p_date), array(), array())
    End Function
    
    Basic から Python を呼ぶ方法として紹介さることが多いですが、Basic から Basic でも書式は同様です

その他 参考Ask

1 Like