Calcでボタンで引数を渡したい

たとえば次のようなマクロがあるときに、

Sub showMsg(s)
	Msgbox s
End Sub

ボタンAを押したら、「ボタンA」を引数で渡して、
ボタンBを押したら、「ボタンB」を引数で渡す。

ということがやりたいのです。この引数を設定する方法を教えて下さい。

Excelだと、ボタンにマクロを登録するときに引数込みで書けばいけますが、
Calcの場合、ボタンにマクロを登録するときに、引数が入力できません。(コントロールのプロパティのイベントのところで、カーソルは入るけれど、入力は受け付けない。)

こちらの環境は、macOS Catalina 10.15.4
LibreOffice バージョン: 6.4.3.2
です。

よろしくお願いします。

うーん、一応できる事はできる。「実行時」に実行されるのは単なるActionListenerのメソッドだし。以下のメソッドを両方のボタンの「実行時」に設定したりすれば。

Private Sub Buttons_actionPerformed(rEvent As com.sun.star.awt.ActionEvent)
    Msgbox(Event.Source.Model.Name)
End Sub

なるほど、こうするとボタンの名前が渡るわけですね。ということは逆に言うと、渡したい引数を名前に仕込んででおけば、何でもできますね。この発想は、全くなかったです。目からうろこがフィーバー状態です。本当にありがとうございます。

関数名は本当にやろうとしていたことの名残。
なお、この手順の場合、コントロールのプロパティのイベントタブには多分登場しない。
厳密には結構面倒くさい仕組みなんだよね、あれ

Option Explicit
Public Sub Main()
    Dim formModel As Object
    Dim buttonModel As Object
    Dim buttoncontrol As Object
    formModel = ThisComponent.DrawPage.Forms.getByIndex(0)
    REM 名前は変更しています。
    buttonModel = formModel.getByName("PushButton1")
    buttoncontrol = ThisComponent.getCurrentController().getControl(buttonModel)
    buttoncontrol.addActionListener(CreateUnoListener("Buttons_","com.sun.star.awt.XActionListener"))
    REM 名前は変更しています。
    REM 変数は使いまわしました。
    buttonModel = formModel.getByName("PushButton2")
    buttoncontrol = ThisComponent.getCurrentController().getControl(y)
    buttoncontrol.addActionListener(CreateUnoListener("Buttons_","com.sun.star.awt.XActionListener"))
End Sub
Private Sub Buttons_actionPerformed(rEvent As com.sun.star.awt.ActionEvent)
    Msgbox(rEvent.Source.Model.Name)
End Sub

formModel等の型名を調べるのが面倒だったので断念。(っていうかこれWriterでしか動作してなかった。これからCalcについて調べます。

→調べました。

ThisComponent.DrawPage => ThisComponent.getSheets().getByIndex(0).DrawPageで行けそうです。

また、getControl(y)はgetControl(buttonModel)の間違いです。実験時に使っていた変数が残ってました。

それから、このコードでリスナを追加した場合、削除しないとファイルを閉じる時にエラーが出るようなのでremoveActionListenerするため、Global変数に保存しておくほうがいいようです。createUnoListenerをニ回も実行する必要はありませんでしたね。

REM  *****  BASIC  *****
Option Explicit

Global actionListener As Object

Public Sub Main()
    REM (略)
    actionListener = CreateUnoListener("Buttons_","com.sun.star.awt.XActionListener")
    buttoncontrol.addActionListener(actionListener)
    REM (略)
End Sub

Public Sub EndExperiment()
    REM (略)
    buttoncontrol.removeActionListener(actionListener)
    REM (略)
End Sub

GlobalとPublicの違いについては再度勉強してきます。

https://opengrok.libreoffice.org/xref/core/basic/source/comp/dim.cxx?r=8b0a6949#211

https://opengrok.libreoffice.org/xref/core/basic/source/comp/dim.cxx?r=8b0a6949#220

なるほど。>GlobalとPublicの違い