Excel VBA質問箱 IV

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

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


11054 / 13644 ツリー ←次へ | 前へ→

【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 お礼[未読]

【18241】ラベルのクリックを取得するには
質問  ponpon  - 04/9/19(日) 3:37 -

引用なし
パスワード
   こんにちは
3連休なのでちょっと勉強しています。
ユーザーフォーム上にLabelが20ほどとTextBoxが60ほど貼り付けてあります。
 今までは、コントロール配列がほとんど理解できていなかったので、
テキストボックスのクリアもtextbox1=""、textbox2=""、・・・・
ラベル1がクリックされたら、・・・・・と一つ一つクリックイベントでやってましたが、コントロール配列に挑戦しようとしていますが、うまくいきません。
 どなたか教えていただけないでしょうか?

ラベルが、クリックされたら、そのcaptionをコピーしして、テキストボックスを
クリックしてそこに貼り付けたいのです。
 わからないまま、コードを書いてみました。よろしくお願いします。
 また、コードはどこに書いたらよいのでしょうか?sub UserForm_Initialize()で
 よいのですか?
 
Private Sub Labelコピー()
 Dim i As Integer
 Dim myLbl As MSForms.Label

 Set myLbl = Form時間割.Controls("Labe" & i)
 For each myLbl in Form時間割.Controls
 
  If myLblがクリックされたら Then
 
  Worksheets("祝日設定").Range("A300") = myLbl.Caption
  Worksheets("祝日設定").Range("A300").Copy
  myLbl.ForeColor = &HFF&    ↑
                   ↑
  End If            ラベルのCaptionがコピーできないので
 Next
End Sub

Private Sub Labelの貼り付け()
  dim j as Integer
  Dim mytxt As MSForms.TextBox
  Dim mytxt2 As MSForms.TextBox

   Set mytxt = Form時間割.Controls("TextBox" & "A" & j)
   Set mytxt2 = Form時間割.Controls("TextBox" & "B" & j)

   For Each mytxt in Form時間割.Controls  
   If mytxtがクリックされたら then
    mytxt.Value = ""
    mytxt.past
   End If 
   Next

   For Each mytxt2 in Form時間割.Controls  
   If mytxt2がクリックされたら then  
    mytxt2.Value = ""    
    mytxt2.past
   End If

   Next
End sub

【18242】Re:ラベルのクリックを取得するには
発言  かみちゃん  - 04/9/19(日) 8:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ラベルが、クリックされたら、そのcaptionをコピーしして、テキストボックスを
>クリックしてそこに貼り付けたいのです。

ラベルとテキストボックスは対応しているのでしょうか?
ラベルをクリックするというのがよくわからないのですが、テキストボックスをクリックしたら、それに対応するラベルのキャプションを反映させるのではいけないのでしょうか?

Private Sub TextBox1_Enter()
 TextBox1.Value = Label1.Caption
End Sub

【18243】Re:ラベルのクリックを取得するには
質問  ponpon  - 04/9/19(日) 10:03 -

引用なし
パスワード
   ▼かみちゃん さん:
おはようございます。

>ラベルとテキストボックスは対応しているのでしょうか?
>ラベルをクリックするというのがよくわからないのですが、テキストボックスをクリックしたら、それに対応するラベルのキャプションを反映させるのではいけないのでしょうか?

 対応しておりません。

説明が悪くて申し訳ありません。 
年間の時間割を作っています。現在の仕様は、ラベルは、国、算、社、理・・・・・となっており、クリックすると、captionがコピーされ、テキストボックスは縦に6こ(1時間目から6時間目)横に5こ(月から金まで)の任意の位置に貼り付けられるようになっています。それをセルに反映し、一年間分の時間割が作成されるようになっています。
 したがって、同じようなコードをラベルについて14こ、テキストボックスについて60個書いています。(2週間分の時間割を作るので)
 これを配列を使って簡単にできないものかと考えています。
 よろしくお願いします。


>
>Private Sub TextBox1_Enter()
> TextBox1.Value = Label1.Caption
>End Sub

【18244】Re:ラベルのクリックを取得するには
回答  かみちゃん  - 04/9/19(日) 10:28 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>年間の時間割を作っています。現在の仕様は、ラベルは、国、算、社、理・・・・・となっており、クリックすると、captionがコピーされ、テキストボックスは縦に6こ(1時間目から6時間目)横に5こ(月から金まで)の任意の位置に貼り付けられるようになっています。それをセルに反映し、一年間分の時間割が作成されるようになっています。

とりあえず、こんな感じでできるのかな?と思いますが・・・

Option Explicit

Dim strCaption As String

Private Sub Label1_Click()
 strCaption = ""
 strCaption = Label1.Caption
End Sub

Private Sub Label2_Click()
 strCaption = ""
 strCaption = Label2.Caption
End Sub

Private Sub TextBox1_Enter()
 TextBox1.Value = strCaption
 strCaption = ""
End Sub

Private Sub TextBox2_Enter()
 TextBox2.Value = strCaption
 strCaption = ""
End Sub

【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

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

【18246】Re:ラベルのクリックを取得するには
お礼  ponpon  - 04/9/19(日) 11:03 -

引用なし
パスワード
   ▼かみちゃん さん、ichinose さん、
 おはようございます。早速の回答ありがとうございます。
 ichinoseさんいつもすみません。
 
 クラスモジュールを使ったコントロール配列については、持っている本に少し書かれていたのですが、読んでいても難解だったもので、挑戦していませんでした。

>クラスや配列については、ここの常連さんの角田さん「目安箱」で
>説明されていますから、参考にして下さい。
>私もまだ、途中までしか読んでないけど、分かりやすいですよ!!
>それに上記のコードの仕様をもっと簡単に実現できるかも・・・。
>
 私もここを読んで挑戦してみようと考え始めたのですが・・・(それでも半分以上は読でなんとなくわかったような気がしていたのですが・・・(*'-'*))

 例題コードを自分なりに分析してやってみます。
 かみちゃん さん、ichinose さん、ありがとうございました。
 時間がかかるかもしれませんが、できたら(できなかったらまた質問します)連絡したいと思います。


>ちょっとコントロールの数が多いので、少ない数のコントロールで例題コードを
>記述します。
>ユーザーフォーム(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
>
>↑から入って追ってみてください。

【18248】Re:ラベルのクリックを取得するには
質問  ponpon  - 04/9/19(日) 14:36 -

引用なし
パスワード
   ▼ichinose さんへ
こんにちは!
 朝からずっとやっています。
 新しいブックで試したらうまくいきました。
しかし、今までのブックに貼り付けて実行するとうまくいきません。
 
 Private Sub UserForm_Initialize()

  Dim idx As Long
  Set cls = New Class1
  With cls
   .init_lbl 15 'ラベルの数
   For idx = 34 To 48   '←ラベルの数だけループ
    .set_lbl idx, Controls("Label" & idx)
    Next
   .init_txt 60 'テキストボックスの数
   For idx = 1 To 60 'テキストボックスの数だけループ
    .set_txt idx, Controls("TextBox" & idx)
    Next
   End With
  Set cpy_lbl = Nothing

この部分を挿入して実行すると 「インデックスが有効範囲にありません」とでます。
このエラーはよくお目にかかります。たぶんオブジェクトの名前が間違っているのだろうと思っていろいろと考えたのですが解決できません。
 ちなみにユーザーフォームの名前は「form時間割」です。
 どんなことが考えられるか 助けてください。
 今から出かけますので後は夜になると思います。
 

【18253】Re:ラベルのクリックを取得するには
発言  ichinose  - 04/9/19(日) 19:16 -

引用なし
パスワード
   ▼ponpon さん:
こんばんは。
> 朝からずっとやっています。
> 新しいブックで試したらうまくいきました。
>しかし、今までのブックに貼り付けて実行するとうまくいきません。
> 
> Private Sub UserForm_Initialize()
>
>  Dim idx As Long
>  Set cls = New Class1
>  With cls
>   .init_lbl 15 'ラベルの数
   For idx = 1 To 15   '←ラベルの数だけループ
    .set_lbl idx, Controls("Label" & idx+33)
>    Next
>   .init_txt 60 'テキストボックスの数
>   For idx = 1 To 60 'テキストボックスの数だけループ
>    .set_txt idx, Controls("TextBox" & idx)
>    Next
>   End With
>  Set cpy_lbl = Nothing
>
>この部分を挿入して実行すると 「インデックスが有効範囲にありません」とでます。
>このエラーはよくお目にかかります。たぶんオブジェクトの名前が間違っているのだろうと思っていろいろと考えたのですが解決できません。
> ちなみにユーザーフォームの名前は「form時間割」です。
> どんなことが考えられるか 助けてください。
> 今から出かけますので後は夜になると思います。
> 
上記のように変更してみて下さい。
.set_lblとset_txtの引数は、整理番号とオブジェクトと考えて下さい。
よって、idxは必ず、1から始まります。

【18254】Re:ラベルのクリックを取得するには 追伸
発言  ichinose  - 04/9/19(日) 19:24 -

引用なし
パスワード
   追伸です。

'=============================================
Private Sub cls_txtclick(ByVal txt As MSForms.TextBox)
  If Not cpy_lbl Is Nothing Then
   txt.Text = cpy_lbl.Caption
   End If
End Sub

上記のコードのようにしておかないとフォームの表示直後、一つもラベルをクリックして
いないとエラーになってしまいますね!!

訂正して下さい。もっとも上記の部分は違う仕様にしているのなら、
この限りではありませんが・・・。

【18258】Re:ラベルのクリックを取得するには 追伸
お礼  ponpon  - 04/9/20(月) 0:08 -

引用なし
パスワード
   ▼ichinose さん:
大変ありがとうございました。
きちんと動作するようになりました。
コントロール配列はまだよく理解できていません。
クラスモジュールのとらえ方も今一です。

クラスモジュールにWithEventsキーワードを使って宣言すると、mylbl(idx)がイベントに対応するようになると、本に書いていたものですから、やってみたのですが、見事に動きませんでした。
 コントロール配列は冬休みの宿題にします。

【18285】Re:ラベルのクリックを取得するには 追伸
発言  ichinose  - 04/9/20(月) 12:47 -

引用なし
パスワード
   ▼ponpon さん:
こんにちは。

>きちんと動作するようになりました。
>コントロール配列はまだよく理解できていません。
>クラスモジュールのとらえ方も今一です。
そうですか・・・。
クラスモジュールについては、概念があやふやだと中々活用しにくいですよね!!
それとそもそもオブジェクトって、何なのか?とかも。

で、ちょっと探して見たところ

http://www.moug.net/skillup/opm/opm08-01.htm

モーグさんにわかりやすそうな説明がありました。
角田さんのサイトと合わせてご覧になってみて下さい。

【18415】Re:ラベルのクリックを取得するには 追伸
発言  Kobasan  - 04/9/22(水) 22:04 -

引用なし
パスワード
   ponponさん、こんばんは。

角田さんのホームページ「擬似の脱却」
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
で勉強し、
Ichinoseさんのコード【18245】を参考にして、勉強用に自分なりに分かりやすくつくりました。
また、この質問箱でTextBoxの扱いもIchinoseさんに質問して教えてもらいました。
少しクラスモジュールが使えるようになった程度ですから、不十分かもしれません。
分かりやすければ参考にして下さい。
必要に応じて、標準モジュールとUserform1のモジュールのLabelの数、TextBoxの数
を変えて下さい。

'■■標準モジュール
Public copydata As Variant '<==標準モジュールに記述すると機能する

Sub test()
  UserForm1.Show
End Sub

Sub ResetColor()
Dim i As Long
  For i = 1 To 30 '<==Labelの数30
    UserForm1.Controls("Label" & i).ForeColor = &H0  '色復元
  Next i
End Sub

'■■Userform1のモジュール
Private FrmLabel(1 To 30) As New Class1   '<==Labelの数30
Private FrmTextBox(1 To 42) As New Class2  '<==TextBoxの数42

Private Sub UserForm_Initialize()
Dim i As Long
  For i = 1 To 30   '<==Labelの数30
    With FrmLabel(i)
      .Item = Me.Controls("Label" & i)
    End With
  Next i
  '
  For i = 1 To 42   '<==TextBoxの数42
    With FrmTextBox(i)
      .Item2 = Me.Controls("TextBox" & i)
    End With
  Next i
End Sub

Private Sub UserFom_Terminate()
  Erase FrmLabel
  Erase FrmTextBox
End Sub

'■■Class1 のモジュール
Private WithEvents MyCtrl As MSForms.Label

Public Property Let Item(NewCtrl As MSForms.Label)
  Set MyCtrl = NewCtrl
End Property

Private Sub MyCtrl_Click()
  ResetColor
  MyCtrl.ForeColor = &HFF   '赤色
  copydata = MyCtrl.Caption
End Sub

'■■Class2 のモジュール
Private WithEvents MyCtrl2 As MSForms.TextBox

Public Property Let Item2(NewCtrl As MSForms.TextBox)
  Set MyCtrl2 = NewCtrl
End Property

Private Sub MyCtrl2_MouseDown(ByVal Button As Integer, _
    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  MyCtrl2.Text = copydata
End Sub

【18422】Re:ラベルのクリックを取得するには 追伸
質問  ponpon  - 04/9/23(木) 12:00 -

引用なし
パスワード
   ▼Kobasan さん:

 こんにちは
 わたしも、角田さんのホームページ「擬似の脱却」を読み返し、印刷して勉強したのですが、疑似コントロール配列までは、何とか理解できました(意味がわかる程度)、自分で作るまでには、至っていません。冬休みまでには、作れるようになりたいと、本やHPで勉強しているところです。
 コードを読んでみると、私程度でも理解できそうな気がしたので早速やってみました。ichinoseさんのコードは、私には6割程度しか理解できませんでした。変数なのか関数なのかステイトメントなのかキーワードなのかを分けてコメントをつけているのですが、難しいです。早くこの域に到達したいものです。

 本題ですが、新規ブックでも試してみたのですが、ラベルをクリックしてcaptionを取得して色を変えるところまでは、走るのですが、テキストボックスをクリック(マウスダウン)して、貼り付けるところができません。
 ちなみにWin2000 Excel2002です。
 
>'■■標準モジュール
>Public copydata As Variant '<==標準モジュールに記述すると機能する
>
>Sub test()
>  UserForm1.Show
>End Sub
>
>Sub ResetColor()
>Dim i As Long
>  For i = 1 To 30 '<==Labelの数30
>    UserForm1.Controls("Label" & i).ForeColor = &H0  '色復元
>  Next i
>End Sub
>
>'■■Userform1のモジュール
>Private FrmLabel(1 To 30) As New Class1   '<==Labelの数30
>Private FrmTextBox(1 To 42) As New Class2  '<==TextBoxの数42
>
>Private Sub UserForm_Initialize()
>Dim i As Long
>  For i = 1 To 30   '<==Labelの数30
>    With FrmLabel(i)
>      .Item = Me.Controls("Label" & i)
>    End With
>  Next i
>  '
>  For i = 1 To 42   '<==TextBoxの数42
>    With FrmTextBox(i)
>      .Item2 = Me.Controls("TextBox" & i)
>    End With
>  Next i
>End Sub
>
>Private Sub UserFom_Terminate()
>  Erase FrmLabel
>  Erase FrmTextBox
>End Sub
>
>'■■Class1 のモジュール
>Private WithEvents MyCtrl As MSForms.Label
>
>Public Property Let Item(NewCtrl As MSForms.Label)
>  Set MyCtrl = NewCtrl
>End Property
>
>Private Sub MyCtrl_Click()
>  ResetColor
>  MyCtrl.ForeColor = &HFF   '赤色
>  copydata = MyCtrl.Caption   ←ここまでは確認
>End Sub
>
>'■■Class2 のモジュール
>Private WithEvents MyCtrl2 As MSForms.TextBox
>
>Public Property Let Item2(NewCtrl As MSForms.TextBox)
>  Set MyCtrl2 = NewCtrl
>End Property
>
>Private Sub MyCtrl2_MouseDown(ByVal Button As Integer, _
>    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
>  MyCtrl2.Text = copydata  ←ここが動かない
>End Sub

【18423】Re:ラベルのクリックを取得するには 追伸
お礼  ponpon  - 04/9/23(木) 12:12 -

引用なし
パスワード
   ▼Kobasan さん:
>'■■標準モジュール
>Public copydata As Variant '<==標準モジュールに記述すると機能する
 ↑
これが抜けていました。
copydataが宣言されていないなと探していたら見つかりました。
申し訳ありませんでした。今後もまたよろしくお願いします。

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