|
▼ponpon さん、かみちゃん さん、おはようございます。
>>ラベルとテキストボックスは対応しているのでしょうか?
>>ラベルをクリックするというのがよくわからないのですが、テキストボックスをクリックしたら、それに対応するラベルのキャプションを反映させるのではいけないのでしょうか?
>
> 対応しておりません。
>
>説明が悪くて申し訳ありません。
>年間の時間割を作っています。現在の仕様は、ラベルは、国、算、社、理・・・・・となっており、クリックすると、captionがコピーされ、テキストボックスは縦に6こ(1時間目から6時間目)横に5こ(月から金まで)の任意の位置に貼り付けられるようになっています。それをセルに反映し、一年間分の時間割が作成されるようになっています。
> したがって、同じようなコードをラベルについて14こ、テキストボックスについて60個書いています。(2週間分の時間割を作るので)
> これを配列を使って簡単にできないものかと考えています。
> よろしくお願いします。
ちょっとコントロールの数が多いので、少ない数のコントロールで例題コードを
記述します。
ユーザーフォーム(Userform1)には、
ラベルコントロールが3つ(Label1〜Label3)
テキストボックスが3つ(Textbox1〜Textbox3)
を貼り付けてください(オブジェクト名が、結構重要)
コードの仕様は、
・フォームのラベルをクリックすると、
クリックされたラベルの文字(Caption)が赤くなります。
・この状態でいずれかのテキストボックスをクリックすると
赤色のラベル文字の内容が当該テキストボックスに表示されます。
では、コードです。
クラスモジュールを3つ用意して下さい(「挿入」---「クラスモジュール」)。
クラス名は、Class1、Class2、Class3、つまり、作成されたままの名前を
使います。
まずは、それぞれのクラスモジュールのコード
'Class1
'============================================================
Private evlbl() As Class2
Private l_id As Long
Private lbcnt As Long
Private evtxt() As Class3
Private t_id As Long
Private txtcnt As Long
Public Event lblclick(ByVal lbl As MSForms.Label)
Public Event txtclick(ByVal txt As MSForms.TextBox)
'============================================================
Sub init_lbl(lbl_count)
ReDim evlbl(1 To lbl_count)
For idx = 1 To lbl_count
Set evlbl(idx) = New Class2
Next
lbcnt = lbl_count
End Sub
'==============================================================
Sub set_lbl(id As Long, lbl As MSForms.Label)
With evlbl(id)
Set .lbl = lbl
.lbl_id = id
Set .parentobj = Me
.callbackproc = "evlbl_Click"
End With
End Sub
'==============================================================
Public Sub evlbl_Click(id As Long)
RaiseEvent lblclick(evlbl(id).lbl)
End Sub
'===============================================================
Sub init_txt(txt_count)
ReDim evtxt(1 To txt_count)
For idx = 1 To txt_count
Set evtxt(idx) = New Class3
Next
txtcnt = txt_count
End Sub
'================================================================
Sub set_txt(id As Long, txt As MSForms.TextBox)
With evtxt(id)
Set .txt = txt
.txt_id = id
Set .parentobj = Me
.callbackproc = "evtxt_Click"
End With
End Sub
'===============================================================
Public Sub evtxt_Click(id As Long)
RaiseEvent txtclick(evtxt(id).txt)
End Sub
'Class2
'==================================================================
Public WithEvents lbl As MSForms.Label
Public lbl_id As Long
Public parentobj As Object
Public callbackproc As String
Private Sub lbl_Click()
wk = CallByName(parentobj, callbackproc, VbMethod, lbl_id)
End Sub
'Class3
'=================================================================
Public WithEvents txt As MSForms.TextBox
Public txt_id As Long
Public parentobj As Object
Public callbackproc As String
Private Sub txt_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
wk = CallByName(parentobj, callbackproc, VbMethod, txt_id)
End Sub
'Userform1のモジュールに
'=================================================================
Private cpy_lbl As MSForms.Label
Private WithEvents cls As Class1
'=================================================================
Private Sub cls_lblclick(ByVal lbl As MSForms.Label)
If Not cpy_lbl Is Nothing Then
cpy_lbl.ForeColor = &H0
End If
lbl.ForeColor = &HFF
Set cpy_lbl = lbl
End Sub
'=================================================================
Private Sub cls_txtclick(ByVal txt As MSForms.TextBox)
txt.Text = cpy_lbl.Caption
End Sub
'=================================================================
Private Sub UserForm_Initialize()
Dim idx As Long
Set cls = New Class1
With cls
.init_lbl 3 'ラベルの数
For idx = 1 To 3 '←らヘルの数だけループ
.set_lbl idx, Controls("label" & idx)
Next
.init_txt 3 'テキストボックスの数
For idx = 1 To 3 'テキストボックスの数だけループ
.set_txt idx, Controls("textbox" & idx)
Next
End With
Set cpy_lbl = Nothing
End Sub
以上です。確認して下さい。
クラスや配列については、ここの常連さんの角田さん「目安箱」で
説明されていますから、参考にして下さい。
私もまだ、途中までしか読んでないけど、分かりやすいですよ!!
それに上記のコードの仕様をもっと簡単に実現できるかも・・・。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=51;id=FAQ
↑から入って追ってみてください。
|
|