アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
上下に長いユーザーフォームを作成し、スクロールして使っています。

1~4まで項目があり、ボタンをクリックするとその項目の先頭まで自動的にスクロールするような仕組みを作りたいのですがどうしたらよいでしょうか?

Private Sub CommandButton1_Click()
 TextBox1.SetFocus
 '項目の先頭にあるテキストボックスに移動する
End Sub

という風なコードはできたのですが、ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。
また、上方向にいく時も、テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。

例えば、FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。
よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます!
SetFocusが先なんですね。

こちらで書かれている方のコードを使わせていただきます。とても助かりました!

動かすプロシージャと動くプロシージャを分けて書くことがあまりなかったので、今後も使っていきたいです。

お礼日時:2005/10/20 15:32

こんにちは。

KenKen_SP です。

#1 へのレスを見て初めて気が付いたのですが、、

ラベルではなくコマンドボタンで、、ということでしたね。失礼。
#2、#3 の両コードはコマンドボタンでも動きますので、イベント部
を差替えて下さい。

#4 Wendy02 さんのスクロールに追従するラベル(OR コマンドボタン)
のアイディアは面白いと思いますよ。#3のコードなんかと組み合わせ
ると良さそう。

例えば、

各項目に飛ぶボタンは固定にしておいて、フォームの先頭に戻るボタン
をスクロールに追従するボタンにするとか?

こうすれば、フォームの先頭に戻るボタンを幾つも書かなくて済みそう
ですね。
    • good
    • 0
この回答へのお礼

KenKen_SPさんもWendy02さんも、何回もご回答どうもありがとうございます。
おかげさまで思っていた通りのユーザーフォームができそうです。各項目へのリンクはボタンで、スクロールに追従するものはラベルにしようかと思っています。
お世話になりました!m(_ _)m

お礼日時:2005/10/20 15:45

#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

こんなのは、どうでしょうかしらね。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

すごいですね!下にスクロールするとラベルが付いてくるんですね!これだと同じリンク先のものを沢山作らなくてもいいし楽しいですね。

イベントの出だしが長くて難しいですががんばってみます。

お礼日時:2005/10/20 15:40

こんにちは。

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
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます!
ScrollTopというのを使えばいいのですね。
Meキーワードも、今までユーザーフォームの名前をいちいち書いていたのでとても楽になりました。

マウスポインタは、プロパティウィンドウのMousePointerで変更してました。リンクはやっぱり指のカーソルかな、と思いまして…。

VBAで関数を作るというのは全くやってみたことがないので、勉強しながら作ってみたいと思います!

お礼日時:2005/10/20 15:00

こんにちは。



こういうことでしょうか?

Private Sub CommandButton1_Click()
 TextBox1.SetFocus
 TextBox1.SelStart = 0
End Sub

>FAQサイトによくあるような、目次をクリックするとその項目が一番上に表示され、「Top」をクリックしてページ先頭にジャンプするような感じにしたいのですが…。

もし、そうしたいのでしたら、Htm ファイルを作り、適当なフォルダに置き、Html ソースの中にボタンのコマンドのソースを置き、WebBrowser コントロールで、呼び出せばよいです。

以下の意味が分りかねます。
>ボタンの位置よりテキストボックスが下にあると、フォーカスしたテキストボックスがユーザーフォームの一番下に表示されてしまいます。

コマンドボタンを、テキストボックスの中にでも入れているのでしょうか?
テキストボックスの中に入れても、不便だと思います。

>テキストボックスの1行上に配置してあるタイトル(ラベルで作成しました)が表示されないので少し不便な気がします。

良く分りません。テキストボックスに、ラベルをつければ、ラベルの下は見えなくなりますが、テキストボックスにラベルが固定されるのではなく、ユーザーフォームに固定されるはずです。

この回答への補足

TextBox1.SelStart = 0
というコードはテキストボックス内の文字列に使うものなのですね!これも知りませんでした。とても勉強になります。ありがとうございます。

補足日時:2005/10/20 12:00
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。
説明が下手ですみません…。
#4でおっしゃってる通り、長~いユーザーフォームなのです。

1.タイトル
  TextBox1
  TextBox2 …
  CommandButton1
2.タイトル
  TextBox3
  TextBox4 …
  CommandButton2

のようになっていて、CommandButton2をクリックすると1.タイトルがユーザーフォームの一番上に表示されて、TextBox1にSetFocusされる、という風にしたかったのです…。

お礼日時:2005/10/20 11:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています