[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『BeforeUpdateが勝手に動作します。解決方法をご教示ください。』(coji)
以下のようにコードで実行した場合です。
I_LISTのD列に無い値を入力し、データを登録しますか?の質問にNoと答えます。
ItmTxtは空欄に戻るのですが、再度Private〜から実行されてしまいます。
D列には空欄も存在するため★が実行されてしまい困っています。
★を実行させないようにするためにはどうしたら良いのかご教示いただけますと幸いです。
よろしくお願いいたします。
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 >
(マナ) 2018/03/01(木) 22:36
(マナ) 2018/03/01(木) 22:40
Cancel = True Exit Sub End If (coji) 2018/03/02(金) 10:21
入力し直すときだけでよいのでは?
>If ItmTxt.Text = "" Then Exit Sub
では、だめでしたか。
(マナ) 2018/03/02(金) 19:49
>入力のし直しを行いたい場合
というのは
>MsgBox "入力し直してください。", vbExclamation
ですよね。
そのときだけCancel = Trueでよいのでは?
(マナ) 2018/03/03(土) 13:27
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.Text = ""
として、確認しましたが、再現できないのですが。
(マナ) 2018/03/03(土) 21:15
これは、たぶん、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
この辺を読んでみるとわかるかもしれません。
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
(hatena) 2018/03/05(月) 16:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.