次の方法で共有


ユーザーフォームのオブジェクトの表示順序について

質問

2016年4月1日金曜日 6:00

ユーザーフォームでリストボックスを複数設置し、

データ一覧をテーブル風に表示させようとしています。

そこでリストボックスの縦スクロールバーが邪魔となり、

隣のリストボックスを少し被せる形で表示させないようにしました。

ですが、順序がバラバラになり、うまいこと被せられません。

表示順序を設定するコードとして「ZOrder」がありますが、

前面か背面にするだけのものでした。

最前面にするという設定はできないのでしょうか?

また、苦労して調整した後、いざ実行してみると、

調整したはずの表示順序が崩れてしまう現象が発生します。

コンパイル時に自動で表示順序を可変しているのでしょうか?

だとしたら何を基準に可変しているのでしょうか?

すべての返信 (7)

2016年4月1日金曜日 6:35 ✅回答済み | 1 票

デザインで調整した表示順序が実行時に変わってしまう現象は確認できませんでしたが、

コード上で最前面に移動するには下記のコードでできるようです。

Control1.ZOrder vbBringToFront

※Control1は移動させるコントロール


2016年4月2日土曜日 1:31 ✅回答済み | 1 票

コントロールがアクティブになった時にどうしてもアクティブになったスクロールバーが表示されるのは仕様のようです。また、リストボックスのスクロールバーを非表示にする設定もないようです。

なので、代替案を考えた方がよさそうです。

例えば常に10行表示させているなら10行以内ならスクロールバーが表示されないので、1例ですが、ScrollBar1の操作のタイミングでデータの表示範囲を変えればよいかと思います。

Private Sub ScrollBar1_Change()
ListBox1.RowSource = Range("A1:A10").Offset(ScrollBar1.Value).Address
ListBox2.RowSource = Range("B1:B10").Offset(ScrollBar1.Value).Address
End Sub


2016年4月2日土曜日 1:59

>kenjinoteさま

ご返答ありがとうございます。

おっしゃる通りのコードで最前面設定できましたが、

アクティブ時にまた可変されてしまうようです。


2016年4月2日土曜日 2:00

>nomboさま

なるほど!!

かなり複雑な(重い)処理になりそうですが、試してみます。

ご返答ありがとうございます。


2016年4月2日土曜日 6:15 | 1 票

> booyan999さま

ご検;ありがとうございます。
こちらでも確認しましたが、どうもリストボックスの場合だけ特別な処理で
フォーカス時にリストボックス以外のコントロールより前面に移動してしまうようでした。

内部的に特別な処理なので解決は難しそうですが、
同じリストボックスであれば被せるようにできるかもしれません。

Private Sub UserForm_Initialize()
    For i = 1 To 30
        ListBox1.AddItem "アイテム" & i
    Next i
    ListBox1.TabStop = False ' Tab キーでフォーカスが移ると前面に移動することがある為
    ListBox2.TabStop = False ' Tab キーでフォーカスが移ると前面に移動することがある為
    ListBox2.SetFocus ' 初期表示時に ListBox2 にフォーカスがないと ListBox1 が前面になってしまうことがある為
End Sub

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
                                                     ByVal X As Single, ByVal Y As Single)
   ListBox2.ZOrder vbBringToFront
End Sub

上記コードでもListBox1のスクロールバーをクリックしたときはListBox1が前面に出てきてしまうことがありました。
スクロールバー部分を完全に覆ってしまえばよいですが・・・
以上参考になりましたら幸いです。


2016年4月6日水曜日 5:12

>kenjinoteさま

ご返信ありがとうございます。

なるほど!!

アクティブ時にも隣をムリヤリ前面配置することで、前面化回避しているわけですね。

大変参考になりました。むしろ解決です!

初期表示時やアクティブ時に前面になったりならなかったり、というのは謎ですね。


2016年4月6日水曜日 5:33

>kenjinoteさま

リストボックス2個であればなんの問題もなく表現できましたが、

8個くらいのリストボックスを並べて同じことをすると、PCスペックの問題かもしれませんが、

リストをクリックするたびにフォーカスと前面配置の処理が0.2秒ほどですが、チラつきます。

そこは我慢しろと言われればそれまでですが、、、

以上ご報告でした。