[[20180228235342]] 『BeforeUpdateが勝手に動作します。解決方法をご教』(coji) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『BeforeUpdateが勝手に動作します。解決方法をご教示ください。』(coji)

以下のようにコードで実行した場合です。
I_LISTのD列に無い値を入力し、データを登録しますか?の質問にNoと答えます。
ItmTxtは空欄に戻るのですが、再度Private〜から実行されてしまいます。
D列には空欄も存在するため★が実行されてしまい困っています。
★を実行させないようにするためにはどうしたら良いのかご教示いただけますと幸いです。
よろしくお願いいたします。


Private Sub ItmTxt_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim FTRng As Object

    Dim FDRng As Object

    Dim l As Long

    ItmLst.Clear

        Set FDRng =  I_LIST.Columns("D").Find(What:=ItmTxt, LookAt:=xlPart)

        If FDRng Is Nothing Then

            l = MsgBox("データがありません。登録しますか?", vbYesNo + vbQuestion + vbDefaultButton2)
            If l = vbYes Then

        MsgBox "OK"

            Else
                MsgBox "入力し直してください。", vbExclamation

                Cancel = True

                ItmTxt = Undo

            Exit Sub
            End If
        End If
    ★

< 使用 Excel:Excel2010、使用 OS:Windows7 >


回答がつきませんが、↓これと何が違うのですか?
[[20180228232120]] 『BeforeUpdateが勝手に動作します。解決方法をご教』(こじ)

(マナ) 2018/03/01(木) 22:36


最初に、↓を追加するとどうなりますか?
If ItmTxt.Text = "" Then Exit Sub

(マナ) 2018/03/01(木) 22:40


マナさま
コメントありがとうございました。
[[20180228232120]] 『BeforeUpdateが勝手に動作します。解決方法をご教』(こじ) は重複でしたすみません。
ご教示いただいた通り以下のコードを最初に追加して解決いたしました。
ありがとうございました。

If ItmTxt = "" Then
      Cancel = True
      Exit Sub
End If
(coji) 2018/03/02(金) 10:21

度々すみません、このコードを追加したところこのプロージャから抜けられなくなり他のボタンなどが操作できなくなってしまいました。
cancel=trueを省略するとカーソルが移動してしまいますし悩んでおります。
何か他に良い案はございませんでしょうか。
よろしくお願いいたします。
(coji) 2018/03/02(金) 10:43

>cancel=trueを省略するとカーソルが移動してしまいますし悩んでおります。

入力し直すときだけでよいのでは?

>If ItmTxt.Text = "" Then Exit Sub

では、だめでしたか。

(マナ) 2018/03/02(金) 19:49


メッセージボックスで入力しなおすように表示した後exit subで抜けろのですが、自動的に処理が実行されてしまいますのでカーソルが別の場所に移ってしまうのです。
入力のし直しを行いたい場合もありますのでカーソルは動かさないようにしたいです。
何度もすみませんがご確認いただけますと幸いです。
(coji) 2018/03/03(土) 13:18

だから

>入力のし直しを行いたい場合

というのは

>MsgBox "入力し直してください。", vbExclamation

ですよね。

そのときだけCancel = Trueでよいのでは?

(マナ) 2018/03/03(土) 13:27


それは分かっているのですが、MsgBox "入力し直してください。", vbExclamation の場合のみCancel = Trueではカーソルが動いてしまうのです。
実際に動作させてみてカーソルが移動していたのでCancel = Trueを追加しています。
その場合、カーソルは移動しませんでしたが他のボタンが押せなくなりました。

ItmTxtが、空白の時に処理を飛ばすことではなく2回動作させないことを考えているのですがbeforeupdataでは難しいということなのでしょうか?

            l = MsgBox("データがありません。登録しますか?", vbYesNo + vbQuestion + vbDefaultButton

            Else
                MsgBox "入力し直してください。", vbExclamation

                Cancel = True

                ItmTxt = Undo

            Exit Sub

のあとは間髪入れずに

Private Sub ItmTxt_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If ItmTxt.Text = "" Then
Exit Sub
End If
が実行され、処理が完了となりますのでカーソルは移動します。
(coji) 2018/03/03(土) 20:55


こちらでも動作確認できるように

>ItmTxt = Undo

が何をしているか説明していただけますか。

(マナ) 2018/03/03(土) 21:06


>ItmTxt = Undo

わからないので、

ItmTxt.Text = ""

として、確認しましたが、再現できないのですが。

(マナ) 2018/03/03(土) 21:15


>ItmTxt = Undo

これは、たぶん、Option Explicit宣言してなくて、初期値("")を ItmTxt に代入しているのでしょう。
つまり ItmTxt.Text = "" と同等のことだと思われます。

BeforeUpdateイベントの中で、ItmTxt.Text = "" を実行するとさらに BeforeUpdateイベントが呼び出されるのでイベントが繰り返されることになります。

このような場合の定番の方法は、モジュールレベルの変数にイベント発生中かどうかを格納して、発生中なら Exit Sub することです。

Option Explicit '変数宣言強制
Dim flgUpdating As Boolean 'イベント発生フラグ

Private Sub ItmTxt_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

    Dim l As Long

    If flgUpdating Then Exit Sub
    flgUpdating = True

    '現状のコード

    flgUpdating = False

End Sub
(hatena) 2018/03/04(日) 10:56


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

ご指摘の通りOption Explicit宣言しておりませんでした。
Option Explicit基本的には全てのコードにつけるものなのでしょうか?
また、flgupdatingを使ってイベント発生中かどうかの目印をつけており、その目印がある間はexit subされる、という認識で合ってますでしょうか?
質問ばかりで申し訳ありません。
(coji) 2018/03/05(月) 13:30


>Option Explicit基本的には全てのコードにつけるものなのでしょうか?
>また、flgupdatingを使ってイベント発生中かどうかの目印をつけており、
>その目印がある間はexit subされる、という認識で合ってますでしょうか?

この辺を読んでみるとわかるかもしれません。
http://officetanaka.net/excel/vba/beginner/11.htm
(もこな2) 2018/03/05(月) 14:43


↑ちょっとミスしました。

>Option Explicit基本的には全てのコードにつけるものなのでしょうか?

この辺を読んでみるとわかるかもしれません。
http://officetanaka.net/excel/vba/beginner/11.htm

>また、flgupdatingを使ってイベント発生中かどうかの目印をつけており、
>その目印がある間はexit subされる、という認識で合ってますでしょうか?

 If flgUpdating Then Exit Sub
 ↑
 変数「flgUpdating」がTrueなら、プロシージャを抜けなさい
ということなので、目印の「flgUpdating」がTrueなのか、Falseなのかみて処理分岐すればいいんじゃないですかという提案と思われます。
詳しくは、hatenaさんがフォローされるとおもいますが、うっかりレスミスしてしまったので参考に。

(もこな2) 2018/03/05(月) 14:53


もこな2さんのコメント通りですので、特に付け加えることはありません。

(hatena) 2018/03/05(月) 16:26


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.