- ベストアンサー
エクセルのVBAで条件付でフォントを変更したいのですが
たとえばD19のセルには他のセルに入力された文字数が表示されるようLEN(C19)といったような関数が入力されています。D19の値が20より大きければE19のフォントは20にそれ以外なら11にしたいとします。 ちなみにE19も関数が入力さています。 下記でよいのかなと思ったのですが・・・ 直接数値を入力する場合はちゃんと動くのですがD19が数式になるとうまく行きません。どなたか教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$19" Then If Target.Value > 20 Then Range("E19").Font.Size = 20 Else Range("E19").Font.Size = 11 End If End If End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「If Target.Address = "$D$19" Then」の部分で、Worksheet_Changeイベントが発生した原因のセルがD19の場合に処理を行うようになっています。このため、D19に直接入力をした場合だけに期待の動作をするようになります。 ですから、Target.Addressには、D19の値を計算する元ととなるデータを入力するセルの番地を入力することになります。 また、次のようなコードにすると、イベントの発生原因となったセルは特定されません。 Private Sub Worksheet_Change(ByVal Target As Range) If Range("D19").Value > 20 Then Range("E19").Font.Size = 20 Else Range("E19").Font.Size = 11 End If End Sub
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 たぶん、こういうことではないかと思います。 >直接数値を入力する場合はちゃんと動くのですがD19が数式になるとうまく行きません。 Calculate イベントを使うと、うっとうしくてしょうがないので、以下のように、Precedents を使いますが、状況によって、DirectPrecedents でもよいと思います。 エラートラップで挟むのは、D19に数式がない場合をも想定しています。#1さんのおっしゃるように、直接、数式を変化させる[入力するセル]を指定するのが、正しい方法だと思います。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range On Error Resume Next Set r = Intersect(Target, Range("D19").DirectPrecedents) On Error GoTo 0 If Not r Is Nothing Then Application.EnableEvents = False If Range("D19").Value > 20 Then Range("E19").Font.Size = 20 Else Range("E19").Font.Size = 11 End If Application.EnableEvents = True End If End Sub
お礼
ありがとうございます。今回は数式がないということは発生しないのですがこのようにすれば数式がない場合も対応できるのですね。今後の参考にしたいとおもいます。
お礼
ありがとうございました。Target.Address の意味がきちんと理解できてませんでした。おかげで解決しました。