Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


63092 / 76738 ←次へ | 前へ→

【18245】Re:ラベルのクリックを取得するには
回答  ichinose  - 04/9/19(日) 10:40 -

引用なし
パスワード
   ▼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

↑から入って追ってみてください。
0 hits

【18241】ラベルのクリックを取得するには ponpon 04/9/19(日) 3:37 質問
【18242】Re:ラベルのクリックを取得するには かみちゃん 04/9/19(日) 8:17 発言
【18243】Re:ラベルのクリックを取得するには ponpon 04/9/19(日) 10:03 質問
【18244】Re:ラベルのクリックを取得するには かみちゃん 04/9/19(日) 10:28 回答
【18245】Re:ラベルのクリックを取得するには ichinose 04/9/19(日) 10:40 回答
【18246】Re:ラベルのクリックを取得するには ponpon 04/9/19(日) 11:03 お礼
【18248】Re:ラベルのクリックを取得するには ponpon 04/9/19(日) 14:36 質問
【18253】Re:ラベルのクリックを取得するには ichinose 04/9/19(日) 19:16 発言
【18254】Re:ラベルのクリックを取得するには 追伸 ichinose 04/9/19(日) 19:24 発言
【18258】Re:ラベルのクリックを取得するには 追伸 ponpon 04/9/20(月) 0:08 お礼
【18285】Re:ラベルのクリックを取得するには 追伸 ichinose 04/9/20(月) 12:47 発言
【18415】Re:ラベルのクリックを取得するには 追伸 Kobasan 04/9/22(水) 22:04 発言
【18422】Re:ラベルのクリックを取得するには 追伸 ponpon 04/9/23(木) 12:00 質問
【18423】Re:ラベルのクリックを取得するには 追伸 ponpon 04/9/23(木) 12:12 お礼

63092 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free