選択されているセルの背景色の取得
LibreOffice Calcでの背景色の取得をBasicで行ってみます。背景色は32ビットLong型整数で得られます。
R,G,Bのそれぞれの値が8ビットずつ詰め込まれています。それぞれの色成分を取り出すには、ビット演算を行います。
また、選択セルの取得時に、選択は単独セルで行われているかチェックしています。
実行すると、メッセージボックスに 255-255-0 のような形でR,G,Bのそれぞれの値を表示し、さらに
セル(0,0)にも同様の文字列を挿入します。
具体的なR,G,B各値の切り出しは、Function GetRGBsepalatelyの中で行っています。この関数では
引数としてRGBを表すLong型整数と、R,G,Bのどの色成分を取り出すかを指定する整数(0,1,2のいずれか)を
指定します。返す値は指定された色成分の強度(0から255)です。
もともとはExcelで特定のセルをクリックしたときにダイアログを出したいとき、セルの背景色によって
特定のセルかどうかの判断をするというマクロを作ったことがあり、その移植を考えたときにセル背景の取得の
確認のために作ったものです。例えば、黄色の背景色のセルをクリックしたら、入力用ダイアログを出すように
するためには、シート全体のセルのクリックに対するイベントハンドラを設定し、その中で背景色を
チェックして黄色なら入力用ダイアログを表示し、黄色でなければ何もしない、という形になります。
お遊びプログラムでは、シート全体の背景色を青にしたセルにランダムにペアとなる言葉を同じく青色の文字色で配置し(たとえば
百人一首の上の句と下の句)、クリックしたら背景色を白にして見えるようにし、
神経衰弱ゲームを作るといったことができますね。
一度めくったセルは背景色が白かどうかで判別すればいいわけです。
Sub BackColorTest Dim oSheet as Object Dim oCell As Object Dim oSel as Object Dim sRGB as String On Error Goto ErrorHandler oSheet = ThisComponent.CurrentController.ActiveSheet oSel = ThisComponent.CurrentController.getSelection() 'oSel =ThisComponent.CurrentSelection '上の書式でもどちらでも。 if not (oSel.ImplementationName = "ScCellObj") then oCell = oSheet.getCellByPosition(0, 0 ) oCell.String="NoSingleSelection" Exit Sub End If sRGB = CStr(GetRGBsepalately(oSel.CellBackColor, 0))+ "-" + _ CStr(GetRGBsepalately(oSel.CellBackColor, 1))+ "-" +_ CStr(GetRGBsepalately(oSel.CellBackColor, 2)) MsgBox( sRGB ) oCell = oSheet.getCellByPosition(0, 0 ) '書き込みセル指定 oCell.String ="RGB=("+sRGB +")" Exit Sub ErrorHandler: MsgBox "Error: " & Error End Sub Function GetRGBsepalately(rgb as Long, cid as integer) as integer 'cid 0:red, 1:green 2:blue Dim wk as Long if cid=0 then 'Red wk = rgb AND &HFF0000 wk = wk /&H10000 GetRGBsepalately = wk elseif cid=1 then wk = rgb AND &H00FF00 wk = wk /&H100 GetRGBsepalately = wk elseif cid=2 then wk = rgb AND &H0000FF GetRGBsepalately = wk else GetRGBsepalately = -1 end if End Function
OpenOfficeマクロプログラミング―「Writer」「Calc」「Base」…OOoをBasicで便利に! (I・O BOOKS)