[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『任意のTextBoxの変更によるイベント』(エクセルシップ)
どなたか教えていただけますでしょうか。
ExcelVBAでUserBoxForm準備し、そこにTextBoxを多数(10〜20個)配置し、さらにCommand Button及びChackBoxもセットします。
全てのTextBoxにアイテムを入力し、CommandButtonをクリックすることでActive Sheetに転送、それを提示するためにCheckBoxに自動で☑が入るようにプログラムしました。
この後ですが、TextBoxの任意(どれか1つ)のアイテムを変更もしくはDeleteした場合、内容が書き替えられたことを示す目的で☑マークが消滅するような記述はありませんでしょうか。(TextBoxそれぞれに書き加えるのがかなりの手間になりますので。)
よろしくします。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
↑これ、どうやったのでしょうか?
>TextBoxそれぞれに書き加えるのがかなりの手間になりますので。)
どういう意味でしょうか?
(わからん) 2022/01/21(金) 13:02
20個くらい、たいしたことないと思いますが..
使ったことがないので、できるかわかりませんが、ご参考。
https://ateitexe.com/excelvba-control-change-event/
(わからん) 2022/01/21(金) 14:07
AddinBox/擬似からの脱却(汎用クラス clsBPCA)
http://addinbox.sakura.ne.jp/Breakthrough_P-Ctrl_Arrays.htm
(AddinBox_角田) 2022/01/21(金) 16:57
(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
>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
ピンクさん、おっしゃったやり方で一部 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.