|
▼年寄り さん:
こんばんは。
>>'===========================================================
>>Property Get f_txt(id As Long) As msforms.TextBox
>> Set f_txt = c_txt(id).txt
>>End Property
>>
これは、Userform2に独自のプロパティを作成したことになります。
これにより、
Userform2.f_txt(15) で15番目のテキストボックスが取得できます。
Range("a1").offset(2) なんていうのとよく似ています。
でも、ちょっと難しいでしょうか?
まっ、ちょっとしたきっかけである日突然ピンと来る日がきます。
>またまた新しく出てきたこれが何かを調べていました。結局あまりすっきりとはしませんでした。
>
>とりあえず目的としていたことは実現いたしました。固定枠で入力されたデータをスクロールの適切な位置に当てはめることは出来ました。
>
>ところが新たな行き詰まりが出現。手動でスクロールバーの釣鐘を上げ下げしなければ、現在標的とされているコントロールの位置に行かないのです。
これも引き続きUserform2を例にあげます。
ちょっとだけ又、コードを追加します。
Userform2のモジュールに
'===========================================================
Dim c_txt(1 To 20) As Class1
'===========================================================
Private Sub UserForm_Initialize()
Dim p As Page
Dim sz As Double
Dim wk As String
Dim idx As Long
With Me
.Height = 300
.Width = 420
End With
With Controls.Add("Forms.MultiPage.1", "mltp")
'↑マルチページに名前を付けます
.Top = 75
.Left = 5
.Height = 200
.Width = (9.75 * 40 + 12) + 0.75
.Pages.Remove 1
With .Font
.Name = "MS ゴシック"
.Size = 10
sz = Int(.Size / 0.75) * 0.75
End With
Set p = .Pages(0)
p.Caption = String(Int((Int(.Width / 0.75) * 0.75 - 12.75) / sz), " ")
wk = p.Caption
Mid(wk, 1, 9) = "マルチページ使用例"
p.Caption = wk
p.ScrollBars = 2
p.ScrollHeight = 1000
For idx = 1 To 20
Set c_txt(idx) = New Class1
With c_txt(idx)
.id = idx
Set .txt = p.Controls.Add("Forms.TextBox.1")
With .txt
.Top = (idx - 1) * 50 + 20
.Left = 30
End With
End With
Next
End With
End Sub
'=============================================================
Property Get f_txt(id As Long) As MSForms.TextBox
Set f_txt = c_txt(id).txt
End Property
'================================================================
Private Sub UserForm_Terminate()
Erase c_txt() 'フォームでの作業終了時に配列を初期化するコードも追加
End Sub
標準モジュールで
'=========================================================
Sub main()
UserForm2.Show vbModeless
End Sub
このMain実行後、
別の標準モジュールに
'============================================================
Sub test()
UserForm2.f_txt(20).SetFocus
End Sub
を実行してみてください。
この例のように目的のコントロールがテキストボックスなら、
Setfocusメソッドの使用で実現できます。
では、この例とは違い、Setfocusメソッドが使用できないコントロールの場合は??
同じく標準モジュールに
'===================================================
Sub test2()
Dim pg As MSForms.Page
With UserForm2
Set pg = .Controls("mltp").Pages(0)
pg.ScrollTop = .f_txt(20).Top '
End With
End Sub
なんてすると目的の動作になると思います。
試してみてください。
|
|