スポンサーリンク

OOo Calc Basicマクロで,シート上の「セル値が変更」されたタイミングでイベントを実行する簡単な方法

Excel/Wordオフィス製品のTipsまとめへ


OpenOffice.org CalcのBasicマクロで,セル内容が変更(値が書き換え)されたタイミングでマクロを実行するサンプルコード。

セル内容の変更イベントをキャッチする簡単な方法がある。

イベントの内容をコーディングする

ツール>マクロ>マクロの管理>(ブック名)>Standard>Module1
で編集を押下。


下記のルーチンを追加。

Sub fuga
	' セル内容が変更された時のイベント
	
	
	' 現在の選択範囲
	oSelection = ThisComponent.CurrentController.Selection
	
	' 行番号と列番号
	y = oSelection.CellAddress.Row
	x = oSelection.CellAddress.Column
	
	' 表示
	Msgbox y & "行" & x & "列の内容が変更されました。"
	
End Sub

イベントとして登録する

シート側で,
編集>シート>イベント>内容を変更した時
で「割り当て:マクロ」を押下。

ブック名)>Standard>Module1
で,先ほどコーディングしたマクロ関数の fuga を選択してOK。


これでOK。

セルの内容が変更されると,そのタイミングでマクロが実行され,そのセルの番地が表示される。

改良版のイベント

ところで,複数セルが同時に変更されたらどうなるか?

たとえばマウスで複数セルを選択して,バックスペースキーを押す。
すると,その選択範囲のセル内容が全て削除される。

そういう場合,冒頭のコードではセル番地を取得できない。

CellAddressプロパティが動作するのは1セルの場合のみだから。


この場合は,下記のようなイベントコードに書き換えれば
複数のセルをRangeのアドレスとして,「A1:A10」のような文字列で取得できる。

Sub fuga
	' セル内容が変更された時のイベント
	' (複数セルを一度に変更した時に対応)
	
	
	' 現在の選択範囲
	oSelection = ThisComponent.CurrentController.Selection
		
	' Rangeのセル番地を取得
	oRangeAddrConv = ThisComponent.createInstance("com.sun.star.table.CellRangeAddressConversion")
	oRangeAddrConv.Address = oSelection.RangeAddress
	s = oRangeAddrConv.UserInterfaceRepresentation 

	msgbox s

End Sub


Rangeのセル番地を得る方法については下記エントリを参照。

OOo CalcのBasicマクロで,セルの行・列番号を変換して,"A1"等のセル番地・アドレス表現文字列を取得する方法
http://computer-technology.hateblo.jp/entry/20150525/p1

  • セル範囲(range)を行番号と列番号で指定し そのアドレス表現を得る方法

※まあ,この方法でも,「Ctrlキーを押しながら長方形ではない範囲のセル領域を飛びとびに選択した場合」は対処できないんだけどね・・・。

補足:OpenOfficeのバージョンが古いと,シートへのイベント割り当てが面倒

古いOpenOfficeだと,シートにイベントを設定するのが非常に面倒。

イベントリスナーを複雑な方法で実装する必要があった。

OOobbs2/84 - ...?
http://hermione.s41.xrea.com/pukiwiki...

  • これらリスナーを利用するには Broadcaster にリスナーを追加する必要があるので、まずドキュメントを開いたときなどのイベントにマクロを割り当ててリスナーを追加するマクロを実行させる必要があります。


faq/4/1165 - OpenOffice.org Q&A
http://oooug.jp/faq/index.php?faq%2F4...

  • イベントリスナーを追加した後に、選択されているセルの行と列番号の取得は・・・


しかし,3.3 以降のバージョンでは,シートにイベントを割り当てる操作が簡単になった。

冒頭のコードも,この新機能を利用している。

OpenOffice.org Calcについて質問です。例えばA1のセルに値を入れると...
http://detail.chiebukuro.yahoo.co.jp/...

  • Calc 3.3 では、 各シ-トの7つのイベントに、マクロを割り当てることが、 可能となりました。 ↓


[解決] セルの変更時のイベント発生方法 ⇒ 編集-シート-イベントまたはツール-カスタマイズ-イベントから | LibreOfficeForum.org
http://ja.libreofficeforum.org/node/1840

  • 編集→シート→イベントは、わりと最近追加された機能で、ちょっと前までは、EventListenerというものを使って、ちょっと難しいマクロを実装しないといけませんでした。

Excel/Wordオフィス製品のTipsまとめへ