『特定の範囲の、特定の値に変化があった時に、特定の範囲の、特定の値を削除したい』
お力貸してください。
【例】
特定の範囲:range("b12:b2012")の中にある
特定の値:「2010/04/01」の値が変わったとき(削除したり・変更したり)
↓
特定の範囲:range("e12:e2012")の中にある
特定の値:「1」を削除(Clear)
※この特定の範囲には、『関数』を入れたくない。
なんとか、『VBA』で処理したい。
どうぞよろしくお願いします。
【試したこと】
Worksheetchangeイベント
Dim moto As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If Not moto Then Exit Sub For a = 12 To 2012 If Cells(a, "e") = "1" Then Cells(a, "e") = "" Next a End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) moto = False If Not (Target.Row >= 12 And Target.Row <= 2012 And Target.Column = 2) Then Exit Sub If Target = "2010/04/01" Then ' "2010/04/01" としてありますが、書式設定が 日付の場合 "2010/4/1" で同じと判断されます。 moto = True End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim aRange As String, bRange As String, cValue As Variant aRange = "b12:b2012": ' 監視対象のセルを書く bRange = "e12:e2012": ' 置換対象のセルを書く cValue = 1: ' 置換対象の値を書く If Intersect(Target, Range(aRange)) Is Nothing Then Exit Sub Range(bRange).Replace What:="1", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False End Sub
http://q.hatena.ne.jp/1271258646 の回答4と5を参考にしました
VBAでタイマーを使うというのはどうでしょう?
変数1=タイマー前の内容
変数2=タイマー後の内容
というように変数を作ってやればよいかと思います。
具体的な処理としては、タイマーで時間が来ると、変数2の内容に特定の範囲の内容を入れて、変数1と変数2が等しいかどうかを判定し、等しくなければれば特定の範囲の内容を削除し、その後変数1の内容に特定の範囲の内容を入れるというのはどうでしょうか?
説明下手ですいません。
タイマー。始めて聞きました。
今回のプログラミングの実行タイミングは、特定の値に≪変化があった時≫。
よって、ちょっと難しいと思いました。
しかし、タイマーということがわかってありがたい回答でした。
WorksheetChangeイベントだと変更前の値が使えないのでちょっと工夫が必要です。
そこで、シートがアクティブになるタイミングで特定の範囲を配列に格納して、その値から判別しました。
シートモジュールに貼り付けて、最初の一度だけシートをアクティブにする必要があるので、
シートを切り替えてから試してみてください。
最初の数行は例の範囲と値を設定出来るようにしてあります。
Private Const rng As String = "B12:B2012" Private Const rng2 As String = "E12:E2012" Private Const str As String = "2010/04/01" Private Const str2 As String = "1" Private h As Variant Private Sub Worksheet_Activate() h = Range(rng) End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range If Intersect(Target, Range(rng)) Is Nothing Then Exit Sub If h(Target.Row - Range(rng).Row + 1, Target.Column - Range(rng).Column + 1) = str Then For Each r In Range(rng2) If r.Value = str2 Then r.Value = "" End If Next End If h(Target.Row - Range(rng).Row + 1, Target.Column - Range(rng).Column + 1) = Target.Value End Sub
>≪特定の値≫が対応できませんでした。
スミマセン。スッポリと抜け落ちてました
UNDOを使おうかとも思いましたがUNDOには絶対的信頼は出来ない部分もありますので
セルが選択された段階で値を事前チェックしておく方法で作ってみました
(ドラッグして複数セルが選択されている場合も考慮すると処理が複雑になり正直かなり面倒なので
複数セルが選択された場合は強制的に1セル選択に替えるという手段を用いています)
Option Explicit Const aRange = "b12:b2012": ' 監視対象のセルを書く Const bRange = "e12:e2012": ' 置換対象のセルを書く Const cValue = 1: ' 置換対象の値を書く Const dValue = "2010/04/01": ' 監視対象の値を書く Private eValue As Variant: '変更前の値が監視対象かどうか判定 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range(aRange)) Is Nothing Or eValue <> True Then Exit Sub Range(bRange).Replace What:="1", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range(aRange)) Is Nothing Then '監視対象外 eValue = False Exit Sub ElseIf Target.Cells.Count > 1 Then '監視対象を含んだ複数セルが選択された場合は強制的に1セルだけ選択にしてしまう Application.EnableEvents = False: '無限ループ回避のためイベント処理呼び出しを一時禁止 Cells(Target.Row, Target.Column).Select: 'セル選択 eValue = IIf(Selection.Value = dValue, True, False): 'セルの内容チェック Application.EnableEvents = True: 'イベント処理を再開 Else '監視対象内で1セルが選択された場合 eValue = IIf(Target.Value = dValue, True, False): 'セルの内容チェック End If End Sub
回答ありがとうございます。
「特定の範囲の、《特定の値》に変化があった時に、特定の範囲の、特定の値を削除したい」
→≪特定の値≫が対応できませんでした。
Intersect(Target, Range(aRange)) ここの記述の仕方で、≪特定の値≫が指定できそうな・・・
調べてみます。