

お世話になります。
上下に長いユーザーフォームを作成し、スクロールして使っています。
1~4まで項目があり、ボタンをクリックするとその項目の先頭まで自動的にスクロールするような仕組みを作りたいのですがどうしたらよいでしょうか?
Private Sub CommandButton1_Click()
TextBox1.SetFocus
'項目の先頭にあるテキストボックスに移動する
End Sub
という風なコードはできたのですが、ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。
また、上方向にいく時も、テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。
例えば、FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。
よろしくお願いします。
No.1
- 回答日時:
こんにちは。
こういうことでしょうか?
Private Sub CommandButton1_Click()
TextBox1.SetFocus
TextBox1.SelStart = 0
End Sub
>FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。
もし、そうしたいのでしたら、Htm ファイルを作り、適当なフォルダに置き、Html ソースの中にボタンのコマンドのソースを置き、WebBrowser コントロールで、呼び出せばよいです。
以下の意味が分りかねます。
>ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。
コマンドボタンを、テキストボックスの中にでも入れているのでしょうか?
テキストボックスの中に入れても、不便だと思います。
>テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。
良く分りません。テキストボックスに、ラベルをつければ、ラベルの下は見えなくなりますが、テキストボックスにラベルが固定されるのではなく、ユーザーフォームに固定されるはずです。
この回答への補足
TextBox1.SelStart = 0
というコードはテキストボックス内の文字列に使うものなのですね!これも知りませんでした。とても勉強になります。ありがとうございます。
ご回答どうもありがとうございます。
説明が下手ですみません…。
#4でおっしゃってる通り、長~いユーザーフォームなのです。
1.タイトル
TextBox1
TextBox2 …
CommandButton1
2.タイトル
TextBox3
TextBox4 …
CommandButton2
のようになっていて、CommandButton2をクリックすると1.タイトルがユーザーフォームの一番上に表示されて、TextBox1にSetFocusされる、という風にしたかったのです…。
No.2
- 回答日時:
こんにちは。
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で関数を作るというのは全くやってみたことがないので、勉強しながら作ってみたいと思います!
No.3ベストアンサー
- 回答日時:
#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
ありがとうございます!
SetFocusが先なんですね。
こちらで書かれている方のコードを使わせていただきます。とても助かりました!
動かすプロシージャと動くプロシージャを分けて書くことがあまりなかったので、今後も使っていきたいです。
No.4
- 回答日時:
#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
こんなのは、どうでしょうかしらね。
どうもありがとうございます。
すごいですね!下にスクロールするとラベルが付いてくるんですね!これだと同じリンク先のものを沢山作らなくてもいいし楽しいですね。
イベントの出だしが長くて難しいですががんばってみます。
No.5
- 回答日時:
こんにちは。
KenKen_SP です。#1 へのレスを見て初めて気が付いたのですが、、
ラベルではなくコマンドボタンで、、ということでしたね。失礼。
#2、#3 の両コードはコマンドボタンでも動きますので、イベント部
を差替えて下さい。
#4 Wendy02 さんのスクロールに追従するラベル(OR コマンドボタン)
のアイディアは面白いと思いますよ。#3のコードなんかと組み合わせ
ると良さそう。
例えば、
各項目に飛ぶボタンは固定にしておいて、フォームの先頭に戻るボタン
をスクロールに追従するボタンにするとか?
こうすれば、フォームの先頭に戻るボタンを幾つも書かなくて済みそう
ですね。
KenKen_SPさんもWendy02さんも、何回もご回答どうもありがとうございます。
おかげさまで思っていた通りのユーザーフォームができそうです。各項目へのリンクはボタンで、スクロールに追従するものはラベルにしようかと思っています。
お世話になりました!m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 意図せずサブプロシージャを移動してしまうのを止めたい 1 2022/09/02 09:19
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Visual Basic(VBA) excel vba でユーザーフォーム入力ができない 2 2022/12/12 14:42
- Visual Basic(VBA) ExcelVBAでユーザーフォームでテキストボックスなどからセルに連続して入力するコーディングの際の 2 2022/06/29 22:51
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) フレーム内のオプションボタンの選択結果をセルに書き出したい。 図のような預金種目というフレームにオプ 2 2022/07/29 11:12
このQ&Aを見た人はこんなQ&Aも見ています
-
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
VBAでフォームのスクロールバーが下にいってしまう
Visual Basic(VBA)
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
6
ユーザーフォームで動的(Me.Controls.Add)に作成したコントロールの削除
Visual Basic(VBA)
-
7
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
8
スクロールバーをVBAで操作したい
Access(アクセス)
-
9
ユーザーフォームでTextBox1にカーソルを移動したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAのユーザーフォームに...
-
ExcelVBAでセルをクリックして...
-
ユーザーフォームのスクロール...
-
Autocad LT 引き出し線の上に文...
-
コマンドプロンプト使用時に「'...
-
アクセスで検索ボタンを作りた...
-
jw-win CAD のコマンドの操...
-
Access「レコードの移動」マク...
-
Notesでアンケートをとりたい
-
アクセスで「モジュールがあり...
-
コマンドボタンに色を付けるこ...
-
ACCESS フォームでの、データ...
-
アクセスで数値型のフィールド...
-
データベースのINT型項目にNULL...
-
Access レポート印刷するときに...
-
サブフォームに対してGoToRecor...
-
passwordが入れられません・・・・
-
ACCESS フォームをそのまま印刷...
-
エクセルをACCESSのレポ...
-
Accessレポートのチェックボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCEL VBAのユーザーフォームに...
-
エクセルVBA オプションボタ...
-
ExcelVBAでセルをクリックして...
-
アクセスで「モジュールがあり...
-
ACCESS フォームでの、データ...
-
標準モジュールだとエラーにな...
-
エクセルVBAからアクセスフ...
-
JW-CADのAutoモードの解除はで...
-
Accessでエラーメッセージの表...
-
Notesでアンケートをとりたい
-
ExcelVBAで指定外のUserFormを...
-
ユーザーフォームのスクロール...
-
コマンドプロンプト使用時に「'...
-
ACCESS フォームで、ボタンの...
-
access の 閉じるボタンを無効...
-
ACCESS カンマをスペースに置...
-
エクセルVBA ユーザーフォーム...
-
ACCESS VBAで別のプ...
-
Accessでaccdeへ変換で機能しない
-
USBメモリを丸ごと仮想イメージ...
おすすめ情報