アプリ版:「スタンプのみでお礼する」機能のリリースについて

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という名称を返す変数のようなものがあれば教えていただけないでしょうか?

一応、検索して調べてみたのですが
類似の質問ページは見つかったのですが
明確な回答は見つかりませんでした。

よろしくお願いいたします。

質問者からの補足コメント

  • ありがとうございます。

    しかしうまく動かないのですが。


    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文の中に入ってしまう上に
    テキストボックスを見つけられていないようなのですが
    どうすれば良いでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/26 15:46
  • 説明がうまく伝わらず申し訳ありません。
    全てのテキストボックスに同じ処理をするという意味ではなく
    あるテキストボックスに設定した制限を他のテキストボックスにもかけたいという意味です。

    例えば、テキストボックスの数値を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

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/10/26 16:56
  • 上記ではTextBox8に対して制限をかけましたが、
    これをTextBox9に対してもかけたい場合、

    Dim txtbox As Object
    Set txtbox = TextBox8

    Call Text_seigen(txtbox)

    をコピーすれば良いわけですが、
    いちいちTextBox8の8を9に書き換えないといけないので
    これを、Private Sub TextBox8_Change()で実行すると
    TextBox8を返す変数を必要としているわけなのですが。

      補足日時:2015/10/26 16:56
  • ありがとうございます。
    試してみたのですが
    strTxtbox = Me.ActiveControl.Name
    のところで
    オブジェクト変数またはWithブロック変数が設定されていません。
    というエラーが発生してうまくいかないのですが。

    ThisWorkbook.UserForm1.ActiveControl.Name
    UserForm1.ActiveControl.Name
    というように修正して試してみましたが
    うまくいきませんでした。
    何が問題でしょうか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/10/26 18:14
  • すいませんmultipageに入っていることが原因だと分かりました。
    multipageに入っていない場合には
    教えてくださったコードでうまくいきます。

    multipageに入っている場合にはどうしたら良いですか?
    検索すると
    strTxtbox = Me.MultiPage1.Page(Me.MultiPage1.Value).ActiveControl.ActiveControl.Name

    を使うと良いという説明が見つかったのですが
    オブジェクトは、このプロパティまたはメソッドをサポートしていません。
    というエラーがでてうまくいきません、
    どうすれば良いでしょうか?

      補足日時:2015/10/26 18:24
  • strTxtbox = Me.MultiPage1.Pages(Me.MultiPage1.Value).Name

    とするとページ番号までは取得することができました。
    あとはこのページ内のアクティブコントロール名を取得するだけなのですが
    ActiveControl.Name
    ActiveControl.ActiveControl.Name
    Frame1.ActiveControl.Name
    など試してみましたがうまくいきませんでした。

    マルチページ内で更にフレームの中に入っているわけでは
    ないのでうまくいくはずなのですが
    なぜでしょうか?

      補足日時:2015/10/26 18:34
  • ありがとうございます。
    試してみましたが
    やはり
    strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
    のところで
    オブジェクト変数またはWithブロック変数が設定されていません。

    というエラーが出てしまいます。

    strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.ActiveControl.Name

    というように二重にしても試してみましたが
    駄目でした。
    なぜでしょうか?

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/10/27 11:42
  • 仰る通りマルチページを新規作成して試したところうまくいきました。

    原因は、ページの名称を変更していることにありました。

    例えば、デフォルトではPage1とPage2が生成されますが、
    このPage1を「テストページ1」とか別の名称にして試していただけないでしょうか?

    名称が変わった場合にはどうしたら良いですか?

    No.6の回答に寄せられた補足コメントです。 補足日時:2015/10/27 12:57
  • 何度もすいません、
    原因を勘違いしていました。ページ名称を変えたのが原因ではなく
    初期化設定のところでエラーがでていました。
    例:
    Private Sub UserForm_Initialize()
    TextBox12.Value = 600
    end sub
    初期化設定を行わなければうまく動作することが確認できました。

    初期設定でエラーが出ないようにするにはどうしたら良いですか?

    No.7の回答に寄せられた補足コメントです。 補足日時:2015/10/27 13:23
  • ありがとうございます。

    xlsmファイルを新規作成してやってみるとうまくいきました。
    しかし既に作成してあるxlsmファイル上のユーザーフォームでやってみると
    オブジェクト変数またはWithブロック変数が設定されていません。
    というエラーが出てうまくいきません。

    何かのコントロールが邪魔をしているのではないかと思い
    一つずつ削除してやってみたところ
    全てのコントロールを削除するとうまくいきました。

    どうもどれか一つのコントロールが邪魔をしているのではなく、
    全て削除しないとうまくいきません。一度全て削除してから
    コントロールを新規作成するのであれば
    他にコントロールがあってもうまくいきます。

    また、コントロールは残したままで
    変数の定義やプログラムコードを全て削除した場合にはうまくいきませんでした。

    これは一体どういうことでしょうか?
    何か解決策がございますでしょうか?

    No.9の回答に寄せられた補足コメントです。 補足日時:2015/10/27 19:59

A 回答 (10件)

コード見せて頂いてもよろしいでしょうか?

    • good
    • 0

補足でなんでエラーが発生するかというと


イベントには発生する順番というものがあります。
Initializeはまだフォームの描写ができていません。
なので先程のチェンジイベントを発生させるとオブジェクトが描写されてないので
アクティブコントロールを見つける事はできません。
アクティベイトの後であれば描写されているのでエラーは起きません。
この回答への補足あり
    • good
    • 0

Private Sub UserForm_Activate()


  Me.TextBox1.Value = 600
End Sub
    • good
    • 0

ページではなくマルチページ自体のオブジェクト名を変更していませんか?


strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
のMultiPage1はページではありません。マルチページ自体の名前です。
ページは個別にPage1、Page2と付いています。なのでページの名称が変わった所で何も影響ありません。
この回答への補足あり
    • good
    • 0

ユーザーフォーム上にマルチページがあってそのページ内にテキストボックスがあるんですよね?


Private Sub TextBox1_Change()
  Dim strTxtbox As String
  strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name
End Sub
画像の様に作成しているならこれで動きます。

1回フォームをウォッチにいれてコントロールがどのようになっているか見てみてはどうですか?

strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.ActiveControl.Name
これはフレームの中にマルチページがあるからこうゆう書き方になります。
「テキストボックスの番号の取得」の回答画像6
この回答への補足あり
    • good
    • 0

これExcelだったんですね....


Accessと勘違いしてました....

Dim strTxtbox As String
  strTxtbox = Me.MultiPage1.SelectedItem.ActiveControl.Name

たぶんこれでいけると思います。
この回答への補足あり
    • good
    • 0

Private Sub TextBox8_Change()


  Dim strTxtbox As String
  strTxtbox = Me.ActiveControl.Name
End Sub
コントロールの名前を取得したいだけならこれでいいと思います。

設定を色々設けたいなら設定フォームを作成し、そのフォームから各種設定変更出来るようにした方がいいかもしれません。
この回答への補足あり
    • good
    • 0

すみません....コード抜けてました....


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
この回答への補足あり
    • good
    • 0

フォーム上にあるテキストボックス全てに同じ処理をするって事でいいんですよね?



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だった場合の処理

でいいと思います。

何がしたいのかをもう少し具体的に教えて頂いてもいいでしょうか?
    • good
    • 0

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
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A