ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのVBA記述 IF分岐で2回処理されてるのですが…

  • mixiチェック
  • このエントリーをはてなブックマークに追加
やっと、何となくVBAが分かってきたもののまだまだな初心者ですが、
仕事で必要に迫られて、調べ調べでVBAに苦戦している日々です(汗)

現在、画像のような処理を行いたいと思い、VBAの記述をしています。
ワークシート内のすべての行を対象に A列からE列までのいずれかのセルに変更があった時に
発動させるようになります。
「処理A」から「処理C」は MsgBox で結果を表示していると仮定してください。


****************************************************************************

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Column <= 1 and .Column >=5 then  'A列からE列を指定
Application.EnableEvents = False ''イベント禁止



'分岐1  A列の値で判定
Select Case Cells(.Row , 1 ).Value

Case 0 ' A列が0の場合
 ***処理A***

Case Is < 0 'A列が負の数の場合

    Select Case Cells(.Row , 2 ).Value '分岐2 B列の値で判定
    
Case 0 ' B列が0の場合
     ***処理B***

Case Is < 0  ' B列が負の数の場合
     ***処理C***

end Select '分岐2のSelect Caseの終わり

end Select    '分岐1のSelect Caseの終わり


End If


Application.EnableEvents = True 'イベント許可

End With
End Sub

****************************************************************************

こういうコードを記述したのですが、これが発動されたときに
MsgBoxで処理結果が表示され、
(MsgBoxの記述は、結果を表示させて OKボタンが出るだけのものです)
OKボタンを押すとこのコードの部分は完了するものと思っていましたが、
OKボタンを押すと、再度この部分が実行されているらしく、もう一度、同じMsgBoxが出てきてしまいます。

ブレークポイントを設定して、1行ずつ確認していったのですが、
End Ifまで行った後に 上の 「 If .Column <= 1 and 〜 」の行に処理が戻るのです。
そして、再度同じプロセスを経て 再度同じMsgBoxが表示されて、OKを押すと
今度は終了するのです。

A〜Cの各処理が終わった直後に Goto で  End Ifの直後にジャンプさせようとしても
動作は同じでした。

IFの仕組みがいまいち理解できていないのでしょうが、
ネットなどで調べても分からないのです。
よろしくお願いします。

コメント(6)

3行目が分からないのですが、

「ターゲットのカラムが1以下かつ5以上」

と書かれているように思うんですが、以下と以上が逆なのでは?
Hal (ねこ使い)さんの仰る通り、
If .Column <= 1 And .Column >= 5 Then では、
この条件式がTRUEになることは無いですね。

単一セルの変更の場合だけ考慮するなら
ゆーーけさんの仰るように If .Column <= 5 Then でよいと思います。

複数セルの同時変更も考慮するなら、Intersect関数を使用して
Targetの一部がA:Eに含まれるかを判定しなければなりません。
また、その際には .Row が思った通りの値を
返してくれない場合があるでしょうから考慮が必要でしょう。

> OKボタンを押すと、再度この部分が実行されているらしく、
> もう一度、同じMsgBoxが出てきてしまいます。
提示されたコードだけではわかりません。
コードは省略しないで全て書きましょう。

> ブレークポイントを設定して、1行ずつ確認していったのですが、
> End Ifまで行った後に 上の 「 If .Column <= 1 and 〜 」の行に処理が戻るのです。

Private Sub Worksheet_Change(ByVal Target As Range)
にもブレークポイントを設定してみてください。
再度ワークシートのchangeイベントが走っているのではないでしょうか。
全てのステートメントにブレークポイントを設定して
F5キーで走らせるのならば、F8キーでステップ実行した方がデバッグも楽ですよ。
コメントありがとうございます。
今、ワークシートをいじれないので、後で再度やってみたいとおもっています。

>Hal (ねこ使い) さん
>ゆーーけ さん

はい、3行目の記述は間違ってます(汗)
ただ、上に書き込んだコードは、実際に作成している(現在うまくいっていない)コードを
簡略化(実際にはColumnの指定の範囲がもっと広い&条件分岐がさらに階層化している)して
書き込んだので、実際には間違いはないのです。(実際、この条件式で実行はされているので…)


>よっちゃん さん
Private Sub Worksheet_Change(ByVal Target As Range) にブレークポイントですね。。。
やってみます。

すみません!単純な間違いでした。 m(__)m

実は、If 〜 End If のブロックが複数有るのですが、

Application.EnableEvents =  でのイベント禁止・許可の場所がマズかった為、
他のIfブロックで処理が行われた時に、セルの内容が変更され… それでまた発動して…
というへんなループが起きていたようです。

基礎から勉強ないといけないと感じておりますが、
これを完成させないと行けない期限が迫っているので、
ネットで似た処理のコードを見つけてはきちんと意味も分からないまま真似したりして
いるのが現状で。。。

回答をくださった方々、ありがとうございました。
また、変な質問するかもしれませんが、よろしくお願いします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。