- ベストアンサー
ユーザーフォームのスクロールについて(エクセル2000VBA)
お世話になります。 上下に長いユーザーフォームを作成し、スクロールして使っています。 1~4まで項目があり、ボタンをクリックするとその項目の先頭まで自動的にスクロールするような仕組みを作りたいのですがどうしたらよいでしょうか? Private Sub CommandButton1_Click() TextBox1.SetFocus '項目の先頭にあるテキストボックスに移動する End Sub という風なコードはできたのですが、ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。 また、上方向にいく時も、テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。 例えば、FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2 です。 フォーカスを移す必要があるなら、先に SetFocus して下さい。 Me.CommandButton5.SetFocus Me.ScrollTop = GetTop("CommandButton5") こんな感じ。 補足ですが、、 別に関数にしなくとも良いのです。 同じ Caption が存在する可能性があるならコントロール名を渡せ ば良いかと。次のような感じ。 Private Sub Label1_Click() With Me.CommandButton5 .SetFocus ’フォーカスが必要な場合のみ FormScroll .Name End With End Sub Private Sub Label2_Click() ’フォーカスが不要な場合 FormScroll Me.Label1.Name End Sub '引数で渡した名前を持つコントロールへスクロールさせる Private Sub FormScroll(ByVal strCtrlName As String) Dim Ctrl As Object 'スクロール補正値(適当に変更して下さい) Const PosOffset = 10& On Error Resume Next Me.ScrollTop = Me.Controls(strCtrlName).Top - PosOffset End Sub
その他の回答 (4)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 #1 へのレスを見て初めて気が付いたのですが、、 ラベルではなくコマンドボタンで、、ということでしたね。失礼。 #2、#3 の両コードはコマンドボタンでも動きますので、イベント部 を差替えて下さい。 #4 Wendy02 さんのスクロールに追従するラベル(OR コマンドボタン) のアイディアは面白いと思いますよ。#3のコードなんかと組み合わせ ると良さそう。 例えば、 各項目に飛ぶボタンは固定にしておいて、フォームの先頭に戻るボタン をスクロールに追従するボタンにするとか? こうすれば、フォームの先頭に戻るボタンを幾つも書かなくて済みそう ですね。
お礼
KenKen_SPさんもWendy02さんも、何回もご回答どうもありがとうございます。 おかげさまで思っていた通りのユーザーフォームができそうです。各項目へのリンクはボタンで、スクロールに追従するものはラベルにしようかと思っています。 お世話になりました!m(_ _)m
- Wendy02
- ベストアンサー率57% (3570/6232)
#1のWendy02です。 KenKey_SPさんのを読みながら、ヘンだなって思いながらやっと分りました。長~いユーザーフォームを短くして使っているっていうことが分りませんでした。考えてもみませんでした。(^^; スクロールについていくラベルをひとつ作ったらいかがしから?もちろん、これはボタンでも構いません。場所は、テキストボックスにひっかからないように、配置すればよいです。 長い先頭のコードは、スクロール・イベントの出だしです。 Private Sub UserForm_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle) Label1.Top = ScrollTop + 20 '付加する数字は適宜 End Sub Private Sub Label1_Click() ScrollTop = 0 End Sub こんなのは、どうでしょうかしらね。
お礼
どうもありがとうございます。 すごいですね!下にスクロールするとラベルが付いてくるんですね!これだと同じリンク先のものを沢山作らなくてもいいし楽しいですね。 イベントの出だしが長くて難しいですががんばってみます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 ラベルのClickイベントに次のようなコードを書きこみます。 Private Sub Label1_Click() Me.ScrollTop = 200 End Sub ここで Me キーワードはユーザーフォーム自身を指しています。 この ScrollTop プロパティーを 0 にすればフォームの先頭 までスクロールします。 応用するならキャプションやコントロール名から Top プロパティー の値を返す関数を作って、その戻り値をフォームの Scrolltop プロパティーに設定してやれば良いかも。 例えば、こんな感じ。Label1 をクリックすると Label6 という キャプションの位置までスクロールさせます。ちなみに、まともな エラー処理はしてません。 あとは、Mouseup イベントとかで マウスポインタ を差し替えたり すると リンク っぽく見えて面白いかも。 どうでしょうか? 'ラベルクリックイベント Private Sub Label1_Click() Me.ScrollTop = GetTop("Label5") End Sub '指定 Caption を持つコントロールの Top プロパティー値を返す Private Function GetTop(strCaption As String) As Double Dim Ctrl As Object 'スクロール補正値(適当に変更して下さい) Const PosOffset = 10& On Error Resume Next For Each Ctrl In Me.Controls If Ctrl.Caption = strCaption Then GetTop = Ctrl.Top - PosOffset End If Next Ctrl End Function
お礼
ご回答どうもありがとうございます! ScrollTopというのを使えばいいのですね。 Meキーワードも、今までユーザーフォームの名前をいちいち書いていたのでとても楽になりました。 マウスポインタは、プロパティウィンドウのMousePointerで変更してました。リンクはやっぱり指のカーソルかな、と思いまして…。 VBAで関数を作るというのは全くやってみたことがないので、勉強しながら作ってみたいと思います!
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 こういうことでしょうか? Private Sub CommandButton1_Click() TextBox1.SetFocus TextBox1.SelStart = 0 End Sub >FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。 もし、そうしたいのでしたら、Htm ファイルを作り、適当なフォルダに置き、Html ソースの中にボタンのコマンドのソースを置き、WebBrowser コントロールで、呼び出せばよいです。 以下の意味が分りかねます。 >ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。 コマンドボタンを、テキストボックスの中にでも入れているのでしょうか? テキストボックスの中に入れても、不便だと思います。 >テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。 良く分りません。テキストボックスに、ラベルをつければ、ラベルの下は見えなくなりますが、テキストボックスにラベルが固定されるのではなく、ユーザーフォームに固定されるはずです。
お礼
ご回答どうもありがとうございます。 説明が下手ですみません…。 #4でおっしゃってる通り、長~いユーザーフォームなのです。 1.タイトル TextBox1 TextBox2 … CommandButton1 2.タイトル TextBox3 TextBox4 … CommandButton2 のようになっていて、CommandButton2をクリックすると1.タイトルがユーザーフォームの一番上に表示されて、TextBox1にSetFocusされる、という風にしたかったのです…。
補足
TextBox1.SelStart = 0 というコードはテキストボックス内の文字列に使うものなのですね!これも知りませんでした。とても勉強になります。ありがとうございます。
お礼
ありがとうございます! SetFocusが先なんですね。 こちらで書かれている方のコードを使わせていただきます。とても助かりました! 動かすプロシージャと動くプロシージャを分けて書くことがあまりなかったので、今後も使っていきたいです。