午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

エクセル2007アドイン、セルの塗りつぶしとフォントのパレット作ってみた、その21

前回2日前の続き
 
午後のパレットでセルに色を塗っているところ
 
 

昨日のマクロ

gogowaten.hatenablog.com

エクセルでドット絵、右クリックで色取得、左クリックで色塗りマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
を元にして午後のパレットに追加してみた
 
使い方
イメージ 1
右上にあるチェックボックスにチェックを入れて
パレットからクリックで色を選ぶ
あとはセルをクリックすると塗れる、キーボードの矢印キーでも塗れる
 
本当はチェックボックには連続って表示したんだけど
表示する場所がなくて、うまく表示できなかった
イメージ 2
パレットを大きめの表示にすると表示される
連続って名前はクリックでどんどん色を塗っていくからつけてみたけど
いまいちだなあ、表示名はいつも悩む
 
ダウンロード
ファイル名:午後のパレット_20150418.zip
 
仕様
塗られる色はRGBで指定しているので
テーマを変更してもテーマに沿った色にはならないのは昨日のマクロと一緒
 
不具合
パレットのセルの塗りとフォントカラーを変更すると変な動きになるかも?
ブックをひとつも開いていない状態で使うとエラーになるはず
チェックを入れてから色を選ばないで色を塗ると白色で塗られる
 
参照したところ
 
 
 

2015年5月19日追記
この下にあるメモは新しく書き直した
WithEvents練習、アクティブセルやシート、ブックの変更時に動作させたいものがあるとき ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
追記ここまで
 
 
ここからメモ
今回の機能も以前からあったらいいなあとは思っていたけど
どうすればできるのか昨日までは全く見当もつかなかった
 
クリックした場所に色を塗るんだからクリックされたセルを取得する必要がある
これはワークシートにはSelectChangeっていうイベントが用意されていて
これは選択セルが変更された時に起こるイベントで変更した先のセル範囲を教えてくれる

f:id:gogowaten:20191018105145p:plain

引数のTargetが変更先のセル範囲
でもこれでわかるのはこれを書いたシートだけなので、別のシートでもセル範囲を取得しようとしたらすべてのシートに書くの?そんなのムリだけど仮に全部に書いてもブックを変更したらやっぱりわからなくなる
ってそう思っていました
でも
クラスモジュールに
Public WithEvents mySelectChange As Worksheet '選択セルの変更時のイベント用
Public WithEvents mySheetChange As Workbook 'シート変更時のイベント
Public WithEvents myBookChange As Application 'ブック変更時のイベント
Dim myBook As Workbook
Dim mySheet As Worksheet

'ブック変更時
Private Sub myBookChange_WorkbookDeactivate(ByVal Wb As Workbook)
    MsgBox "BookChanged!"
End Sub

'シート変更時
Private Sub mySheetChange_SheetDeactivate(ByVal Sh As Object)
    MsgBox "SheetChanged!"
End Sub

'セル変更時
Private Sub mySelectChange_SelectionChange(ByVal Target As Range)
    MsgBox "CellChanged! アドレスは→" & Target.Address
End Sub
 

f:id:gogowaten:20191018105336p:plain

標準モジュールに
 
Private cls As New Class1
 
Sub test登録()
    Set cls.myBookChange = Application
    Set cls.mySheetChange = ActiveWorkbook
    Set cls.mySelectChange = ActiveSheet
    
End Sub

f:id:gogowaten:20191018105442p:plain


これでtest登録を実行して
 
 
イメージ 6
この状態から選択セルをC5に変更(クリック)すると
 
イメージ 7
って表示される、選択セルが変更されたのが取得できている
次はシート変更、Sheet2に変更すると
 
イメージ 8
OK
次はブックの変更、Book2を選択してみると
 
イメージ 9
OK、ブック変更も取得できている
 
セルの変更はSelectChangeを使って
シートの変更はSheetDeactivate、ブック変更はWorkbookDeactivate、この二つは
元のシートやブックが非アクティブ状態になった時に動くものみたい
 
クラスモジュールに
Public WithEvents myBookChange As Application
って書くと

f:id:gogowaten:20191018105518p:plain

矢印のところのドロップダウンリストに出てくるので選択すると
 

f:id:gogowaten:20191018105534p:plain

右側のドロップダウンリストにイベントの一覧が出てくるようになる
この一覧は変数に指定した型に合ったものになる
myBookChangeはApplicationに指定したのでApplication用のイベント一覧
 

f:id:gogowaten:20191018105553p:plain

イベントの一覧から例えばWorkbookOpenを選ぶと
赤枠の中の物が追加されて
さあこのイベントが発生した時に何がしたいか書いてって状態になる
 
このままではブックを変更するとシート変更やセル変更のものが動かないから
Module1に書いたtest登録を実行して登録し直す必要があるのでClass1のブック変更時にtest登録を実行するのを書き加えて

'ブック変更時
Private Sub myBookChange_WorkbookDeactivate(ByVal Wb As Workbook)
    MsgBox "BookChanged!"
End Sub

↑を↓に変更

'ブック変更時
Private Sub myBookChange_WorkbookDeactivate(ByVal Wb As Workbook)
    MsgBox "BookChanged!"
    Call Module1.test登録
End Sub

これならブックを変更した先でシート変更やセル変更でも取得できる
 
今回のでクラスモジュールの使い方が少しわかった、今までも似たような使い方はしていたんだけどやっぱり理解できていないなあ
それでもやってみたいことはできたのでかなり満足
 
 
 
続きは2日後