excelについて。


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

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

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

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

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

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/05/18 20:34:22
  • 終了:2010/05/25 20:35:03

回答(5件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982010/05/18 21:02:15

ポイント20pt
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

id:koriki-kozou No.2

koriki-kozou回答回数480ベストアンサー獲得回数792010/05/18 21:15:50

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

id:HistoryPub

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

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

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

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

調べてみます。

2010/05/19 12:38:34
id:Chakuwiki No.3

Chakuwiki回答回数114ベストアンサー獲得回数52010/05/18 21:17:40

ポイント20pt

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

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

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

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

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

説明下手ですいません。

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

id:HistoryPub

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

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

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

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

2010/05/19 12:41:09
id:SALINGER No.4

SALINGER回答回数3454ベストアンサー獲得回数9692010/05/18 21:37:43

ポイント20pt

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/

id:koriki-kozou No.5

koriki-kozou回答回数480ベストアンサー獲得回数792010/05/19 15:52:04

ポイント20pt

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

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません