【初月無料キャンペーン中】gooドクター

値を入力した時点で、その値に従って、色々と処理をしたいのですが、その時のイベントが見つかりません。ご存じの方、教えていただけませんでしょうか。

gooドクター

A 回答 (6件)

それは、次のコードに誤りがあるからです。



> Dim str As String
> str = rngTarget.Value
> MsgBox str

#4 のコードでは A1、B1 ともに実行が許可されるセルとなってます。
つまり、A1:B1 を選択して Delキーを押せば、rngTarget には A1:B1 の
2つのセルが参照されています。

 --> #5 のご回答2.の内容です。

この時、rngTarget.Value は A1 と B1 の2つの値を配列で返してますが、
それを受ける変数 str は、一つの値しか代入できない通常の文字列型変数
なので代入に失敗し、エラーになってます。

次のコードならエラーになりません。Address プロパティーは例え rngTarget
が複数のセルであっても、「アドレスという一つの文字列データ」しか返さ
ないからです。

  str = rngTarget.Address

#4 は複数セルの場合に対応させるコードで、Range コレクション という
ものの理解が必須です。ちょっとイキナリ過ぎて、例示としては良くな
かったですね。すみません。

まずは、単純に一つのセルのみで動作するコードを考えてみましょう。


' Sample: A1 セルのときのみ実行する
Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$A$1" Then
    MsgBox Target.Value '<-- A1 単一セルであることが保証されている
  End If

End Sub

とてもシンプルです。まずは、この使い方から理解を深めてみて下さい。

今後の話として説明しておきますが、このコードの場合、例えば A1:C10 セルに
対してデータの貼り付け、またはデータの削除などの操作を行った場合、A1 の
値が変化するにも係わらず、MsgBoxが実行されません。それは、Target.Address
が A1:C10 となるので

  If Target.Address = "$A$1" Then の論理式が False になる

からですね。これでは困る場合、#4 のようなコードで対応することになります。
    • good
    • 2

「フォーカスが隣に移動する」かどうかは入力後のセル移動設定の問題であり、本質ではありません。


Changeイベントは「隣に移動する」かどうかにかかわりなく、ワークシートのセルが変更されたときに発生します。
Changeイベントの認識する「Target」はあくまで変更されたセルです。移動先ではありません。念のため。

ここで注意すべきは、
1.セルの内容を削除した場合にも発生する。
2.セル範囲に対してコピーしたり削除した場合、セル範囲が「Target」と認識される。
3.Changeイベントのプロシージャ内でセルに変更を加えた場合にもイベントは発生するので、そのような処理をする場合は堂々巡りを回避する必要がある。(普通は一時的に EnableEvents プロパティの値を変更してイベントが発生しないようにする。)

以上。
    • good
    • 0

> フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント


> があれば、安全なのだと思いますが‥。

いや、、、だからそのイベントが Worksheet_Change イベントですよ。使い方
の問題です。

#3 のご回答は、プログラムに不慣れな方が扱うにはある意味でその通りだと
思いますが、、

> こんなの自分で使う場合以外の人が使う例では使えないと思います。

そんなことはありません。Change イベントはごく一般的に使われますよ。
Change イベントに致命的欠陥があるわけではありませんし、意図通り動作
しない、エラーが発生するなどの多くの場合はプログラムに問題があるの
であって、それを回避するコードを書くまでです。

#3 のご回答の真意は、「よくよくテストして下さい」だと思いますが、
それはどのようなプログラムであっても共通して言えることですしね。

Change イベント使い方のサンプルを提示しておきます。下記のソースコード
ではセル A1,B:B,C1:D10,E1 以外が変化しても、コードの実行を終了させて
何事もなかったように振舞います。これは、

> フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント

と同意の動作ではないですか?


' シート上のセルの値が変化したとき発生
Private Sub Worksheet_Change(ByVal Target As Range)

  
  ' 以下のコードの動作を許可するセルのアドレスを
  ' カンマ区切りの文字列で定義しておきます
  Const CELL_ADDRESS = "A1,B:B,C1:D10,E1"
  Dim rngTarget As Range
  
  ' Target には変化したセルが参照されていますので、
  ' それを調べて、VBA コード動作させたいセル以外なら
  ' 終了するようにします
  ' また余計なセルが処理対象とならないように、
  ' Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))
  ' として Target を rngTarget に再定義します
  
  Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))
  If rngTarget Is Nothing Then Exit Sub
    
  ' CELL_ADDRESS で定義したセルに対して実行させる処理を以下に記述
  MsgBox "選択セル中、処理対象となったセルのアドレス:" & rngTarget.Address

End Sub

余談ですが、ワークシート上で Enter イベントに相当するのは、
Selection_Change イベントですね。
    • good
    • 1
この回答へのお礼

遅くなりまして、すみませんでした。
お教えいただきましたコードで実行してみました。
Dim str As String
str = rngTarget.Value
MsgBox str
としてみたのですが、おっしゃる通り、例えばA1とA2を一緒に選択してDeleteすると、
str = rngTarget.Value
のコードのところで、”型が一致しません。”というエラーが出てしまいます。A1セルだけ選択してDeleteしても確かにエラーはでないのですが‥。

お礼日時:2006/07/09 21:03

Enterイベントがないですね。


Changeイベントしかないが、Changeイベントは怖いですよ。
キャンセルやコピー貼り付けやDelete やよくテストしてください。
こんなの自分で使う場合以外の人が使う例では使えないと思います。
Application.EnableEvents=Falseを入れなければならない場合にも気をつけて。
    • good
    • 0
この回答へのお礼

経験のおありの方のご指導、ありがとうございました。本来は、フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベントがあれば、安全なのだと思いますが‥。

お礼日時:2006/06/30 22:48

特定のシートならシートのモジュールに


Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Changed " & Target.Address
End Sub

ブック全体なら、ThsWorkBook のモジュールに
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "Changed Sheet " & Sh.Name & " " & Target.Address
End Sub
    • good
    • 1

シートモジュールの Worksheet_Change イベントです。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング