Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
UserForm上に配置したControlが見えなくなりました
投稿日時: 20/02/10 18:29:19
投稿者: manatsu

数個のグループ化したTextBoxをFrameにセットし、さらに別のFrameに入れ
子にしたりしているうちにUserForm上から消えてしまいました。
moug速攻テクニック「フォームに配置されたコントロール名を全て取得する」
のプロシージャを張り付け実行してみると、作成したTextBoxはたしかに存
在していることが確認できます。前にもいちど同じ事故に遭遇し、やりなお
したのですが、なにしろスパゲティ状態で途方にくれております。UserForm
上で可視化する手立てがありましたら教えてください。
よろしくお願いします。

回答
投稿日時: 20/02/10 22:30:53
投稿者: simple

Frameを作成してから、そのなかにテキストボックスを配置してください。
その順序が逆になると、隠れて見えなくなります。

回答
投稿日時: 20/02/11 08:09:26
投稿者: MMYS

manatsu さんの引用:
UserForm上で可視化する手立てがありましたら教えてください。

他のコントロールの裏に隠れて、選択出来ない状態です。こういう時は
プロパティウインドウでオブジェクトを選択してください。
 

投稿日時: 20/02/11 17:59:58
投稿者: manatsu

simpleさん、MMYSさん、回答ありがとうございます。
3つのFrameを作成し、Frame3には複数のTextBoxをグループ化して配置したのです。Frame1、Frame2は見えおり問題ありません。
Frame3とその上に配置したグループ化したTextBoxがどこかにいってしまったのです。
TextBoxの上にFrameを置いた場合、Frameを移動すると背後のTextBoxが現れると思いますが、Frame1, Frame2を移動しても後ろにはなにもないのです。
別にテスト用のUserFormを作って、Frame, TextBox,グループ化、など組み合わせて試してみました。UserForm上でControlにフォーカスがあたっていなければ、プロパティウィンドウの上部のボックスのプルダウンに、隠れているものも含めてすべてが表示されるようです。
ところが今回の場合プロパティウィンドウに表示されないので、行方不明のものを選択することができません。
前述の「即効テクニック」のプロシージャを実行すると、見えないControlの存在が確認できるので、誤って削除してしまったとかではなく、あるのは間違いないようです。
40数個のContorolを置いてしまったので、多すぎるというようなことが原因なのでしょうか...。

回答
投稿日時: 20/02/11 18:27:26
投稿者: takesi

コントロールの一覧からどのへんにいるかさがしてみる?
 
同じUserFormにボタン設置して
Private Sub CommandButton1_Click()
' コントロールの一覧
For Each o In Controls
    Debug.Print o.Name & ":Top=" & o.Top&; ":Left=" & o.Left
Next
End Sub

回答
投稿日時: 20/02/11 20:03:19
投稿者: simple

Frame1
   Frame2
      TextBox1
      TextBox2
   Frame3
      TextBox3
という構造だと、デザイン画面で、
Frame1をアクティブ(クリックした状態)にして、プロパティウインドウで選択できるのは、
Frame1,Frame2,Frame3だけ。
Frame2をアクティブにすると、Frame2,TextBox1,Textbox2が選択肢に表示されます。
 
そして、肝心なのは、冒頭に私が書いた、作成順序が適正でないと
事後的にはどうにも修復はできないのではないかと思っています。
作成時点で勝負は付いてしまっているのではないですか?そんな気がします。

回答
投稿日時: 20/02/11 22:30:32
投稿者: takesi

プロパティのプルダウンに表示されないのなら、
対象コントロール追加してもいいと思いますけど。
プログラム、Formサイズ足しました。
 
また、Win10、office365で試したら
TextBoxを3個配置したのち
Frame1配置、その中にTextBox1移動、
Frame1の中にFrame2配置しその中にTextBox2移動
うまくフレーム内に入っています。(バージョンによるのか?)
 
' コントロールの一覧
For Each o In Controls
    Debug.Print o.Name & ":Top=" & o.Top & ":Left=" & o.Left
Next
Debug.Print Me.Name & ":Height=" & Me.Height & ":Width=" & Me.Width

回答
投稿日時: 20/02/11 22:34:09
投稿者: MMYS

manatsu さんの引用:

ところが今回の場合プロパティウィンドウに表示されないので

コントロールは上位オブジェクトの下に配置されます。通常はUserForm1に配置しますから、
上位オブジェクトはUserForm1です。
 
プロパティウィンドウに出でるリストは現在選択したオブジェクト配置下にあるコントロールです。
通常はUserForm1がアクティブなのてUserForm1に配置したコントロールだけがリストに出てきます。
 
例えば下記のような構造でUserForm1をアクティブにした状態の場合、
プロパティウィンドウのリストには
・Frame1
・Frame2
・CommandButton1
のみ表示されます。
 
UserForm1
 Frame1
  Textbox1
  Textbox2
 Frame2
  Textbox3
  Textbox4
 CommandButton1

プロパティウィンドウでTextbox4を選択したい場合はTextbox4はFrame2の配置下にあるので
Frame2をアクティブして(Frame2を選択して)からプロパティウィンドウでリスト選択です。
するとFrame2の配置下にある
・Textbox3
・Textbox4
がリストに出てきます。
 
つまり、今回のケースはどこかのフレームに入ってしまっているのでそのフレームをアクティブにしてから該当Textboxを選択となります。
問題は該当Textboxがどのフレームに属しているかが不明なことです。
どのフレームに属しているかは以下のコードを実行してください。
 
  Dim MyControl As Control
  For Each MyControl In Controls
    Debug.Print MyControl.Parent.Name, MyControl.Name
  Next

 
simple さんの引用:
作成順序が適正でないと

作成済テキストボックスをフレームに移動すれば
自動でフレーム内に配置され、上位オブジェクトはフレームに変更されます。もちろんその逆もです。
私は作成順序を気にしたことはありません。
 
 

回答
投稿日時: 20/02/12 00:45:07
投稿者: simple

ご指摘ありがとうございました。
 
作成順序という表現は不適切でした。両者の関係のさせかたといったら良いでしょうか。
1.「テキストボックスをフレームの中に移動」すればOKです。
    (フレームの中でテキストボックスを作成しても同じくOK)
2.テキストボックスとフレームが別の箇所に重ならないように作成されていて、
  テキストボックスの上に、フレームを移動してみてください。
  下に隠れてしまいませんか?
 
私の勘違いでしたら、失礼します。

投稿日時: 20/02/12 09:51:12
投稿者: manatsu

takesiさん、simpleさん、MMYSさん、ありがとうございます。
皆さんの丁寧なアドバイスのおかげで解決しました!
教えていただいたコードで居場所がわかりました。
グループ化したTextBoxを置いたのはFrame3で、それがFrame2の上におかれていたのにFrame2の枠が小さくて隠していたのです。
お騒がせいたしましたが、おかげさまでControlの入れ子関係、配置のに注意しなければいけないということ、勉強になりました。コード、今後ツールとしてありがたく使わせていただきます。