Excel VBA質問箱 IV

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

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


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

【32347】ユーザフォームの動的なチェックボックス こぼらー 05/12/13(火) 9:40 質問[未読]
【32351】Re:ユーザフォームの動的なチェックボックス やっちん 05/12/13(火) 10:06 発言[未読]
【32352】Re:ユーザフォームの動的なチェックボックス Blue 05/12/13(火) 10:20 回答[未読]
【32353】Re:ユーザフォームの動的なチェックボックス こぼらー 05/12/13(火) 10:28 発言[未読]
【32354】Re:ユーザフォームの動的なチェックボックス Blue 05/12/13(火) 10:33 回答[未読]
【32358】Re:ユーザフォームの動的なチェックボックス こぼらー 05/12/13(火) 11:11 お礼[未読]
【32359】Re:ユーザフォームの動的なチェックボックス ichinose 05/12/13(火) 11:18 発言[未読]
【32361】Re:ユーザフォームの動的なチェックボックス Blue 05/12/13(火) 11:26 お礼[未読]
【32375】Re:ユーザフォームの動的なチェックボックス こぼらー 05/12/13(火) 16:24 質問[未読]
【32376】Re:ユーザフォームの動的なチェックボックス Blue 05/12/13(火) 16:34 回答[未読]

【32347】ユーザフォームの動的なチェックボックス
質問  こぼらー  - 05/12/13(火) 9:40 -

引用なし
パスワード
   VBA超初心者です。質問させていただきます。

ユーザフォームに動的なチェックボックスを作成するには、どのようにすればよいのでしょうか?他の問答でみつけることができませんでした。

例)
1.ユーザフォーム空の状態
2.エクセルにイベントが発生するとフォームを表示。
3.フォームロード時にあるシートのセルからリスト(値)を取得
4.ユーザフォームにチェックボックス付きで表示する。

そもそも可能なのでしょうか?
ご教授よろしくお願いいたします。

【32351】Re:ユーザフォームの動的なチェックボッ...
発言  やっちん  - 05/12/13(火) 10:06 -

引用なし
パスワード
   ▼こぼらー さん:
こんにちは。
最大数がわかるのであれば、
表示、非表示で対応ということもできますよ。

【32352】Re:ユーザフォームの動的なチェックボッ...
回答  Blue  - 05/12/13(火) 10:20 -

引用なし
パスワード
   動的に作成しようと思えばできます。(Controls.Add メソッドを利用する)
ただし、イベントまで設定することはできません。
(チェックしたときのイベントとかは割り当てれない。)

やっちんさんもおっしゃっていますが、
表示・非表示の切り替えがもっとも簡単だと思います。

【32353】Re:ユーザフォームの動的なチェックボッ...
発言  こぼらー  - 05/12/13(火) 10:28 -

引用なし
パスワード
   Blueさん やっちんさん
早速の返信ありがとうございます。
まず最大数がわかっていません。
また、表示/非表示で対応するとなると、フォームサイズ、フレームサイズの再設定
など面倒なことになりそうです。。。

Controls.Addメソッド早速しらべてみます。

▼Blue さん:
>動的に作成しようと思えばできます。(Controls.Add メソッドを利用する)
>ただし、イベントまで設定することはできません。
>(チェックしたときのイベントとかは割り当てれない。)
>
>やっちんさんもおっしゃっていますが、
>表示・非表示の切り替えがもっとも簡単だと思います。

【32354】Re:ユーザフォームの動的なチェックボッ...
回答  Blue  - 05/12/13(火) 10:33 -

引用なし
パスワード
   一例。

レイアウトは動的作成時に設定するしかないです。

' UserFormにボタンを適当に配置する。
Option Explicit

Private CheckBoxs() As MSForms.CheckBox

Private Sub UserForm_Initialize()
  Dim i  As Long
  Dim num As Long
  
  num = Worksheets("Sheet1").Range("A1").Value
  If num <= 0 Then Exit Sub
  
  ReDim CheckBoxs(1 To num)
  For i = 1 To num
    Set CheckBoxs(i) = Me.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)
    With CheckBoxs(i)
      .Caption = "CheckBox" & CStr(i)
      .Top = 5 + 20 * (i - 1)
      .Left = 10
      .Height = 15
      .AutoSize = True
    End With
  Next
End Sub

Private Sub CommandButton1_Click()
  Dim i As Long
  Dim s As String
  
  For i = LBound(CheckBoxs) To UBound(CheckBoxs)
    If CheckBoxs(i).Value Then
      s = s & CheckBoxs(i).Caption & vbCrLf
    End If
  Next
  
  If s = vbNullString Then
    MsgBox "チェックボックスにはチェックが入っていない"
  Else
    MsgBox s & "にチェックが入っている"
  End If
End Sub

【32358】Re:ユーザフォームの動的なチェックボッ...
お礼  こぼらー  - 05/12/13(火) 11:11 -

引用なし
パスワード
   Blueさん

サンプルは大変役に立ちました。
実際に組み込んで動かすとうまくいきました。
ほんと〜にありがごうございました。

【32359】Re:ユーザフォームの動的なチェックボッ...
発言  ichinose  - 05/12/13(火) 11:18 -

引用なし
パスワード
   皆さん、おはようございます。

>動的に作成しようと思えばできます。(Controls.Add メソッドを利用する)
>ただし、イベントまで設定することはできません。
クラスモジュールを使用するとそれらしいことは出来ます。

ユーザーフォームをひとつ用意してください(Userform1)。

クラスモジュール(Class1)に
'===========================================================
  Public WithEvents chkbx As MSForms.CheckBox
  Public chkid As Long
Private Sub chkbx_Change()
  MsgBox "チェックボックス" & chkid & "が " & IIf(chkbx.Value, "ON", "OFF") & " になりました"
End Sub


Userform1のモジュールに
'=============================================
Private cls_chkbx() As Class1
Private clsnum As Variant
'==============================================================
Private Sub UserForm_Initialize()
  clsnum = Application.InputBox("チェックボックスの数を入力", , , , , , , 1)
  If TypeName(clsnum) <> "Boolean" Then
    If clsnum > 0 Then
     ReDim cls_chkbx(1 To clsnum)
     For idx = 1 To clsnum
       Set cls_chkbx(idx) = New Class1
       With cls_chkbx(idx)
        .chkid = idx
        Set .chkbx = Controls.Add("Forms.CheckBox.1")
        With .chkbx
          .Top = idx * 50 + 10
          .Left = 15
          .Height = 16
          .Font.Name = "MS ゴシック"
          .Font.Size = 16
          .Caption = "チェックボックス" & StrConv(idx, vbWide)
          .AutoSize = True
          End With
        End With
       Next idx
     With Me
      .Width = 200
      .Height = (clsnum + 1) * 50 + 30
      End With
     End If
    End If
End Sub
'======================================================
Private Sub UserForm_Terminate()
  For idx = 1 To clsnum
    Set cls_chkbx(idx).chkbx = Nothing
    Set cls_chkbx(idx) = Nothing
    Next
End Sub


標準モジュールに

'====================================
sub main()
  userform1.show
end sub

としてmainを実行してみてください。

【32361】Re:ユーザフォームの動的なチェックボッ...
お礼  Blue  - 05/12/13(火) 11:26 -

引用なし
パスワード
   > クラスモジュールを使用するとそれらしいことは出来ます。
ほんとですね。WithEventsとか使ったことなかったので、全然分からなかったです。

もう、最終手段として、サブクラス化まで考えていましたし。(C出身ですから)
(しかも、VBAだとウィンドウレスコントロールの場合はCreateWindowで、、、とめんどくさいことまで)

勉強になりました。ありがとうございました。<(__*)>

【32375】Re:ユーザフォームの動的なチェックボッ...
質問  こぼらー  - 05/12/13(火) 16:24 -

引用なし
パスワード
   質問です。

このコードを引用して作成したのですが、
このチェックボックスのオン/オフはどのように判定するのでしょうか?
なぜかメンバが存在しないとおこられてしまいます。

よろしくお願いします。

▼Blue さん:
>一例。
>
>レイアウトは動的作成時に設定するしかないです。
>
>' UserFormにボタンを適当に配置する。
>Option Explicit
>
>Private CheckBoxs() As MSForms.CheckBox
>
>Private Sub UserForm_Initialize()
>  Dim i  As Long
>  Dim num As Long
>  
>  num = Worksheets("Sheet1").Range("A1").Value
>  If num <= 0 Then Exit Sub
>  
>  ReDim CheckBoxs(1 To num)
>  For i = 1 To num
>    Set CheckBoxs(i) = Me.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)
>    With CheckBoxs(i)
>      .Caption = "CheckBox" & CStr(i)
>      .Top = 5 + 20 * (i - 1)
>      .Left = 10
>      .Height = 15
>      .AutoSize = True
>    End With
>  Next
>End Sub
>
>Private Sub CommandButton1_Click()
>  Dim i As Long
>  Dim s As String
>  
>  For i = LBound(CheckBoxs) To UBound(CheckBoxs)
>    If CheckBoxs(i).Value Then
>      s = s & CheckBoxs(i).Caption & vbCrLf
>    End If
>  Next
>  
>  If s = vbNullString Then
>    MsgBox "チェックボックスにはチェックが入っていない"
>  Else
>    MsgBox s & "にチェックが入っている"
>  End If
>End Sub

【32376】Re:ユーザフォームの動的なチェックボッ...
回答  Blue  - 05/12/13(火) 16:34 -

引用なし
パスワード
   >このコードを引用して作成したのですが、
>このチェックボックスのオン/オフはどのように判定するのでしょうか?
>なぜかメンバが存在しないとおこられてしまいます。
それは、ボタンを押したときに、チェックボックスが0個のときでしょうか?
エラーメッセージをそのまま張ってください。

>    Set CheckBoxs(i) = Me.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)
で動的にCheckBoxを配列に割り当てていますので、
1つめのチェックボックスの値を確認するときは、
CheckBoxs(1).Valueの値を見ればいいです。

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