• ベストアンサー

ユーザフォームのスクロールについて

VBAの質問になります。 複数のフレームを順次並べ、縦長となったユーザフォームが存在します。 例えば、そのユーザフォームにスクロールバーを設置し、先頭のヘッダ部分だけ残し、それ以下のユーザーフォーム全体をスクロールしながら参照したいと思っています。 そのようなことはできるのでしょうか。 (縦長のユーザーフォームは、フレーム数に左右されるため可変なんです)

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.5

参考までに私がテストしたものです。 左がデザインで右が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

gge00741
質問者

お礼

いつもフォローして頂きありがとうございます。 ついに思い通りに行きました。 テストロジックまで作成いただき本当に感謝です。 Me.大外フレーム.Pasteで、フレームまでコピーされるのですね。 こちら、大枠を定義したあと、フレームだけをループでpastしていました。それで表示や不要のものが多数表示されたのだと思います。全ては、Me.大外フレーム.Pasteをループの中に入れていなかったことでした。 本当にフォローありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.6

No5の 'j=(Copy回数+1) は 'j=(Past回数+1) でした。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.4

No3の補足です。 Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * 1.2 だと、追加した回数が増えるにつれスクロールしたときの最後のFrameの無い部分が長くなるので Frame1を必要なだけ追加した後で Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height(実際にステップした高さ) * (追加した回数+1) くらいにしておくと最後のFrameの無い部分がほぼ一定になりいいかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.3

> フレーム数が可変なため、大枠のフレームを作成する際に、大きめに確保しスクロールバーを設定しなければならないのですよね。 事前にヘッダ部分をずらした大外のフレームにFrame1を入れ込んでフォームの大きさに合わせてデザインしておくといいと思います。 それでFrame1の追加で以下を実行すればいけると思います。 Me.Frame1.SetFocus Me.大外フレーム.Copy Me.大外フレーム.Paste Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * 1.2 最後のMe.Frame1.Height * 1.2は適当なのでご自身のサイズに合わせて適宜変更してください。

gge00741
質問者

補足

前回の質問より、いつもフォローして頂きありがとうございます。 実はまだうまくできておりません。 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
  • ベストアンサー率65% (1633/2478)
回答No.2

No1の補足です。 アクセスだとサブフォームでできますが、No1はエクセルのユーザーフォームとして考えています。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.1

スクロールしたいフレームを含む大外のフレームを作成してそれにスクロールバーを作成します。プロパティのScrollBarsで設定できます。 以下のサイトはフォームにつける説明ですがこれをフレームにつけてください。 Excel VBA ユーザーフォームにスクロールバーを表示(追加)する方法 https://officedic.com/excel-vba-userform-scrollbars/ スクロールしたくないヘッダを大外のフレーム外に設置します。 簡単なイメージの画像を添付します。

gge00741
質問者

補足

回答ありがとうございます。 フレーム数が可変なため、大枠のフレームを作成する際に、大きめに確保しスクロールバーを設定しなければならないのですよね。 また、縦長フォームにあとから動的に大枠フレームをつけるのではなく、事前にヘッダ部分をずらした大枠フレームを定義しておくのでしょうか。画面上あまり縦長に定義できませんが、プロパティでサイズ変更して試してみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAで、ユーザーフォームのスクロールボックスの移動ピッチを細かくしたい

    VBA初心者です。 ユーザーフォームに配置したスクロールバー内のスクロールボックスを、マウスでドラッグした時の移動ピッチを細かくすることは可能でしょうか?両側のスクロール矢印ボタンを押したときの移動ピッチは、設定可能ですが・・・ よろしくお願いします。

  • Access フォームのスクロール

    お世話になります。 Access2010 現在Accessにて、ある情報の登録フォームを作成しております。 登録項目が複数あり、1画面(デスクトップのサイズ)だけでは 収まりきれないないので、登録フォームをスクロールさせたいと 思います。 但し、ユーザーには登録フォームのサイズを調整できないようにしたいので 境界線スタイルを「ダイアログ」にしております。 <質問> 境界線スタイルが「細線」か「ダイアログ」だと、スクロールバーを 表示する設定にしても、表示されません。 「サイズ調整可」にするとスクロールバーが表示されます。 スクロールバーを表示しつつ、フォームのサイズが変更されないように 出来ないでしょうか。 ご教示の程、宜しくお願い致します。

  • アクセスVBA フォームのスクロールバーを動かす。

    アクセスVBA フォームのスクロールバーを動かす。 作成したフォームの横スクロールバーポジションを、一番右端や左端にしてしまうことをVBA側でしたいのですが可能でしょうか? コードがわかりません。お願い致します。

  • ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)

    お世話になります。 エクセルで、上下に長いのでスクロールさせて使うユーザーフォームを作成しています。 このユーザーフォームが、ホイールでスクロールできないので、できるようにしたいのですがどうしたら良いでしょうか? フリーソフトはインストールできない環境ですので、できればVBAで行いたいのですが方法はありますでしょうか。 よろしくお願いします。

  • スクロールバーの表示について

    お世話になります。 フォームやフレームにスクロールバーを表示させたいのですがScrollBarsプロパティやKeepScrollBarsVisibleプロパティに値を設定してもレールの部分だけ表示されてバーが表示されません。 というのもフォームやフレームの中にたくさんコントロールを置きたいのですがフォームやフレームの中に納まらないためスクロールバーでスクロールして納まらない部分も表示できるようにしたいと思っています。 フォームやフレームの中をスクロールするにはどうすればよいのでしょうか(テキストボックスではバーが表示されスクロールできます)。 よろしくお願い致します。

  • ユーザーフォームへの文字の表示方法について

    VBAを始めたばかりの超初心者です。単純にユーザーフォームを作って検索ボタンを付け、検索結果を表示させる。こんな単純な事がわからずに困っています。 問題は何行もヒットしたらスクロールバーはどうするのか? 検索結果だけの部分をスクロールさせたい。 コントロールは何を張るのか?ラベル?テキストボックス? 検索したい情報はエクセルで有るのでそれを引っ張ってきたいだけなですが。。 出来れば同一のユーザーフォームに表示させたいです。 どなたか教えて下さい。宜しくお願い致します。

  • ユーザーフォームのスクロールについて(エクセル2000VBA)

    お世話になります。 上下に長いユーザーフォームを作成し、スクロールして使っています。 1~4まで項目があり、ボタンをクリックするとその項目の先頭まで自動的にスクロールするような仕組みを作りたいのですがどうしたらよいでしょうか? Private Sub CommandButton1_Click()  TextBox1.SetFocus  '項目の先頭にあるテキストボックスに移動する End Sub という風なコードはできたのですが、ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。 また、上方向にいく時も、テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。 例えば、FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。 よろしくお願いします。

  • フォームに自動的にスクロールバー(縦と横)を表示させる

    VBAにつぃて教えて下さい フォームがWindowsサイズより大きくなると自動的にスクロールバー(縦と横)が作成される設定はどのようにするのでしょうか。  また、出てきたスクロールバーに色を付けることは出来るのでしょうか。

  • ヘッダとフッタが固定でコンテンツのみスクロール可能

    いつもお世話になります。 ヘッダ部とフッタ部は固定で、コンテンツ部のみで表示エリアを超えた場合スクロールバーを 表示する、というHTMLを実現するにはどうすればよいでしょうか。 (ウィンドウサイズに応じてコンテンツ部は変動するが、ヘッダとフッタは常に固定) イメージとしては以下の構成になります。いろいろ調べてみたのですが、ヘッダとフッタは固定 できてもスクロールバーがウィンドウ全体に表示されてしまうものばかりでした。 -------------------------------- ヘッダ(固定) (スクロールバーなし) -------------------------------- コンテンツ (スクロールバーあり) -------------------------------- フッタ(固定) (スクロールバーなし) -------------------------------- フレームは使用せず、CSSのみで実現する方法を教えて頂けませんでしょうか。 IE7、IE8で動作させたいと思っています。 宜しくお願いします。

    • 締切済み
    • CSS
  • フレームのスクロールをできなくしたい。

    左右に分けて、右のフレームを上下に分けています。 右上のフレームをスクロールしないようにしたいのです。 スクロールバーの非表示をしたり、 フレームのサイズを不変にしたりしてみたのですが、 マウスで動かすとスクロールできてしまいました。 スタイルシートを使わない方法を教えてください。 もし方法がない場合でも、ないことを教えていただけると助かります。 どなたかよろしくお願いします。