[[20220121123746]] 『任意のTextBoxの変更によるイベント』(エクセルシップ) ページの最後に飛ぶ

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

 

『任意のTextBoxの変更によるイベント』(エクセルシップ)

どなたか教えていただけますでしょうか。
ExcelVBAでUserBoxForm準備し、そこにTextBoxを多数(10〜20個)配置し、さらにCommand Button及びChackBoxもセットします。
全てのTextBoxにアイテムを入力し、CommandButtonをクリックすることでActive Sheetに転送、それを提示するためにCheckBoxに自動で☑が入るようにプログラムしました。
この後ですが、TextBoxの任意(どれか1つ)のアイテムを変更もしくはDeleteした場合、内容が書き替えられたことを示す目的で☑マークが消滅するような記述はありませんでしょうか。(TextBoxそれぞれに書き加えるのがかなりの手間になりますので。)
よろしくします。

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


よろしくお願いします。
(エクセルシップ) 2022/01/21(金) 12:56

>それを提示するためにCheckBoxに自動で☑が入るようにプログラム

↑これ、どうやったのでしょうか?

>TextBoxそれぞれに書き加えるのがかなりの手間になりますので。)

どういう意味でしょうか?

(わからん) 2022/01/21(金) 13:02


「CheckBoxに自動で☑」ですが、単に「Private Sub CommandButton_Click()」したときに「CheckBox.value = True」という記述をしただけです。また「TextBoxそれぞれに書き加える」というのは、それぞれのTextBoxがChangeした時に「CheckBox1.value = False」という記述をすればできますが、全てのTextBoxに記述するのがかなりの手間がかかります。
任意のTextBoxをChangeした時にアクションが起きるような記述があると助かります。
よろしくお願いします。
(エクセルシップ) 2022/01/21(金) 13:27

>「CheckBox1.value = False」という記述をすれば・・かなりの手間がかかります

20個くらい、たいしたことないと思いますが..

使ったことがないので、できるかわかりませんが、ご参考。
https://ateitexe.com/excelvba-control-change-event/

(わからん) 2022/01/21(金) 14:07


こちらを熟読すれば、
自分でクラスを作らなくても
コントロール配列のイベントを
UserFormモジュール内で
自由に操れます。

AddinBox/擬似からの脱却(汎用クラス clsBPCA)
http://addinbox.sakura.ne.jp/Breakthrough_P-Ctrl_Arrays.htm

(AddinBox_角田) 2022/01/21(金) 16:57


いただいた資料を参考にして、一番有効な方法を検索してみます。ありがとうございます。
(エクセルシップ) 2022/01/21(金) 17:07

すみません。もう一度、わかる方は教えてください。
ある資料を実践してみて、全てのTextBoxをダブルクリックした結果、
同じメッセージ「:入力内容変更!!」がポップアップされる状況が作れま
した。

 (Class1)
 Option Explicit

 Private WithEvents TBOX As MSForms.TextBox

 Public Sub SetCtrl(new_ctrl As MSForms.TextBox)
    Set TBOX = new_ctrl
 End Sub

 Private Sub TBOX_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     MsgBox TBOX.Name & ":入力内容変更!!"
 End Sub

 (UserForm)
 Option Explicit
 Private myCol As Collection 'コレクション生成
 Dim myCtrl As Control       'コントロール変数の宣言
 Dim myObj As Class1         'インスタンス変数の宣言

 Private Sub UserForm_Initialize()
    Set myCol = New Collection

    For Each myCtrl In Me.Controls  
        If TypeName(myCtrl) = "TextBox" Then
            Set myObj = New Class1  'インスタンス生成
            myObj.SetCtrl myCtrl    'コントロールセット
            myCol.Add myObj         'コレクション追加
            Set myObj = Nothing     'インスタンス破棄
        End If   
    Next
 End Sub

ところが、このやり方でClass1のモジュール内でDblClick以外のイベント
(Change)を記述するとメッセージが表示されません。どこをどのように
変更したらよいかわかる方がいると助かります。

よろしくお願いします。

(エクセルシップ) 2022/01/22(土) 10:14


 >(Change)を記述するとメッセージが表示されません。

 (Class1)
 Option Explicit
 Private WithEvents TBOX As MSForms.TextBox
 Public Sub SetCtrl(new_ctrl As MSForms.TextBox)
    Set TBOX = new_ctrl
 End Sub
 Private Sub TBOX_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     MsgBox TBOX.Name & ":入力内容変更!!"
 End Sub

 Private Sub TBOX_Change()
     MsgBox TBOX.Name
 End Sub

 表示されましたよ

(ピンク) 2022/01/22(土) 10:44


うまく動かない、“Class1”のコードを書いてみた方が良いと思いますよ。
(DS) 2022/01/22(土) 11:04

確かに、"TBOX_DblClick(ByVal Cancel As MSForms.ReturnBoolean)"を"Change()"に
変更すると、TextBoxに1文字入力しただけでメッセージが表示され作業が止まって
しまいます。ということはイベントを変更したときに表示されるのはメッセージでは
なく、他のアイテムにした方がよさそうですね。例えば、CheckBox もしくは Option
Putton の表示とか。それらのイベントが作動するかどうかやってみます。
ありがとうございました。
(エクセルシップ) 2022/01/22(土) 13:47

 >TextBoxの任意(どれか1つ)のアイテムを変更もしくはDeleteした場合、
 >内容が書き替えられたことを示す目的で☑マークが消滅するような記述

 目的がTextBoxの値に変化が起きた時、対応するCheckBoxをOffにするのなら
 (TextBox1に変化が起きたらCheckBox1をOffに)

 Private Sub TBOX_Change()
    Dim n As Long
    n = Replace(TBOX.Name, "TextBox", "")
    TBOX.Parent.Controls("CheckBox" & n).Value = False
 End Sub

(ピンク) 2022/01/22(土) 14:01


あまり作りすぎると使用者にとって、不快でムカツク事がある。
作成者の独りよがりな余計なお世話という点も考慮された方がいいと思う。
ネット上のアンケートなどで多々見かける。
(注意点) 2022/01/22(土) 14:40

 ピンクさん、おっしゃったやり方で一部 CheckBoxのイベントが変化しました。
 TextBox1を変化させたときに、CheckBox1のクリックがOffになりました。ただ
 他のTextBoxが変化するとエラーになります。私は修正の知識を持っていない
 ので。もちろん自分でも検索してみますが、何か良い方法はありますでしょう
 か。
(エクセルシップ) 2022/01/22(土) 16:46

 元々の状態は、任意のもしくは全てのTextBoxをDblClickまたはChangeして
 同じメッセージが表示される仕様でした。CheckBoxについてもどのTextBox
 を変化させても1つのCheckBoxのイベントが変化するような仕様にしたい
 と思っています。(そうすれば1度完成した書類に何らかの変化が起きた
 場合、それが変更されたものという表示をさせたいので。)
(エクセルシップ) 2022/01/22(土) 17:19

 >他のTextBoxが変化するとエラーになります。
 私の提示した方法はテキストボックス名がTextBox1 〜 チェックボックス名がCheckBox1 〜
 と想定しており、テキストボックス名、チェックボックス名を変えているとエラーになります。

 >何か良い方法はありますでしょう
 TextBoxを特定する方法にTagに目印をつける方法があります

 (UserForm)
 Option Explicit
 Private myCol As Collection 'コレクション生成
 Dim myCtrl As Control       'コントロール変数の宣言
 Dim myObj As Class1         'インスタンス変数の宣言
 Private Sub UserForm_Initialize()
    Dim i As Long   '← 追加
    Set myCol = New Collection
    For Each myCtrl In Me.Controls
        If TypeName(myCtrl) = "TextBox" Then
            Set myObj = New Class1  'インスタンス生成
            myObj.SetCtrl myCtrl    'コントロールセット
            myCol.Add myObj         'コレクション追加
            Set myObj = Nothing     'インスタンス破棄
            i = i + 1        '← 追加
            myCtrl.Tag = i   '← 追加
        End If
    Next
 End Sub

 (Class1)
 Private Sub TBOX_Change()
    Dim n As Long
    n = TBOX.Tag
    TBOX.Parent.Controls("CheckBox" & n).Value = False
 End Sub

 但し、この場合もチェックボックス名は、CheckBox1 〜 と連続する必要があります。 

(ピンク) 2022/01/22(土) 17:29


 できました。 たった今ピンクさんがおしえてくれた方法ではありませんが、
 14:01にアップしていただいた記述の中で、

 Private Sub TBOX_Change()
    Dim n As Long
    n = Replace(TBOX.Name, "TextBox", "")
    TBOX.Parent.Controls("CheckBox" & 1).Value = False 'このnを1に変更することで
                            =>全てのTextBoxの変化に応じて
                             CheckBox1が変化しました。
 End Sub

 ありがとうございました。
(エクセルシップ) 2022/01/22(土) 17:44

コメント返信:

[ 一覧(最新更新順) ]


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