質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

8435閲覧

VBA テキストボックスのChangeイベント中の再度Changeイベントについて

sin-zo

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/02/01 10:10

テキストボックスに入力された全角文字を、半角カナや半角英数字に変換する処理をテキストボックスのChangeイベントとして処理させています。
その全角を半角にした文字列を、テキストボックスのValue値に代入すると、当然、またChangeイベントが発生してしまい、再度全角を半角にする処理が起こってしまいます。

このままだけでは、全角を半角(既に半角なので処理はすぐに終了)するだけで、不都合はないのですが、テキストボックスのChangeイベントでは、半角にされた文字列をつかって、ワークシートにあるデータベースから、商品を検索する処理も合わせて走らせています。
検索後、その商品があれば通知ダイアログとしてPOPを起動させて、その詳細を詳細表示エリアに表示させるのですが、前述の通知ダイアログがどうしても、2回表示されてしまいます。

これを1回に抑えることが可能なのでしょうか

宜しくお願い致します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

モジュールグローバルのフラグを使って再入を防ぎましょう。

vba

1Option Explicit 2Dim flgChange As Boolean 3 4Private Sub TextBox1_Change() 5 If flgChange Then Exit Sub 6 flgChange = True 7 8 TextBox1.Value = 変換処理(TextBox1.Value) 9 '検索処理 10 11 flgChange = False 12End Sub 13

追記

h.horikoshiさんの回答もみて、確かにこの方法もありかなと思いました。

グローバル変数が必要ないのはメリットですね。
変換処理が2回発生するのがちょっと無駄かな。

処理の流れを図示してみました。

h.horikoshiさんの方法

text

1Changイベント発生 23*変換処理* 45Valueに代入→ Changイベント再発生 6        ↓ 7       *変換処理* 8        ↓ 9       変換前 = 変換後なら検索処理 10        ↓ 11イベント終了← 再入イベント終了

私の方法

text

1Changイベント発生 23フラグをTrue設定 45*変換処理* 67Valueに代入→ Changイベント再発生 8        ↓ 9検索処理 ← フラグTureならExit Sub 1011イベント終了

投稿2018/02/01 11:58

編集2018/02/02 01:16
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin-zo

2018/02/02 06:46

回答が遅くなって申し訳ありません hatena19さんの方法で解決いたしました 確かに、フラグを使用すれば入力制限をかけることが可能でしたね 大変助かりました、ありがとうございます
h.horikoshi

2018/02/02 07:09

hatena19さん 補足ありがとうございます。確かに変換が2回発生するのは欠点ですね。 #グローバルがごっそりあるマクロをメンテしていまして、ちょっとグローバルに拒否反応が(笑)。 まあ、こんな方法もアリってことで...
guest

0

入力文字の変換と検索を別に考えたらどうでしょうか?

入力文字を変換して
(1)変換前と同じだったら検索処理
(2)変換前と違っていたらTextBoxに設定

【例】
Private Sub TextBox1_Change()
Dim bfr As String: bfr = TextBox1.Value
Dim aft As String: aft = 変換処理(bfr)
If (bfr = aft) Then
検索処理
Else
TextBox1.Value = aft
End If
End Sub

投稿2018/02/02 00:28

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin-zo

2018/02/02 06:46

回答が遅くなった申し訳ありません 文字変換処理をChangeイベントが発生した時に行いたいため、別に処理することができなのです 別で出来るのであれば、h.horikoshiさんの考え方もいい方法だと思います ありがとうございました
guest

0

全部半角だった時だけ検索しましょう。

投稿2018/02/01 10:51

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin-zo

2018/02/02 06:46

回答が遅くなって申し訳ありません この考えでは、私の方も試してみました 全部半角にしてから検索をするのですが、その際、半角に変換した値をTextBoxに入れたときに、再度イベントが発生してしまうため、上手くいきませんでした 回答を頂き、ありがとうございました
Zuishin

2018/02/02 07:49

違いますよ。 入力を全部半角に変換してから、ではなく、入力が全部半角の時のみ、実行するのです。 全部半角でない場合は半角にするだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問