[[20130327151228]] 『範囲以外は警告』(イッコウ) ページの最後に飛ぶ

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

 

『範囲以外は警告』(イッコウ)

 Excel2003 WindowsXP

   E   F  G   H   I    J    K   L

 1  A    1000           100   10
 2  B    2000           150   13.33

 L=G/Kなのですが(EGKは手入力)
 E=Aならば
 Lが5以上11以下であればOK
 それ以外ならば警告
 E=Bならば
 Lが15以上20以下であればOK
 それ以外ならば警告
 E=Cならば
 ・
 ・
 という感じの警告を出したいのですがこういうものを関数ではなく
 マクロで可能なのでしょうか?

 分かる方お願いいたします。
 (イッコウ)


 範囲外だったら赤にするというような条件付書式ではダメなのでしょうか。
 (Mook)

 行数が200行近くありまして
 同じようなシートが20シートあるので関数や条件付き書式では重たくなるような気がしまして。
 マクロでは不可能でしょうか?
 (イッコウ)

 >マクロでは不可能でしょうか?

 要件を正確に説明してくれれば、もちろんできるよ。

 ・チェックのタイミングは? 入力が終わって、さぁ、全体をチェックしよう?
  それとも、行毎に関連の項目がそろったとき(E列、G列、K列)に都度自動的にチェック?
 ・チェックして、警告を出して、それからどうする? 警告出しただけで、無視されるかもしれないよね?
 ・「同じようなシートが20シート」 処理対象のシートは、ブック内の全シート?
  それとも特定のシート?特定のシートの場合、なにか、これが特定シートだという判断がつくものがある?
  シート名とか。
 ・何よりも、条件を全て網羅することが必要。「E=Cならば・・・」といわれても、困ってしまう。

 (ぶらっと)

 チェックのタイミングはEGK列を入力終わった時に入力都度チェックです。
 その一行が一作業なのでL列が計算されるとチェックしたいです。

 警告を出してその範囲内でなければ警告を出して後修正をしなければ色変更をしたいです。
 (その範囲内に必ず数字はおさまるはずなので入力ミスを見つけるため)

 20シートは同じブック内ですが全シートではなくほかのシート名もありますが
 チェックするシート名は1号から20号です。

 1号のシートのE列の場合
 Aは東京Bは大阪といった感じのシートごとの決まりがあります
 2号シートのE列の場合
 Aは東芝Bはソニーといった感じです。

 1号シートならば
 E列が=Aならば(東京)
 L列が5以上11以下であればOK
 それ以外ならば警告
 E列=Bならば(Bは大阪)
 L列が15以上20以下であればOK
 それ以外ならば警告
 E列=Cならば(Cは宮崎)
 L列が40以上100以下であればOK
 それ以外ならば警告

 といった感じです。
 よろしくお願いします。
 (イッコウ)


 マクロでのやり方を知りたいということでしたら、それはそれでかまいませんが、
 1シートで200行くらいならばデータとしては、表示が遅くなるほどの量ではない気がします。

 式を設定するのが大変ということも、回避する理由にはなるかと思いますし、
 式の内容やPCの性能にも依存するとは思いますが、データ量が性能に影響するのは数千行、
 数万行のオーダーというのが個人的感覚です。
 (Mook)

 Mookさん指摘通り、この程度のデータ量であれば、条件付き書式で問題ないように思うし、
 さらに、エラーはエラー、直さなきゃいけないという運用であれば、入力規則をからませることも検討の価値があるかも。

 むしろ、関数処理であれマクロ処理であれ、同じコードでもシート毎に、しきい値が異なるのであれば
 下限値や上限値を、シート/コード毎に登録したテーブルを作っておいて、判定は、そのテーブルを見るようにすることを 推奨。

 通常は、1つのマスタシートのようなものにまとめるのだろうけど、本件は、入力と同じシートの
 きまった場所に配置しておいた方が、なにかといいような予感がする。

 (ぶらっと)


 E列のA,B,C,・・・は何種類ほどあるのでしょうか?
 またシート毎に条件が違うのでしょうか。

 >E列のA,B,C,・・・は何種類ほどあるのでしょうか?
 シートごとに違うのでA〜GもあればA〜Mもありますし。。
 >またシート毎に条件が違うのでしょうか。
 上記に記載してるとおり1号から20号はMIN MAXは違います。

 条件付き書式や入力規則でやってみて共有にした場合でも重たさは大丈夫でしょうか?
 (イッコウ)


 >条件付き書式や入力規則でやってみて共有にした場合でも重たさは大丈夫でしょうか?

 関数や条件付き書式は、たえず、シート上の変化をウォッチしているので、重いことは重い。
 だけど、VBAでイベントプロシジャを使っても、結局は、変化をウォッチするわけだから
 イーブンかな。(双方を準備して比較した上でのコメントではなく推測)

 (ぶらっと)

 とりあえずVBAで書いてみた。(11:05 ループを1階層減らしてリバイス)

 1号 や 20号 シートの X,Y,Z 列に、1行目から、このシート用のテーブルがあるという前提。
 X列が記号、Y列が下限値、Z列が上限。

 3項目のどれかに入力があり、まだ3項目がそろわない状況は、とりあえず、その行のE列、G列、K列を黄色に。
 3項目すべてがそろったときに必要なチェックを行い、エラーがあれば、その行のE列、G列、K列を赤色にするとともに
 エラーメッセージ表示。

 なお、該当の入力欄で、コピペやフィルコピーで、同時に複数の値が入っても対応する形にしてあるので
 コードとしてはループが入り、ちょっと煩雑かな?

 ThisWorkbookモジュール(VBE画面で左上のプロジェクトエクスプローラの ThisWorkbook をダブルクリックしてでてくるところ)

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim a As Range
    Dim r As Range
    Dim n As Variant
    Dim er As Boolean
    Dim ck As Boolean
    Dim g As Variant
    Dim k As Variant
    Dim l As Double

    If Right(Sh.Name, 1) <> "号" Then Exit Sub
    If Not IsNumeric(Left(Sh.Name, Len(Sh.Name) - 1)) Then Exit Sub

    Set a = Intersect(Target, Sh.Range("E:E,G:G,K:K"))
    If a Is Nothing Then Exit Sub

    For Each r In a.Rows
        With r.EntireRow
            er = False
            'まず、入力された行のE,G,K列の背景色を削除
            .Range("E1,G1,K1").Interior.ColorIndex = xlNone
            '3項目すべて入力あるか?
            If WorksheetFunction.CountA(.Range("E1,G1,K1")) < 3 Then
                '3項目未完成なら、とりあえず黄色
                .Range("E1,G1,K1").Interior.Color = vbYellow
            Else
                'コードが正しいか
                n = Application.Match(.Range("E1"), Sh.Columns("X"), 0)
                '正しければ
                If IsNumeric(n) Then
                    g = .Range("G1").Value
                    k = .Range("K1").Value
                    'G列、K列が数値か?
                    If WorksheetFunction.Count(g, k) = 2 Then
                        'K列がゼロではないか?
                        If k <> 0 Then
                            l = g / k
                            '結果が範囲内か?
                            If l < Sh.Cells(n, "Y").Value Or l > Sh.Cells(n, "Z").Value Then
                                '範囲外
                                er = True
                            End If
                        Else
                            'K列がゼロ
                            er = True
                        End If
                   Else
                        'K列またはG列が数字以外
                        er = True
                   End If
                Else
                'コードが正しくなければ
                    er = True
                End If
            End If
            'この行にエラーがあれば
            If er Then
                ck = True
                .Range("E1,G1,K1").Interior.Color = vbRed
            End If
        End With
    Next
    '処理した行のどこかにエラーがあれば
    If ck Then MsgBox "エラーがありました"

 End Sub

 (ぶらっと)


 完璧です。
 ありがとうございました。
 (イッコウ)

 上記マクロで範囲外(赤色)の場合はO列に”要チェック”と文字を入れることは可能でしょうか?
困惑してます。
 試行錯誤しましたができませんでした。お助けください。

 (イッコウ)

コメント返信:

[ 一覧(最新更新順) ]


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