- ベストアンサー
ユーザフォームのスクロールについて
VBAの質問になります。 複数のフレームを順次並べ、縦長となったユーザフォームが存在します。 例えば、そのユーザフォームにスクロールバーを設置し、先頭のヘッダ部分だけ残し、それ以下のユーザーフォーム全体をスクロールしながら参照したいと思っています。 そのようなことはできるのでしょうか。 (縦長のユーザーフォームは、フレーム数に左右されるため可変なんです)
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
参考までに私がテストしたものです。 左がデザインで右がFrame1を10回下にコピーを実行した後です。 大外フレームの中だけがスクロールします。 以下がその時のコードです。 Private Sub CommandButton1_Click() Dim j As Long Me.Frame1.SetFocus Me.大外フレーム.Copy For j = 1 To 10 Me.大外フレーム.Paste With Me.Controls("Frame" & j + 1) .Caption = "Frame" & j + 1 .Left = Me.Frame1.Left .Top = Me.Frame1.Top + Me.Frame1.Height * j End With Me.Controls("TextBox" & j * 3 + 1).Value = Me.Controls("TextBox" & j * 3 + 1).Name Me.Controls("TextBox" & j * 3 + 2).Value = Me.Controls("TextBox" & j * 3 + 2).Name Me.Controls("TextBox" & j * 3 + 3).Value = Me.Controls("TextBox" & j * 3 + 3).Name Next Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * j 'j=(Copy回数+1) End Sub 実行後のフォームに配置されている全てのコントロール名は以下のようになっています。 1:MyControl.Name = TextBox1 2:MyControl.Name = TextBox2 3:MyControl.Name = Frame1 4:MyControl.Name = 大外フレーム 5:MyControl.Name = Label1 6:MyControl.Name = Label2 7:MyControl.Name = CommandButton1 8:MyControl.Name = TextBox3 9:MyControl.Name = Label3 10:MyControl.Name = Frame2 11:MyControl.Name = TextBox4 12:MyControl.Name = TextBox5 13:MyControl.Name = TextBox6 14:MyControl.Name = Frame3 15:MyControl.Name = TextBox7 16:MyControl.Name = TextBox8 17:MyControl.Name = TextBox9 18:MyControl.Name = Frame4 19:MyControl.Name = TextBox10 20:MyControl.Name = TextBox11 21:MyControl.Name = TextBox12 22:MyControl.Name = Frame5 23:MyControl.Name = TextBox13 24:MyControl.Name = TextBox14 25:MyControl.Name = TextBox15 26:MyControl.Name = Frame6 27:MyControl.Name = TextBox16 28:MyControl.Name = TextBox17 29:MyControl.Name = TextBox18 30:MyControl.Name = Frame7 31:MyControl.Name = TextBox19 32:MyControl.Name = TextBox20 33:MyControl.Name = TextBox21 34:MyControl.Name = Frame8 35:MyControl.Name = TextBox22 36:MyControl.Name = TextBox23 37:MyControl.Name = TextBox24 38:MyControl.Name = Frame9 39:MyControl.Name = TextBox25 40:MyControl.Name = TextBox26 41:MyControl.Name = TextBox27 42:MyControl.Name = Frame10 43:MyControl.Name = TextBox28 44:MyControl.Name = TextBox29 45:MyControl.Name = TextBox30 46:MyControl.Name = Frame11 47:MyControl.Name = TextBox31 48:MyControl.Name = TextBox32 49:MyControl.Name = TextBox33
その他の回答 (5)
- kkkkkm
- ベストアンサー率66% (1742/2617)
No5の 'j=(Copy回数+1) は 'j=(Past回数+1) でした。
- kkkkkm
- ベストアンサー率66% (1742/2617)
No3の補足です。 Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * 1.2 だと、追加した回数が増えるにつれスクロールしたときの最後のFrameの無い部分が長くなるので Frame1を必要なだけ追加した後で Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height(実際にステップした高さ) * (追加した回数+1) くらいにしておくと最後のFrameの無い部分がほぼ一定になりいいかもしれません。
- kkkkkm
- ベストアンサー率66% (1742/2617)
> フレーム数が可変なため、大枠のフレームを作成する際に、大きめに確保しスクロールバーを設定しなければならないのですよね。 事前にヘッダ部分をずらした大外のフレームにFrame1を入れ込んでフォームの大きさに合わせてデザインしておくといいと思います。 それでFrame1の追加で以下を実行すればいけると思います。 Me.Frame1.SetFocus Me.大外フレーム.Copy Me.大外フレーム.Paste Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * 1.2 最後のMe.Frame1.Height * 1.2は適当なのでご自身のサイズに合わせて適宜変更してください。
補足
前回の質問より、いつもフォローして頂きありがとうございます。 実はまだうまくできておりません。 Me.waku.Copyのため、大枠フレーム(スクロールバー付))は事前にVBEで定義して おかないといけないと思いますが、事前に大枠フレームを定義し、その中に本来のframe1を定義し コピーして増やしていくと、フォーマットが重なり、Copy/Pastしたおぼえのないframe1まで ズレて重なって出てきて、表示がぐちゃぐちゃになってしまいました。 (ユーザフォームの最初のheightが足りないのかもしれませんが、画面上一杯とっていますし、どの道、中に表示するフレームを増やして 行くのでユーザフォームも高さが足りなくなります。大枠の下限も、基本のframe1よりも大きくしていますが、ユーザフォームには収まるようにVBE画面で定義しています) そのため、事前の大枠定義はまずいかなと思い、まずはVBE定義でヘッダのすぐ下に大枠の元とする フレームを配置(ただし、横幅は本来の長さですが、高さは薄っぺらい12程度、スクロールバー付) し、その真下に本来の縦長データを作成していきます。(前の現象があるため大枠フレーム中には入れないようにしました) 次に、frame1 copy/pastを繰り返しデータが出来上がったところで、ご教授頂いた、 Me.Frame1.SetFocus Me.大外フレーム.Copy Me.大外フレーム.Paste Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * xxx を行いましたが、今度は、Me.大枠フレーム.pastのところで、Excelがハングし、落ちてしまいます。 なにかまずい点はありますでしょうか。なかなかうまくいかず困っています。 申し訳ありませんが、ご教授をいただけると助かります。 複数フレームを縦長ユーザフォームに配置したものに、簡単にスクロールバーを付けられると思いましたが、甘かったです。
- kkkkkm
- ベストアンサー率66% (1742/2617)
No1の補足です。 アクセスだとサブフォームでできますが、No1はエクセルのユーザーフォームとして考えています。
- kkkkkm
- ベストアンサー率66% (1742/2617)
スクロールしたいフレームを含む大外のフレームを作成してそれにスクロールバーを作成します。プロパティのScrollBarsで設定できます。 以下のサイトはフォームにつける説明ですがこれをフレームにつけてください。 Excel VBA ユーザーフォームにスクロールバーを表示(追加)する方法 https://officedic.com/excel-vba-userform-scrollbars/ スクロールしたくないヘッダを大外のフレーム外に設置します。 簡単なイメージの画像を添付します。
補足
回答ありがとうございます。 フレーム数が可変なため、大枠のフレームを作成する際に、大きめに確保しスクロールバーを設定しなければならないのですよね。 また、縦長フォームにあとから動的に大枠フレームをつけるのではなく、事前にヘッダ部分をずらした大枠フレームを定義しておくのでしょうか。画面上あまり縦長に定義できませんが、プロパティでサイズ変更して試してみます。 ありがとうございました。
お礼
いつもフォローして頂きありがとうございます。 ついに思い通りに行きました。 テストロジックまで作成いただき本当に感謝です。 Me.大外フレーム.Pasteで、フレームまでコピーされるのですね。 こちら、大枠を定義したあと、フレームだけをループでpastしていました。それで表示や不要のものが多数表示されたのだと思います。全ては、Me.大外フレーム.Pasteをループの中に入れていなかったことでした。 本当にフォローありがとうございました。