[[20141021095243]] 『入力があれば色塗り』(okada) ページの最後に飛ぶ

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

 

『入力があれば色塗り』(okada)

VBAは余り詳しくないので教えて頂きたいのですが
N列に入力があったら色塗り Deleteしたら色消しをしたいのですが
以下は参考です。ボタンクリックなら可能です
色塗り利範囲はA〜O列です。
よろしくお願いします。

   Dim rng As Range
    Dim n As Long
     If Not TypeOf Selection Is Range Then Exit Sub
    Set rng = Intersect(Selection.EntireRow, Range("A:O"))
    With rng.Interior
        If IsNull(.ColorIndex) Or rng.Interior.ColorIndex = xlColorIndexNone Then 
          .ColorIndex = 6
                 '.Color = vbGreen
        Else
          .ColorIndex = xlColorIndexNone
        End If
    End With

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


 条件付き書式ではだめですか?
http://www.excel.studio-kazu.jp/lib/e2qw/e2qw.html
(稲葉) 2014/10/21(火) 10:04

稲葉さん
ありがとうございます。
リンク先見ましたができればVBAで実行したいのですが
よろしくお願いします。
(okada) 2014/10/21(火) 11:11

 良ければマクロである必要がある理由も聞かせてもらいたいけど・・・

 どちらか使いやすい方選んでください。
 後者はシートモジュールに記述してください。
 後者は複数行・列を変更した場合に対応しておりません。

 個別実行
    Sub 色つけ()
        Dim N列, r As Range, n
        N列 = Filter([TRANSPOSE(IF(N1:N100<>"",ROW(N1:N100),CHAR(2)))], Chr(2), False)
        If UBound(N列) = -1 Then Exit Sub
        Set r = Cells(N列(0), "A").Resize(, [CODE("O")-CODE("A")+1])
        For n = 1 To UBound(N列)
            Set r = Union(r, Cells(N列(n), "A").Resize(, [CODE("O")-CODE("A")+1]))
        Next n
        Range("A1:O100").Interior.ColorIndex = xlNone
        r.Interior.ColorIndex = 6
    End Sub

 イベントタイプ
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Left(Target.Address, 3) <> "$N$" Then Exit Sub
        If Target.CountLarge > 1 Then Exit Sub
        With Target.Offset(, [CODE("A")-CODE("N")]).Resize(, [CODE("O")-CODE("A")+1]).Interior
            If Target.Value <> "" Then
                .ColorIndex = 6
            Else
                .ColorIndex = xlNone
            End If
        End With
    End Sub
(稲葉) 2014/10/21(火) 11:37

 食わず嫌い?

 Sub Sample()
    With Range("A:O")
        .Cells(1, 1).Activate
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlExpression, Formula1:="=$N1<>"""""
        .FormatConditions(.FormatConditions.Count).SetFirstPriority
        .FormatConditions(1).Interior.ColorIndex = 6
        .FormatConditions(1).StopIfTrue = True
    End With
 End Sub
(Mook) 2014/10/21(火) 11:55

稲葉さん
ありがとうございます。
イベントがいいですね(^_^;)
ひとつ聞きたいことがあるのですが
[CODE("A")-CODE("N")]
↑の書き方ですが、初めて見ます
通常Rangeで指定すると思うのですが・・・
意味おしえていただけないでしょうか
Rangeでは指定できるのでしょうか?
よろしくお願いします。

Mookさん
ありがとうございます。
できればWorksheet_Changeでやりたかったので
参考にさせていただき今後利用させてください。
(okada) 2014/10/21(火) 12:44


 OffsetとRisizeの引数に、計算式で数値を当てはめているだけです。
 []は計算式です。
 Target _
    .Offset(, [CODE("A")-CODE("N")]) _
    .Resize(, [CODE("O")-CODE("A")+1])

 単純に-13とか、15でもよかったんですが
 マジックナンバー減らそうかなと思いました・・・
 何となくA列引くN列って後で見た人が分かってもらえたらなーと考えていましたが、
 逆に混乱のもと?

 []はEvaluateメソッドの省略形です。
 詳細はヘルプを参照してください。
 CODEはワークシートの関数です。

 それより片手落ちですがいいんですか?
 一気に値を消したときとか対応していませんよ?
(稲葉) 2014/10/21(火) 13:12

稲葉さん
ありがとうございます。
>それより片手落ちですがいいんですか?
>一気に値を消したときとか対応していませんよ?
この意味がよく解りませんが、いくつかのセルを一気に
Deleteしてみたのですが何も問題ないようですが
どういうことでしょうか?
また
ヘルプ見ましたが理解できるまでいきませんでした。
列指定ですがColumnとかで指定する方法は出来ないのでしょうか?
やはりOffsetで指定するのが普通でしょうか?
何度も申し訳ありませんが
よろしくお願いします。
(okada) 2014/10/21(火) 17:51

 >いくつかのセルを一気にDeleteしてみたのですが何も問題ないようです
 問題ないならいいですけど、たとえばN列に値が入っていて、一気に消すと色残りますよね?

 >ヘルプ見ましたが理解できるまでいきませんでした。 
 何がわからないの?

 >列指定ですがColumnとかで指定する方法は出来ないのでしょうか? 
 行単位に色つけたいのに、Column使って何がしたいのですか?

 Offsetの必要はありませんが、
 Range("A" & Target.Row & ":" & "O" & Target.Row)
 と書くのとどっちが見やすいかは人それぞれだと思います。

 やっぱり条件付き書式をお勧めします。

(稲葉) 2014/10/21(火) 22:09


Range("A" & Target.Row & ":" & "O" & Target.Row) こちらの方があとあと修正しやすいのでは無いかと思うのですが
以下のどこに記入すればいいのでしょうかWith Target.Offset・・の部分に
書き込んで見たのですがエラーが出てしまいました。
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Left(Target.Address, 3) <> "$N$" Then Exit Sub
        If Target.CountLarge > 1 Then Exit Sub
        With Target.Offset(, [CODE("A")-CODE("N")]).Resize(, [CODE("O")-CODE("A")+1]).Interior
            If Target.Value <> "" Then
                .ColorIndex = 6
            Else
                .ColorIndex = xlNone
            End If
        End With
    End Sub
(okada) 2014/10/22(水) 01:15

 どのように入れたのか、どのようなエラーになったのか教えてください。

 それから二回目のレスの問と、前回の二つの問に答えていただけていないのですが?

 >良ければマクロである必要がある理由も聞かせてもらいたいけど・・・

 >>いくつかのセルを一気にDeleteしてみたのですが何も問題ないようです
 >問題ないならいいですけど、たとえばN列に値が入っていて、一気に消すと色残りますよね?

 >>ヘルプ見ましたが理解できるまでいきませんでした。 
 >何がわからないの?
(稲葉) 2014/10/22(水) 06:53

稲葉さん
ありがとうございます。何度もすみません
>どのように入れたのか、どのようなエラーになったのか教えてください。
>以下のどこに記入すればいいのでしょうかWith Target.Offset・・の部分に
>書き込んで見たのですがエラーが出てしまいました。★から右に書いてみました。?
With Target.★Offset(, [CODE("A")-CODE("N")]).Resize(, [CODE("O")-CODE("A")+1]).Interior
>良ければマクロである必要がある理由も聞かせてもらいたいけど・・・
特に考えたわけでは無いですが主観的にMacroを希望しました
別Bookで条件付書式も利用したいと思います。
>たとえばN列に値が入っていて、一気に消すと色残りますよね?
こちらはOKです。
例えば[CODE("A")-CODE("N")]が
なぜCODE("A")マイナスCODE("N")なのかが理解できなかっのです。
こんな状態ですがよろしくお願いします。

(okada) 2014/10/22(水) 09:45


 >。★から右に書いてみました。? 
 まず変数の型からご理解ください。
 TargetはWorksheet_Changeイベントの引数で、Range型です。
 Range.Rangeというプロパティ乃至メソッドは存在しません。

 前々のレスで
 >通常Rangeで指定すると思うのですが・・・ 
 と有りましたので、Range.Interiorが分かっていらしたのかと思っていました。

 本題ですが、TragetからはRowプロパティで取得した値を使用していますので
 >With Target.Offset(, [CODE("A")-CODE("N")]).Resize(, [CODE("O")-CODE("A")+1]).Interior
 これを
 With Range("A" & Target.Row & ":" & "O" & Target.Row).Interior
 としてください。

 >特に考えたわけでは無いですが主観的にMacroを希望しました 
 色を付けたセルをカウントしたい等でしたら、マクロを希望されるのも分かりますが、
 今回の例でマクロを使う必要性を感じません。
 一番オーソドックスな条件付き書式を使う形ですので、是非今回から活用してみてください。

 >なぜCODE("A")マイナスCODE("N")なのかが理解できなかっのです。 
 ワークシートに=CODE("A")と=CODE("N")を別々のセルに入力してみてください。
 そうすれば何となくやりたいことが理解しやすくなると思います。

(稲葉) 2014/10/22(水) 09:58


稲葉さん
昨日から長々とありがとうございました。
> >なぜCODE("A")マイナスCODE("N")なのかが理解できなかっのです。
> ワークシートに=CODE("A")と=CODE("N")を別々のセルに入力してみてください。
> そうすれば何となくやりたいことが理解しやすくなると思います。
文字列の先頭文字を表す数値コードを返します。なぜ"A"が65なのか
これから調べて見ます。
今後共よろしくお願いします。
感謝

(okada) 2014/10/22(水) 12:04


コメント返信:

[ 一覧(最新更新順) ]


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