質問する
0

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

質問日 2020-05-12 06:57:08 +0100

おやかた のGravatar画像

updated 2020-10-16 16:14:22 +0100

himajin100000 のGravatar画像

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

Sub showMsg(s)
    Msgbox s
End Sub

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

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

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

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

よろしくお願いします。

edit retag flag offensive close merge delete

1 Answer

1

回答日 2020-05-12 11:15:18 +0100

himajin100000 のGravatar画像

updated 2020-05-12 11:36:06 +0100

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

Private Sub Buttons_actionPerformed(rEvent As com.sun.star.awt.ActionEvent)
    Msgbox(Event.Source.Model.Name)
End Sub
edit flag offensive delete link もっと

Comments

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

おやかた のGravatar画像おやかた ( 2020-05-12 12:14:38 +0100 )edit

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

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
himajin100000 のGravatar画像himajin100000 ( 2020-05-12 13:31:14 +0100 )edit

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の違いについては再度勉強してきます。

himajin100000 のGravatar画像himajin100000 ( 2020-05-12 13:34:38 +0100 )edit
himajin100000 のGravatar画像himajin100000 ( 2020-05-12 20:15:42 +0100 )edit
ログイン/サインアップして回答する

質問ツール

1 follower

Stats

Asked: 2020-05-12 06:57:08 +0100

Seen: 98 times

Last updated: May 12 '20