[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『範囲以外は警告』(イッコウ)
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.