
VBAを使っていて、
ユーザーフォーム上の複数のテキストボックスに以下のような
コードを設定したいと考えています。
Private Sub TextBox14_Change()
Dim txtbox As Object
Set txtbox = TextBox14
call routine(txtbox)
End Sub
上のコードの中で
Dim txtbox As Object
Set txtbox = TextBox14
call routine(txtbox)
の部分をコピーしていけば良いのですが
「TextBox14」の「14」という番号の部分を
テキストボックスごとに書き換えられる必要があります。
それで
Sub TextBox14_Change
内でコードが走っている場合には
14あるいはTextBox14という名称を返す変数のようなものがあれば教えていただけないでしょうか?
一応、検索して調べてみたのですが
類似の質問ページは見つかったのですが
明確な回答は見つかりませんでした。
よろしくお願いいたします。
No.9
- 回答日時:
補足でなんでエラーが発生するかというと
イベントには発生する順番というものがあります。
Initializeはまだフォームの描写ができていません。
なので先程のチェンジイベントを発生させるとオブジェクトが描写されてないので
アクティブコントロールを見つける事はできません。
アクティベイトの後であれば描写されているのでエラーは起きません。
No.7
- 回答日時:
ページではなくマルチページ自体のオブジェクト名を変更していませんか?
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
のMultiPage1はページではありません。マルチページ自体の名前です。
ページは個別にPage1、Page2と付いています。なのでページの名称が変わった所で何も影響ありません。
No.6
- 回答日時:
ユーザーフォーム上にマルチページがあってそのページ内にテキストボックスがあるんですよね?
Private Sub TextBox1_Change()
Dim strTxtbox As String
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
End Sub
画像の様に作成しているならこれで動きます。
1回フォームをウォッチにいれてコントロールがどのようになっているか見てみてはどうですか?
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.ActiveControl.Name
これはフレームの中にマルチページがあるからこうゆう書き方になります。

No.5
- 回答日時:
これExcelだったんですね....
Accessと勘違いしてました....
Dim strTxtbox As String
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
たぶんこれでいけると思います。
No.4
- 回答日時:
Private Sub TextBox8_Change()
Dim strTxtbox As String
strTxtbox = Me.ActiveControl.Name
End Sub
コントロールの名前を取得したいだけならこれでいいと思います。
設定を色々設けたいなら設定フォームを作成し、そのフォームから各種設定変更出来るようにした方がいいかもしれません。
No.3
- 回答日時:
すみません....コード抜けてました....
Dim txtbox As Control
On Error Resume Next
For Each txtbox In Me.Controls
With txtbox
If .ControlType = acTextBox Then
Call routine
End If
End With
Next txtbox
No.2
- 回答日時:
フォーム上にあるテキストボックス全てに同じ処理をするって事でいいんですよね?
For Each txtbox In Me.Controls ←ここでフォーム上にある全てのコントロールをtxtboxに格納します。
With txtbox
If .ControlType = acTextBox Then ←そのコントロールがテキストボックスだったらIf文に入ります。
'テキストボックスだった場合の処理
End If
End With
もしテキストボックス14だけに処理を行いたいのであれば
If .ControlType = acTextBox Then
の後に
If txtbox.Name = "TextBox14" Then
'テキストボックス14だった場合の処理
でいいと思います。
何がしたいのかをもう少し具体的に教えて頂いてもいいでしょうか?
No.1
- 回答日時:
Dim txtbox As Control
On Error Resume Next
For Each txtbox In Me.Controls
With txtbox
If .ControlType = acTextBox Then
Call routine
End If
End With
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) フレーム内のオプションボタンの選択結果をセルに書き出したい。 図のような預金種目というフレームにオプ 2 2022/07/29 11:12
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
このQ&Aを見た人はこんなQ&Aも見ています
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
VBからエクセルのテキストボックスの名称を取得したい
Visual Basic(VBA)
-
-
4
テキストボックスのフォーカスの判定
Visual Basic(VBA)
-
5
VBAのフォームでTextBoxがいっぱいある時
Access(アクセス)
-
6
フォーム上の現在アクティブなコントロールの取得
Access(アクセス)
-
7
Excel vba ListBoxについて
Excel(エクセル)
-
8
エクセルVBAでテキストボックスの値の取得と変更について
Visual Basic(VBA)
-
9
VBAでオプションボタンなどそれぞれの数を調べたい
Excel(エクセル)
-
10
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
11
EXCEL VBA ユーザーフォーム内のテキストボックスを一括処理する方法について
Excel(エクセル)
-
12
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
13
テキストボックスの値を変数に代入したい。
Visual Basic(VBA)
-
14
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
15
UserForm1.Showでエラーになります。
工学
-
16
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
17
VBAでのユーザフォームの表示有無の確認について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Microsoft Formsの「個人情報や...
-
VB.NETでフォーム間でのコント...
-
クリックイベントなのに、2回ク...
-
ユーザーフォームについて質問...
-
VBAのテキストフォームの折り返...
-
エクセルVBAのフォームを最...
-
ACCESSのフォーム、開くんです...
-
ブックをCloseまたはQuitで閉じ...
-
フォームに引数を渡す方法のやり方
-
VBA(エクセル)のユーザー...
-
コントロールの存在確認
-
ユーザーフォームのテキストボ...
-
EXCEL VBA ユーザーフォームの...
-
フォームの位置を取得したい
-
ExcelVBAでユーザーフォームが...
-
Excel VBA ユーザーフォーム 複...
-
【VBAユーザーフォームで閉じる...
-
指定の動作中ユーザーフォーム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Form_Load と Form_Activate の...
-
VBAでユーザーフォームを再表示...
-
Microsoft Formsの「個人情報や...
-
クリックイベントなのに、2回ク...
-
ユーザーフォームのテキストボ...
-
ユーザーフォーム上に現在日時...
-
ACCESSのフォーム、開くんです...
-
エクセルのチェックボックスの...
-
エクセルVBAのフォームを最...
-
VB.NETでフォームロード中のエ...
-
EXCEL VBA ユーザーフォームの...
-
VBA(エクセル)のユーザー...
-
【Excel VBA】ユーザフォームを...
-
Hideについて(.NET)
-
(Excel+VBA)ユーザーフォームの...
-
モーダルフォームとモードレス...
-
VBA コンボボックスとテキスト...
-
アクセス2013 フォームが...
おすすめ情報
ありがとうございます。
しかしうまく動かないのですが。
acTextBox = 109
Dim txtbox As Control
On Error Resume Next
For Each txtbox In Me.Controls
With txtbox
If .ControlType = acTextBox Then
aa=123
End If
End With
Next
少し修正してみましたが
やはり動きませんでした。
なぜか毎回if文の中に入ってしまう上に
テキストボックスを見つけられていないようなのですが
どうすれば良いでしょうか?
説明がうまく伝わらず申し訳ありません。
全てのテキストボックスに同じ処理をするという意味ではなく
あるテキストボックスに設定した制限を他のテキストボックスにもかけたいという意味です。
例えば、テキストボックスの数値を400以上に制限したいとします。
(本当はもっと複雑な条件が入るのですが例として簡単化しています)
Private Sub TextBox8_Change()
Dim txtbox As Object
Set txtbox = TextBox8
Call Text_seigen(txtbox)
End Sub
Private Sub Text_seigen(txtbox As Object)
If txtbox.Value < 400 Then txtbox.Value = 400
End Sub
上記ではTextBox8に対して制限をかけましたが、
これをTextBox9に対してもかけたい場合、
Dim txtbox As Object
Set txtbox = TextBox8
Call Text_seigen(txtbox)
をコピーすれば良いわけですが、
いちいちTextBox8の8を9に書き換えないといけないので
これを、Private Sub TextBox8_Change()で実行すると
TextBox8を返す変数を必要としているわけなのですが。
ありがとうございます。
試してみたのですが
strTxtbox = Me.ActiveControl.Name
のところで
オブジェクト変数またはWithブロック変数が設定されていません。
というエラーが発生してうまくいかないのですが。
ThisWorkbook.UserForm1.ActiveControl.Name
UserForm1.ActiveControl.Name
というように修正して試してみましたが
うまくいきませんでした。
何が問題でしょうか?
すいませんmultipageに入っていることが原因だと分かりました。
multipageに入っていない場合には
教えてくださったコードでうまくいきます。
multipageに入っている場合にはどうしたら良いですか?
検索すると
strTxtbox = Me.MultiPage1.Page(Me.MultiPage1.Value).ActiveControl.ActiveControl.Name
を使うと良いという説明が見つかったのですが
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
というエラーがでてうまくいきません、
どうすれば良いでしょうか?
strTxtbox = Me.MultiPage1.Pages(Me.MultiPage1.Value).Name
とするとページ番号までは取得することができました。
あとはこのページ内のアクティブコントロール名を取得するだけなのですが
ActiveControl.Name
ActiveControl.ActiveControl.Name
Frame1.ActiveControl.Name
など試してみましたがうまくいきませんでした。
マルチページ内で更にフレームの中に入っているわけでは
ないのでうまくいくはずなのですが
なぜでしょうか?
ありがとうございます。
試してみましたが
やはり
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
のところで
オブジェクト変数またはWithブロック変数が設定されていません。
というエラーが出てしまいます。
strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.ActiveControl.Name
というように二重にしても試してみましたが
駄目でした。
なぜでしょうか?
仰る通りマルチページを新規作成して試したところうまくいきました。
原因は、ページの名称を変更していることにありました。
例えば、デフォルトではPage1とPage2が生成されますが、
このPage1を「テストページ1」とか別の名称にして試していただけないでしょうか?
名称が変わった場合にはどうしたら良いですか?
何度もすいません、
原因を勘違いしていました。ページ名称を変えたのが原因ではなく
初期化設定のところでエラーがでていました。
例:
Private Sub UserForm_Initialize()
TextBox12.Value = 600
end sub
初期化設定を行わなければうまく動作することが確認できました。
初期設定でエラーが出ないようにするにはどうしたら良いですか?
ありがとうございます。
xlsmファイルを新規作成してやってみるとうまくいきました。
しかし既に作成してあるxlsmファイル上のユーザーフォームでやってみると
オブジェクト変数またはWithブロック変数が設定されていません。
というエラーが出てうまくいきません。
何かのコントロールが邪魔をしているのではないかと思い
一つずつ削除してやってみたところ
全てのコントロールを削除するとうまくいきました。
どうもどれか一つのコントロールが邪魔をしているのではなく、
全て削除しないとうまくいきません。一度全て削除してから
コントロールを新規作成するのであれば
他にコントロールがあってもうまくいきます。
また、コントロールは残したままで
変数の定義やプログラムコードを全て削除した場合にはうまくいきませんでした。
これは一体どういうことでしょうか?
何か解決策がございますでしょうか?