Excel VBA質問箱 IV

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

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


1117 / 13645 ツリー ←次へ | 前へ→

【76219】動的checkbox no 14/10/17(金) 11:15 質問[未読]
【76223】Re:動的checkbox とおりすがり 14/10/17(金) 16:20 回答[未読]
【76226】Re:動的checkbox ichinose 14/10/17(金) 18:21 発言[未読]
【76245】Re:動的checkbox [名前なし] 14/10/20(月) 16:31 お礼[未読]
【76251】Re:動的checkbox hello help 14/10/21(火) 12:00 質問[未読]
【76256】Re:動的checkbox とおりすがり 14/10/21(火) 22:39 回答[未読]
【76257】Re:動的checkbox hello help 14/10/22(水) 10:25 お礼[未読]

【76219】動的checkbox
質問  no  - 14/10/17(金) 11:15 -

引用なし
パスワード
   Option Explicit
Private cbox As MSForms.CheckBox

Private Sub UserForm_Initialize()

Set cbox = Controls.add("Forms.CheckBox.1", "MyCheckBox01")
   With cbox
    .Caption = "selection"
    .Height = 14: .Left = 2: .Top = bk * j + 2: .Width = 60
   End With

Set cbox = Nothing

End Sub


checkboxがchangeした時にmsgを出したいのですが。

Private Sub cbox_Change()
  MsgBox "ok"
End Sub

動きません。
どうしたらいいですか?

【76223】Re:動的checkbox
回答  とおりすがり  - 14/10/17(金) 16:20 -

引用なし
パスワード
   >Private cbox As MSForms.CheckBox
WithEventsを使用する。

>    .Height = 14: .Left = 2: .Top = bk * j + 2: .Width = 60
bk、jの変数が宣言されてない。使用されてない。

【76226】Re:動的checkbox
発言  ichinose  - 14/10/17(金) 18:21 -

引用なし
パスワード
   >>Private cbox As MSForms.CheckBox
>WithEventsを使用する。
>
>>    .Height = 14: .Left = 2: .Top = bk * j + 2: .Width = 60
>bk、jの変数が宣言されてない。使用されてない。
この変数を宣言することは、本当に大事ですよ!!


まさか、標準ジュールに Publicで宣言している変数です
なんてことは ないですよね?
↑そうだとしたら、これは、変数の使い方を修正した方がよいですよ!!


それから、
>Private Sub UserForm_Initialize()




Set cbox = Nothing
'↑これは、削除してください
End Sub


Private Sub UserForm_Terminate()
  Set cbox = Nothing
End Sub
これを追加ですね

【76245】Re:動的checkbox
お礼  [名前なし]  - 14/10/20(月) 16:31 -

引用なし
パスワード
   みなさまありがとうございます。

今のコードは部分をカットして説明したものなので、
変数宣言部分をコピーし忘れているだけです。

やはり動的に作った部品はwitheventsでないと動かないのですね。


以下は直します。

Private Sub UserForm_Terminate()
  Set cbox = Nothing
End Sub

【76251】Re:動的checkbox
質問  hello help  - 14/10/21(火) 12:00 -

引用なし
パスワード
   'userform
----------------------------------------------------------------------------------
Private ufbt() As class_chikan01
Private cbox As class_chikan01

Private Sub UserForm_Initialize()

Dim ctl As MSForms.CommandButton
Dim lmoji_3 As MSForms.Label
Dim cbox As MSForms.CheckBox
Dim i as long
Dim J1(41)

J1(0) = "temp0"
  ↑ 
  '実際のコードは41個分ずらずらと配列が続く
  ↓
J1(41)="temp41"

ReDim ufbt(41)

  For i = 0 To 41
    Set ctl = Controls.add("Forms.CommandButton.1", "button" & i)

   Set ufbt(i) = New class_chikan01
   With ufbt(i)
     .Item = Me.Controls("button" & i)
     .Index = i
     .caller = Me
   End With
    
  Next i

Set cbox = Controls.add("Forms.CheckBox.1", "MyCheckBox01")
   cbox.Caption = "selection"
   
   Set cbox = New class_chikan01
   With cbox
     .Item2 = Controls("MyCheckBox01")
     .caller = Me
   End With

 Set lmoji_3 = Controls.add("Forms.Label.1", "Label_3")
  lmoji_3.Caption = "copyright"
  

Set ctl = Nothing
Set lmoji_3 = Nothing

----------------------------------------------------------------------------------
Private Sub cx()
  MsgBox "ok"
End Sub

----------------------------------------------------------------------------------
Public Sub toch(ByVal Index As Integer)

Select Case Index
case 1
  call ABC
case 2
  call DE
end select


----------------------------------------------------------------------------------
Private Sub UserForm_Terminate()
  Erase ufbt
  Erase cbox
End Sub


'class_chikan01
--------------------'class_chikan01--------------------------------------------
Option Explicit
Private WithEvents mybt As MSForms.CommandButton
Private WithEvents mych As MSForms.CheckBox
Private MyIndex As Integer
Private MyCaller As Object

Public Property Let Item(NewCtrl As MSForms.CommandButton)
  Set mybt = NewCtrl
End Property
----------------------------------------------------------------------------------
Public Property Let Index(NewIndex As Integer)
  MyIndex = NewIndex
End Property
----------------------------------------------------------------------------------
Public Property Let caller(newcaller As Object)
  Set MyCaller = newcaller
End Property
----------------------------------------------------------------------------------
Private Sub mybt_click()
 Call MyCaller.toch(MyIndex)
End Sub
----------------------------------------------------------------------------------
'checkbox用
Public Property Let Item2(NewCtrl As MSForms.CheckBox)
  Set mych = NewCtrl
End Property
----------------------------------------------------------------------------------
Private Sub mych_change()
 Call MyCaller.cx
End Sub
----------------------------------------------------------------------------------

checkboxのみうまく動かない。
なぜ?

checkboxが変わった時にメッセージを出したいのでが。

【76256】Re:動的checkbox
回答  とおりすがり  - 14/10/21(火) 22:39 -

引用なし
パスワード
   まず一点目
モジュールレベルのcbox(class_chikan型)と
プロシージャレベルのcbox(msforms.checkbox型)が
ある為に、set cbox = new class_chikan01は型が合わない
どちらかの変数名を変更する

二点目

Private Sub mych_change()
 Call MyCaller.cx
End Sub

MyCallerとはこの場合UserFormだけど、呼び出すプロシージャは公開してな
ければ呼び出せないので

×Private sub cx()
○Public sub cx()
に変更する

あと小言
見やすくと思って------------------を入れたと思うけど
コピペしたら消すの面倒くさい。。
試す人の事を思い、貼り付ければすぐ動くコードでお願いね
最低限コンパイル済みのコードを貼り付けるようにね

【76257】Re:動的checkbox
お礼  hello help  - 14/10/22(水) 10:25 -

引用なし
パスワード
   なるほど。
数々の指摘ありがとうございます。

勉強になりました。

▼とおりすがり さん:
>まず一点目
>モジュールレベルのcbox(class_chikan型)と
>プロシージャレベルのcbox(msforms.checkbox型)が
>ある為に、set cbox = new class_chikan01は型が合わない
>どちらかの変数名を変更する
>
>二点目
>
>Private Sub mych_change()
> Call MyCaller.cx
>End Sub
>
>MyCallerとはこの場合UserFormだけど、呼び出すプロシージャは公開してな
>ければ呼び出せないので
>
>×Private sub cx()
>○Public sub cx()
>に変更する
>
>あと小言
>見やすくと思って------------------を入れたと思うけど
>コピペしたら消すの面倒くさい。。
>試す人の事を思い、貼り付ければすぐ動くコードでお願いね
>最低限コンパイル済みのコードを貼り付けるようにね

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