人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

excelについて。

『特定の範囲の、特定の値に変化があった時に、特定の範囲の、特定の値を削除したい』
お力貸してください。

【例】
特定の範囲:range("b12:b2012")の中にある
特定の値:「2010/04/01」の値が変わったとき(削除したり・変更したり)

特定の範囲:range("e12:e2012")の中にある
特定の値:「1」を削除(Clear)
※この特定の範囲には、『関数』を入れたくない。
なんとか、『VBA』で処理したい。

どうぞよろしくお願いします。

【試したこと】
Worksheetchangeイベント

●質問者: Hos
●カテゴリ:コンピュータ
✍キーワード:Excel VBA イベント 関数
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●20ポイント
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

http://q.hatena.ne.jp/answer


2 ● koriki-kozou
●20ポイント
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を参考にしました

◎質問者からの返答

回答ありがとうございます。

「特定の範囲の、《特定の値》に変化があった時に、特定の範囲の、特定の値を削除したい」

→≪特定の値≫が対応できませんでした。

Intersect(Target, Range(aRange)) ここの記述の仕方で、≪特定の値≫が指定できそうな・・・

調べてみます。


3 ● Chakuwiki
●20ポイント

VBAでタイマーを使うというのはどうでしょう?

変数1=タイマー前の内容

変数2=タイマー後の内容

というように変数を作ってやればよいかと思います。

具体的な処理としては、タイマーで時間が来ると、変数2の内容に特定の範囲の内容を入れて、変数1と変数2が等しいかどうかを判定し、等しくなければれば特定の範囲の内容を削除し、その後変数1の内容に特定の範囲の内容を入れるというのはどうでしょうか?

説明下手ですいません。

参考:http://www.asahi-net.or.jp/~zn3y-ngi/YNxv214.html#8-1

◎質問者からの返答

タイマー。始めて聞きました。

今回のプログラミングの実行タイミングは、特定の値に≪変化があった時≫。

よって、ちょっと難しいと思いました。

しかし、タイマーということがわかってありがたい回答でした。


4 ● SALINGER
●20ポイント

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

http://q.hatena.ne.jp/


5 ● koriki-kozou
●20ポイント

>≪特定の値≫が対応できませんでした。

スミマセン。スッポリと抜け落ちてました

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

http://q.hatena.ne.jp/answer

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ