[[20151208042453]] 『条件付き書式マクロについて』(yama) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『条件付き書式マクロについて』(yama)

以下にて、文字色を設定しています
対象となるセルの色が変わると同時に同じ行の左隣のセル2つ(A・B列)も同時に
変化させる方法を教授ください。
よろしくお願いします
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range, Rmg As Range
    Dim i As Long
    If Not Intersect(Target, Range("C6:C20")) Is Nothing Then
    For Each rng In Target
        With rng
            Select Case True
                Case .Value Like "*誕生日*": i = 3
                Case .Value Like "休日": i = 2
                    .Font.Bold = True
                Case .Value Like "*記念日*": i = 5
                Case Else: i = 0
                    .Font.Bold = False
            End Select
            .Font.ColorIndex = i
        End With
    Next
    Set rng = Nothing

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 .Font.ColorIndex = i

 これを

 .EntireRow.Range("A1:C1").Font.ColorIndex = i

 で試してみてください。

 もし太字も反映させるなら .Font.Bold  のところも .EntireRow.Range("A1:C1").Font.Bold に。

(β) 2015/12/08(火) 08:22


        With rng
            Select Case True
                Case .Value Like "*誕生日*": i = 3
                Case .Value Like "休日": i = 2
                     .Offset(, -2).Resize(, 3).Font.Bold = True
                Case .Value Like "*記念日*": i = 5
                Case Else: i = 0
                     .Offset(, -2).Resize(, 3).Font.Bold = False
            End Select
            rng.Offset(, -2).Resize(, 3).Font.ColorIndex = i
        End With

 みたいな感じでいいのかな?
(se_9) 2015/12/08(火) 08:52

(β)さん
(se_9)さん
ありがとうございます。
無事色変更はできたのですが、実は月予定カレンダーに
組み込んで利用しているのですが年月を変更し毎月変更

日付(A列)・曜日(B列)・誕生日/記念日など(C列)
C列部分は関数で表示させている。
=IF(MONTH(DATE($D$4,$F$4,A6))=$F$4,IF(ISNA(VLOOKUP(DATE($D$4,$F$4,A6),休日,3,FALSE)),"",VLOOKUP(DATE($D$4,$F$4,A6),休日,3,FALSE)),"")
シートに変化があったときマクロ作動は、よってカレンダーへは直接記入しない
場合があるのですが イベントの種類Worksheet_Change Worksheet_SelectionChange
変更してみたのですが 年月を変更しただけではイベントが発生しないようです
対象のセルをClickすれば色が変化します。
上記のような使い勝手の場合のイベントは何れ設定すれば変化する年月日に対応出来るのでしょうか
わかりにくい説明ですみません。
よろしくお願いします。

(yama) 2015/12/08(火) 12:13


 式による値の変化ではChangeイベントは発生しませんので、その式で参照している(かつ、実際に入力するる)セルの変化をウォッチして
 イベント処理をします。
 その入力により、C6〜C20 が、どのように変化するのかわからないので、そこは、そちらで考えてください。

 やっかいなのは、関連の入力セルが複数あった時ですね。
 1つ目のセルの変化で処理、2つ目のセルの変化でも、またまた処理、3つ目のセル・・・・

 このあたりも、実際の入力運用がどうなっているのかわからないので、そちらで考えてください。

(β) 2015/12/08(火) 16:08


(β)さん
ありがとうございます。
やはり式変化では×なのですね
基本 年と月の入力でシートが変わります。
年が("D4:E4") 月が"F4"となります。年月変更後対象セルをClick
すれば、Changeイベントが動作するのですが
これに変わる何か?VBAはないのでしょうか・・・
(yama) 2015/12/08(火) 16:53

 If Not Intersect(Target, Range("C6:C20")) Is Nothing ThenとEnd Ifを削って
 For Each rng In TargetをFor Each rng In Range("C6:C20")に変更

 C6セルをダブルクリック(またはF2キー)→ Enter
 で色が変わるけど面倒ですよね。

 ちなみに訂正ですが
 rng.Offset(, -2).Resize(, 3).Font.ColorIndex = i
 のrngはいらなかったですね。
(se_9) 2015/12/08(火) 17:29

(se_9)さん
ありがとうございます。
やはりひと手間必要なんですね、わかりました
そんな都合のいいものないのですね。
いろいろ考えていただきありがとうございました。
感謝(-_-;)
(yama) 2015/12/08(火) 18:38

 >>これに変わる何か?VBAはないのでしょうか・・・

 いやぁ・・・
 Changeイベントなんでしょうね。ただし、変更対象は C6:C20 ではなく、年と月のセル。
 ただ、申し上げたように、2つのセルのいずれが入力されても発生しますから、無駄な処理が行われるわけです。
 めったに実害はないでしょうし、今回のテーマでは大丈夫でしょうけど、仕様によっては不具合が発生することもあるかもしれません。

 それより、年と月を別のセルにしているのが、面倒を生み出す元だと思います。

 基準月を1つのセルにして2015/12 といったように入力。実際のデータは 2015/12/1 になりますが表示書式でyyyy年m月にしておきます。
 そうしておけば、イベントを発生させるトリガーは、この年月をいれるセルに変更があった場合の Changeイベント。

 VBA内でもシート関数上でも、年は Year(そのセル) で取得できますし、月は Month(そのセル) で取得できます。

 そうしておいて、そのセルに変更があれば、C6:C20をすべてループで処理します。

 この構えでいかがですか?

(β) 2015/12/08(火) 18:46


(β) さん
ありがとうございます。
カレンダーの仕様は、以下に変更しあました。
> 基準月を1つのセルにして2015/12 といったように入力。実際のデータは 2015/12/1 になりますが表示書式でyyyy年m月にしておきます。
> そうしておけば、イベントを発生させるトリガーは、この年月をいれるセルに変更があった場合の Changeイベント

以下のループ方法が?です 範囲→"C6:C20,M6:M21"
よろしくお願いします。
> そうしておいて、そのセルに変更があれば、C6:C20,M6:M21をすべてループで処理します。
> この構えでいかがですか?

(yama) 2015/12/08(火) 19:30


 C6:C20 と M6:M21 の関係がよくわかりません。(M6:M20 なら、想像はつくのですが)

 C6:C20 は計算式の結果ですよね。

 たとえば M6 が変更になると、C6が変わる、M7 が変更になると C7 がかわるということですか?
 それにしては M21 がよくわかりません。

(β) 2015/12/08(火) 23:56


(β)さん
概略を説明いたします
月間予定表なのでA列が15日まで K列が16〜31日まで
数値入力済みです
      A    B     C        E・・・ K    L       M       N
1〜5行目まで見出し行など

 6    1   曜日  記念日など  予定   16 曜日  記念日など   予定など
 7    2                                 17
 8    3                                 18
 9    4                                 19
 ・   ・                                ・
 20  15                                 30
 21  空                                 31

B6=TEXT(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)),"aaa")
C6=IF(MONTH(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)))=MONTH($D$4),IF(ISNA(VLOOKUP(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)),休日,3,FALSE)),"",VLOOKUP(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)),休日,3,FALSE)),"")
こんな感じの予定表です。
したがって今回対象列はC列とM列ということになります。
お解りいただけますか。
よろしくお願いします
(yama) 2015/12/09(水) 00:45


 マクロはエキスパートのβさんにおまかせするとして(無責任ですみません)
 エクセルのバージョンが2013なので、C6セルの関数は
 =IF(MONTH(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)))=MONTH($D$4),IFERROR(VLOOKUP(DATE(YEAR($D$4),MONTH($D$4),DAY(A6)),休日,3,FALSE),""),"")

 でもいいと思います。
(se_9) 2015/12/09(水) 06:04

 日付入力を D4 に一本化されたわけですから D4 の変化「のみ」を判定し、変化したら
 C6:C20,M6:M21 「すべて」を処理します。

    If Not Intersect(Target, Range("C6:C20")) Is Nothing Then
    For Each rng In Target

 ここを

    If Not Intersect(Target, Range("D4")) Is Nothing Then
    For Each rng In Range("C6:C20,M6:M21")

 なお、ブロックが2つですから、書式設定を3列分行うコードは、(se_9)さん提示の Offset型にする必要がありますね。

(β) 2015/12/09(水) 07:58


βさん
ありがとうございました。
無事イベント発生 快適です!

se_9さん
旧バージョンで作成したままでした。
ISNAは不要なんですね スッキリしました。
ありがとうございました。

また、質問させていただくことも
あると思いますがその節はよろしくお願いします
(yama) 2015/12/09(水) 12:28


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.