Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7229 / 13645 ツリー ←次へ | 前へ→

【40409】ワークシートチェンジイベントについて aaa 06/7/13(木) 13:14 質問[未読]
【40412】Re:ワークシートチェンジイベントについて Statis 06/7/13(木) 13:37 回答[未読]
【40413】Re:ワークシートチェンジイベントについて ハト 06/7/13(木) 13:52 発言[未読]
【40416】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 15:01 質問[未読]
【40418】Re:ワークシートチェンジイベントについて Statis 06/7/13(木) 15:19 発言[未読]
【40423】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 15:34 発言[未読]
【40425】Re:ワークシートチェンジイベントについて Statis 06/7/13(木) 15:46 発言[未読]
【40426】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 15:54 発言[未読]
【40428】Re:ワークシートチェンジイベントについて Statis 06/7/13(木) 16:03 回答[未読]
【40432】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 16:58 発言[未読]
【40434】Re:ワークシートチェンジイベントについて ハト 06/7/13(木) 17:12 回答[未読]
【40436】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 17:33 お礼[未読]
【40419】Re:ワークシートチェンジイベントについて ハト 06/7/13(木) 15:22 発言[未読]
【40424】Re:ワークシートチェンジイベントについて aaa 06/7/13(木) 15:39 発言[未読]
【40427】Re:ワークシートチェンジイベントについて ハト 06/7/13(木) 15:55 発言[未読]

【40409】ワークシートチェンジイベントについて
質問  aaa  - 06/7/13(木) 13:14 -

引用なし
パスワード
   いつもお世話になっております。
ワークシートチェンジイベントで下記のようなコードを書きました。
しかしエラー処理などを入れているうちにうまく動かなくなり、元に戻したのですがやっぱり動きません。
どこがおかしいのでしょうか??
同じようなコードを書こうとしているワークシートは6枚あります。
そのシートにはデータ一覧とグラフがあり、B1とD1には日付が、G1にはグラフの最大値が入っています。
この3つの値どれかひとつでも変更すると一覧とグラフが切り替わるようにしたいと思っています。
以下の場合のグラフ作成のサブルーチンは1_creategraphです。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    Application.ScreenUpdating = False  
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    With Target
      If onDate Or ofDate Or maxvalue Then
        1_creategraph
      End If
    End With
  Application.EnableEvents = True
End Sub

またエラー処理(3つのセルに値が入力されなかった場合と、B1の日付がD1よりも上回った場合)もしたいです。
あとエラーが出た場合セルのフォーカスをしない処理にしたいです。
以下のようにこれらのエラー処理を入れた後から動かなくなりました。

If maxvalue = "" Then
  MsgBox "最大値を入れてください"
  Worksheets("Sheet1").Range("G1").Activate
End If
If onDate = "" Then
  MsgBox "日付を入れてください"
  Worksheets("Sheet1").Range("B1").Activate
End If
If ofDate = "" Then
  MsgBox "日付を入れてください"
  Worksheets("Sheet1").Range("C1").Activate
End If
If onDate > ofDate Then
  MsgBox "正しい日付を入力してください"
  Worksheets("Sheet1").Range("B1").Activate
End If

何か問題があるのでしょうか?
さっぱりわかりません。
よろしくお願いします。

【40412】Re:ワークシートチェンジイベントについて
回答  Statis  - 06/7/13(木) 13:37 -

引用なし
パスワード
   こんにちは

こう言う事かな?

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, _
  Union(Range("B1"), Range("D1"), Range("G1"))) Is Nothing Then Exit Sub
 
Call Check(Range("B1").Value, Range("D1").Value, Range("G1").Value)
'サブルーチン 1_creategraph

 
End Sub

Private Sub Check(Da, Da1, Da2)
If Da2 = "" Then
  MsgBox "最大値を入れてください"
  Range("G1").Activate
  End
End If
If Da = "" Then
  MsgBox "日付を入れてください"
  Range("B1").Activate
  End
End If
If Da1 = "" Then
  MsgBox "日付を入れてください"
  Range("D1").Activate
  End
End If
If Da > Da1 Then
  MsgBox "正しい日付を入力してください"
  Range("B1").Activate
  End
End If

End Sub

【40413】Re:ワークシートチェンジイベントについて
発言  ハト  - 06/7/13(木) 13:52 -

引用なし
パスワード
   こんにちは

▼aaa さん:
>いつもお世話になっております。
>ワークシートチェンジイベントで下記のようなコードを書きました。
>しかしエラー処理などを入れているうちにうまく動かなくなり、元に戻したのですがやっぱり動きません。

動かなくなる = Worksheet_Change イベントが発生しなくなるということでしょうか?

そうだとすると、エラー処理などを入れて試しているうちに

   Application.EnableEvents = False

の後

  Application.EnableEvents = True

を実行しないで終了してしまったのではないでしょうか?

元に戻してもイベントが発生しないので
  Application.EnableEvents = True
を実行できていないという事です

【40416】Re:ワークシートチェンジイベントについて
質問  aaa  - 06/7/13(木) 15:01 -

引用なし
パスワード
   ▼ハト さん:
こんにちは。

>動かなくなる = Worksheet_Change イベントが発生しなくなるということでしょうか?

はい。今のところセルの値を変更しても何も起きません。
変数宣言のところにブレイクポイントを付けてみたのですが、止まりません。というか反応していないというか・・・
コードは以下のように一番最初に書いたものに変えました。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    With Target
      If onDate Or ofDate Or maxvalue Then
        1_creategraph
      End If
    End With
  Application.EnableEvents = True
End Sub

「Application.EnableEvents = True」が最後にあるので通常通りこれが動けば実行されるはずなのですが・・・
ワークシートチェンジイベントって使いにくいものなんでしょうか??
エラーだけでも出てくれればいいのですが、それすらなく無反応って感じでどう対処したらいいかわかりません。。。
よろしくお願いします。

【40418】Re:ワークシートチェンジイベントについて
発言  Statis  - 06/7/13(木) 15:19 -

引用なし
パスワード
   こんにちは
イミディエイトウインドウで
Application.EnableEvents = True
を入力して「enter」で解除されます。

【40419】Re:ワークシートチェンジイベントについて
発言  ハト  - 06/7/13(木) 15:22 -

引用なし
パスワード
   ▼aaa さん:
>▼ハト さん:
>こんにちは。
>
>>動かなくなる = Worksheet_Change イベントが発生しなくなるということでしょうか?
>
>はい。今のところセルの値を変更しても何も起きません。
>変数宣言のところにブレイクポイントを付けてみたのですが、止まりません。というか反応していないというか・・・
>コードは以下のように一番最初に書いたものに変えました。
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  Dim onDate As Variant
>  Dim ofDate As Variant
>  Dim maxvalue As Variant
>    Application.EnableEvents = False
>    onDate = Worksheets("Sheet1").Range("B1").Value
>    ofDate = Worksheets("Sheet1").Range("D1").Value
>    maxvalue = Worksheets("Sheet1").Range("G1").Value
>    With Target
>      If onDate Or ofDate Or maxvalue Then
>        1_creategraph
>      End If
>    End With
>  Application.EnableEvents = True
>End Sub
>
>「Application.EnableEvents = True」が最後にあるので通常通りこれが動けば実行されるはずなのですが・・・
>ワークシートチェンジイベントって使いにくいものなんでしょうか??
>エラーだけでも出てくれればいいのですが、それすらなく無反応って感じでどう対処したらいいかわかりません。。。
>よろしくお願いします。

おそらく、
ブレイクポイントを付けてみたのですが、止まりません
ということですので

Application.EnableEvents = False

となっている為、
Private Sub Worksheet_Change(ByVal Target As Range)
が発生しない
と思われます


標準モジュールに
Sub Test()
  Application.EnableEvents = True
End Sub

を記述して実行してみてください

その後、セルの値を変更して
Private Sub Worksheet_Change(ByVal Target As Range)内の
ブレイクポイントで止まるかどうか試してみて下さい

【40423】Re:ワークシートチェンジイベントについて
発言  aaa  - 06/7/13(木) 15:34 -

引用なし
パスワード
   ▼Statis さん:

こんにちは。すばやいレスありがとうございます。
たしかに

>イミディエイトウインドウで
>Application.EnableEvents = True
>を入力して「enter」で解除されます。

上記で動くようになりましたが、使用しているうちにまたこのようなことが起こる可能性があるのでしょうか?
また原因がわかるのであれば教えていただけませんか?

【40424】Re:ワークシートチェンジイベントについて
発言  aaa  - 06/7/13(木) 15:39 -

引用なし
パスワード
   ▼ハト さん:
すばやいレスありがとうございます。
確かに動くようになりました。
今回の現象ですが

>Application.EnableEvents = True

を最後に実行しているのに

>Application.EnableEvents = False

の情報をどこかで保持したままになっていたということでしょうか?
もしかして処理が途中で止まってしまい、上記の情報を保持したままになってしまっていたのでしょうか?
ということはエラーでこの処理を抜ける場合に、

>Application.EnableEvents = True

という処理を実行させなければならないということですよね?

【40425】Re:ワークシートチェンジイベントについて
発言  Statis  - 06/7/13(木) 15:46 -

引用なし
パスワード
   こんにちは
Err処理を追加してみました


Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    On Error GoTo End_Len
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    With Target
      If onDate Or ofDate Or maxvalue Then
        1_creategraph
      End If
    End With
    On Error GoTo 0
End_Len:
  Application.EnableEvents = True
End Sub

【40426】Re:ワークシートチェンジイベントについて
発言  aaa  - 06/7/13(木) 15:54 -

引用なし
パスワード
   ▼Statis さん:
こんにちは。
何度もすいません。ありがとうございます。
いただいたコードを参考に追加してみて、私が望むエラー処理を入れてみたのですが、いまいち思い通りになりません。
正しい日付や最大値を入れなかった場合にはエラーメッセージを出し、セルの移動をさせないとともに、この処理を止めたいのです。
サブルーチン1_creategraphへ処理を回したくないのです。
ブレイクポイントを設定している時の様に処理を止めて、正しい値が入ったら処理を続行するというような手法はあるのでしょうか?
この考え方はちょっとおかしいのかもしれませんが・・・

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    On Error GoTo End_Len
    With Target
      If onDate Or ofDate Or maxvalue Then
        If maxvalue = "" Then
          MsgBox "最大値を入れてください"
          Worksheets("Sheet1").Range("G1").Activate
        End If
        If onDate = "" Then
          MsgBox "日付を入れてください"
          Worksheets("Sheet1").Range("B1").Activate
        End If
        If ofDate = "" Then
          MsgBox "日付を入れてください"
          Worksheets("Sheet1").Range("C1").Activate
        End If
        If onDate > ofDate Then
          MsgBox "正しい日付を入力してください"
          Worksheets("Sheet1").Range("B1").Activate
        Else
        End If
        1_creategraph
      End If
    End With
  On Error GoTo 0
End_Len:
  Application.EnableEvents = True
End Sub

以上よろしくお願い致します。

【40427】Re:ワークシートチェンジイベントについて
発言  ハト  - 06/7/13(木) 15:55 -

引用なし
パスワード
   ▼aaa さん:
>▼ハト さん:
>すばやいレスありがとうございます。
>確かに動くようになりました。
>今回の現象ですが
>
>>Application.EnableEvents = True
>
>を最後に実行しているのに
>
>>Application.EnableEvents = False
>
>の情報をどこかで保持したままになっていたということでしょうか?
>もしかして処理が途中で止まってしまい、上記の情報を保持したままになってしまっていたのでしょうか?
>ということはエラーでこの処理を抜ける場合に、
>
>>Application.EnableEvents = True
>
>という処理を実行させなければならないということですよね?

その通りです

今回、エラー処理を入れて試している時に
>Application.EnableEvents = True
を実行せずに処理を抜けてしまい

>Application.EnableEvents = False
の状態のままだったと思われます

【40428】Re:ワークシートチェンジイベントについて
回答  Statis  - 06/7/13(木) 16:03 -

引用なし
パスワード
   こんにちは

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    On Error GoTo End_Len
    With Target
      
        If maxvalue = "" Then
          MsgBox "最大値を入れてください"
          Worksheets("Sheet1").Range("G1").Activate
          GoTo End_Len
        End If
        If onDate = "" Then
          MsgBox "日付を入れてください"
          Worksheets("Sheet1").Range("B1").Activate
          GoTo End_Len
        End If
        If ofDate = "" Then
          MsgBox "日付を入れてください"
          Worksheets("Sheet1").Range("C1").Activate
          GoTo End_Len
        End If
        If onDate > ofDate Then
          MsgBox "正しい日付を入力してください"
          Worksheets("Sheet1").Range("B1").Activate
          GoTo End_Len
        Else
        End If
       1_creategraph
      
    End With
  On Error GoTo 0
End_Len:
  Application.EnableEvents = True
End Sub

で如何かな?

>If onDate Or ofDate Or maxvalue Then
上記は必要ですか?(外してみました)

【40432】Re:ワークシートチェンジイベントについて
発言  aaa  - 06/7/13(木) 16:58 -

引用なし
パスワード
   ▼Statis さん:
こんにちは。
ありがとうございます。

>>If onDate Or ofDate Or maxvalue Then
>上記は必要ですか?(外してみました)

いらないみたいです。
とりあえず処理はとめられるのでこれでいけそうです。
がしかし、もうひとつ問題が出てきました。
本当に何度も何度もすいません。。。
実は以下の処理は変更の際にだけ動いてもらいたいのです。
一回目初期値を別の処理で自動で入れるようにしてあるのですが、その場合にこのチェンジイベントが発生してしまうとフリーズしてしまうので、一度目に初期値を入れたときにはこのイベントを発生させないようにしたいです。
可能でしょうか?

よろしくお願いします。

【40434】Re:ワークシートチェンジイベントについて
回答  ハト  - 06/7/13(木) 17:12 -

引用なし
パスワード
   ▼aaa さん:
>▼Statis さん:
>こんにちは。
>ありがとうございます。
>
>>>If onDate Or ofDate Or maxvalue Then
>>上記は必要ですか?(外してみました)
>
>いらないみたいです。
>とりあえず処理はとめられるのでこれでいけそうです。
>がしかし、もうひとつ問題が出てきました。
>本当に何度も何度もすいません。。。
>実は以下の処理は変更の際にだけ動いてもらいたいのです。
>一回目初期値を別の処理で自動で入れるようにしてあるのですが、その場合にこのチェンジイベントが発生してしまうとフリーズしてしまうので、一度目に初期値を入れたときにはこのイベントを発生させないようにしたいです。
>可能でしょうか?
>
>よろしくお願いします。

そういう時こそ
Application.EnableEvents = False
を使ってみてはどうですか?

>一回目初期値を別の処理で自動で入れるようにしてある
この自動で入れる直前に
Application.EnableEvents = False
入れ終わったら
Application.EnableEvents = True

でどうですか?

【40436】Re:ワークシートチェンジイベントについて
お礼  aaa  - 06/7/13(木) 17:33 -

引用なし
パスワード
   ▼ハト さん:
なるほど。
ハトさんのおっしゃるようにしたら理想どおりになりました。
本当にありがとうございました。
簡単なことだったのですね。

7229 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free