質問: 常に参照もとのセルの書式に従う〔excel〕 例えば、sheet2のa1セルがsheet1のa1セルを参照していたとします(単にsheet2のa1セルが「=sheet1!a1」となっているだけです)。このときに、sheet2のa1の書式設定を参照元であるsheet1のa1セルの書式に常に一致させたいのですが、何か良い方法はないでしょうか? 具体的にいうと、sheet1のa1セルの表示形式が円単位になったり、千円単位になったり、%表示になったりと変化するのですが、その度にsheet2のa1セルの書式も手作業で変えるのが面倒です。表示単位はその都度カスタマイズすることもあるのでマクロで登録することにも無理があります。 それか、vbaで参照もとの書式の情報を返して、それを参照先セルに反映させることができますでしょうか? できれば、何もせずフルオートで対応できるとありがたいのですが。
回答: こんにちは。wendy02です。 罫線やパターンを除く書式コピー >現在、参照もとの罫線やセルの背景色まで取り込まれてしまいました。 'シートモジュール private sub worksheet_activate() 'シートをアクティブにすると書式が設定させる dim rng1 as range dim rng2 as range dim ar as range application.screenupdating = false on error resume next with worksheets("sheet1").usedrange on error resume next set rng1 = .specialcells(xlcelltypeformulas, 3) '定数-文字,数字 set rng2 = .specialcells(xlcelltypeconstants, 3) '数式-文字,数字 if rng1 is nothing and rng2 is nothing then exit sub '設定させるものがない if rng1 is nothing then '定数がない場合 set rng = rng2 elseif rng2 is nothing then '数式がない set rng = rng1 else '両方ともある set rng = union(rng1, rng2) end if set rng1 = nothing: set rng2 = nothing end with on error goto 0 for each ar in rng activesheet.range(ar.address).numberformatlocal = ar.numberformatlocal next application.screenupdating = true set rng = nothing end sub >「private」とプロシージャの先頭に記述して標準モジュールとしてではなくsheetコードとして入力することでフルオート実行なっているのでしょうか? すでに、merlionxxさんから、ご説明されていますが、標準モジュールは、個別のオブジェクト(シートやブック)を持たない、つまり、[反応を受けるための器]がないので、フルオートには出来ません。個別のオブジェクトを持つと、自動的なマクロ(イベント・ドリブン型)にすることが出来ます。しかし、あくまでも、他から設定されないようにするために、private というキーワードが必要になります。このキーワードをつけることで、[反応を受けるための器]は、そのシートのみで設定されることになります。 厳密に言うと、もう少し複雑になります。