Page 102 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼classモジュールでUserform上のコマンドボタンをenableにするには? haru 02/9/14(土) 11:38 ┗Re:classモジュールでUserform上のコマンドボタンをenableにするには? ichinose 02/9/14(土) 12:19 ┗Re:classモジュールでUserform上のコマンドボタンをenableにするには? haru 02/9/14(土) 13:13 ┗Re:classモジュールでUserform上のコマンドボタンをenableにするには? ichinose 02/9/14(土) 13:22 ┗Re:classモジュールでUserform上のコマンドボタンをenableにするには? haru 02/9/14(土) 15:51 ┗あれ? ichinose 02/9/14(土) 16:49 ┗あ〜 ichinose 02/9/14(土) 17:13 ┗btn2_Click haru 02/9/19(木) 13:45 ┗Re:btn2_Click ichinose 02/9/20(金) 1:03 ─────────────────────────────────────── ■題名 : classモジュールでUserform上のコマンドボタンをenableにするには? ■名前 : haru ■日付 : 02/9/14(土) 11:38 -------------------------------------------------------------------------
追加されたコマンドボタンクリックしたとき、classモジュールに マクロを記述するということをichinoseさんに教えていただいたの ですが、この時Userform上のコマンドボタンをenableにするには、 どうすれば良いですか? これまでの経緯は http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=one;no=9496;id=Excel です。 よろしくお願いします。 |
▼haru さん: こんにちは。 どの時点でEnableを使用するかは、わかりませんが、ボタン作成時点なら、 '=================================================== >Dim new_btn() As New Class1 '=================================================== >Private Sub CommandButton1_Click() >ReDim new_btn(Workbooks.Count) > For i = 1 To Workbooks.Count > Set new_btn(i).btn = Controls.Add("Forms.CommandButton.1") ', >CommandButton2, Visible) > With new_btn(i) > .btn.Caption = Workbooks(i).Name > .btn.Left = 18 > .btn.Top = i * 30 > .btn.Width = 175 > .btn.Height = 20 > .id = i .btn.Enabled = False '又は、true > End With > Next >End Sub でOKかと思います。 |
▼ichinose さん: こんにちは。 >どの時点でEnableを使用するかは、わかりませんが、ボタン作成時点なら、 >>追加されたコマンドボタンクリックしたとき、 です。 '======================================================= '以下、クラスモジュールのコードです(クラス名は、Class1です) '======================================================= Public WithEvents btn As MSForms.CommandButton Private btnid As Long 'ボタンID用 '============================================== Private Sub btn_Click() MsgBox "押されたのは、" & btnid & "のボタンだよ" 'ご質問のコードは、ここに書きます。 'ボタンによってコードを変えたいなら、btnidの値で変えます End Sub '================================================ 上記、Private Sub btn_Click() で、 >> この時Userform上のコマンドボタンをenableにするには、 >>どうすれば良いですか? よろしくお願いします。 |
▼haru さん: こんにちは。 >'======================================================= >'以下、クラスモジュールのコードです(クラス名は、Class1です) >'======================================================= >Public WithEvents btn As MSForms.CommandButton >Private btnid As Long 'ボタンID用 >'============================================== >Private Sub btn_Click() >MsgBox "押されたのは、" & btnid & "のボタンだよ" If btnid > 1 Then btn.Enabled = False End If '例えば、こんな感じでしょうか? >End Sub >'================================================ |
Public WithEvents btn As MSForms.CommandButton, WithEvents btn2 As MSForms.CommandButton, _ WithEvents btn3 As MSForms.CommandButton, WithEvents btn4 As MSForms.CommandButton というふうに4個ボタンが並んでいて、btn4がクリックされたら、 btn1、btn2、btn3もEnabledにしたいのですが、実際これを実行する と、「オブジェクトが必要です。」と、表示されます。 Private Sub btn4_Click() '選択されたブックを閉じる Workbooks(wb_nm(btnid)).Close btn1.Enabled = False btn2.Enabled = False btn3.Enabled = False btn4.Enabled = False End Sub どうすれば良いですか? btn4.Enabled = False だけなら、良いんですが、 よろしくお願いします。 |
▼haru さん こんにちは。 >Public WithEvents btn As MSForms.CommandButton, WithEvents btn2 As MSForms.CommandButton, _ > WithEvents btn3 As MSForms.CommandButton, WithEvents btn4 As MSForms.CommandButton > > というふうに4個ボタンが並んでいて、btn4がクリックされたら、 >btn1、btn2、btn3もEnabledにしたいのですが、実際これを実行する >と、「オブジェクトが必要です。」と、表示されます。 > >Private Sub btn4_Click() >'選択されたブックを閉じる > Workbooks(wb_nm(btnid)).Close > btn1.Enabled = False > btn2.Enabled = False > btn3.Enabled = False > btn4.Enabled = False >End Sub > > どうすれば良いですか? > > btn4.Enabled = False > だけなら、良いんですが、 > よろしくお願いします。 前回のコードのからの話ではないのですか? クラスモジュールにイベント付のボタンが複数宣言されていますが、 これらにフォームで作成したボタンと関連付けされていれば上のコードはOKですよ。 でも、それでは実際のフォームに上のコードを乗せた方が・・ということになってしまいますよね(外してたら、すみません)。 そこで、前回までのコードの続きだと思って・・・・。 フォームモジュールに・・・ '=================================================== Dim new_btn() As New Class1 '==================================================================== Private Sub CommandButton1_Click() ReDim new_btn(Workbooks.Count) For i = 1 To Workbooks.Count Set new_btn(i).btn = Controls.Add("Forms.CommandButton.1") ', CommandButton2, Visible) With new_btn(i) .btn.Caption = Workbooks(i).Name .btn.Left = 18 .btn.Top = i * 30 .btn.Width = 175 .btn.Height = 20 .id = i End With Next End Sub '========================================================== Sub btn_enable_false() For i = 1 To UBound(new_btn()) new_btn(i).btn.Enabled = False Next End Sub クラスモジュールでは、 '============================================== Public WithEvents btn As MSForms.CommandButton '============================================== Private btnid As Long 'ボタンID用 '============================================== Private Sub btn_Click() MsgBox "押されたのは、" & btnid & "のボタンだよ" If btnid > 1 Then Workbooks(btn.Caption).Close UserForm1.btn_enable_false End If End Sub '================================================ Property Get id() As Long id = btnid End Property '================================================ Property Let id(idx As Long) btnid = idx End Property こういうことですか? |
▼haru さん > >>Public WithEvents btn As MSForms.CommandButton, WithEvents btn2 As MSForms.CommandButton, _ >> WithEvents btn3 As MSForms.CommandButton, WithEvents btn4 As MSForms.CommandButton >> >> というふうに4個ボタンが並んでいて、btn4がクリックされたら、 >>btn1、btn2、btn3もEnabledにしたいのですが、実際これを実行する >>と、「オブジェクトが必要です。」と、表示されます。 >> >>Private Sub btn4_Click() >>'選択されたブックを閉じる >> Workbooks(wb_nm(btnid)).Close >> btn1.Enabled = False >> btn2.Enabled = False >> btn3.Enabled = False >> btn4.Enabled = False >>End Sub >> >> どうすれば良いですか? >> >> btn4.Enabled = False >> だけなら、良いんですが、 >> よろしくお願いします。 > >前回のコードのからの話ではないのですか? >クラスモジュールにイベント付のボタンが複数宣言されていますが、 >これらにフォームで作成したボタンと関連付けされていれば上のコードはOKですよ。 >でも、それでは実際のフォームに上のコードを乗せた方が・・ということになってしまいますよね(外してたら、すみません)。 ↑これ、勘違いみたいですね、 ひとつのブックに対しての処理の数だけボタンを増やしたと言う事でしょうかね? でも、そうだとしたら、最初のボタン作成時に関連付けされているかどうかだと思いますが、・・・。 2つボタンの例ですが、 Dim new_btn() As New Class1 '=================================================== Private Sub CommandButton1_Click() ReDim new_btn(Workbooks.Count) For i = 1 To Workbooks.Count Set new_btn(i).btn = Controls.Add("Forms.CommandButton.1") ', CommandButton2, Visible) With new_btn(i) .fnm = Workbooks(i).Name .btn.Caption = Workbooks(i).Name & "処理1" .btn.Left = 18 .btn.Top = i * 30 .btn.Width = 175 .btn.Height = 20 .id = i End With Set new_btn(i).btn2 = Controls.Add("Forms.CommandButton.1") With new_btn(i).btn2 .Caption = Workbooks(i).Name & "処理2" .Left = 200 .Top = i * 30 .Width = 175 .Height = 20 End With Next End Sub '================================================================= Public WithEvents btn As MSForms.CommandButton Public WithEvents btn2 As MSForms.CommandButton Private btnid As Long 'ボタンID用 Private wknm As String '============================================== Private Sub btn_Click() MsgBox "押されたのは、" & btnid & "のボタンだよ" If btnid > 1 Then Workbooks(wknm).Close btn2.Enabled = False btn.Enabled = False End If End Sub '================================================ Property Get id() As Long id = btnid End Property '================================================ Property Let id(idx As Long) btnid = idx End Property '=============================================== Property Get fnm() As String fnm = wknm End Property Property Let fnm(nm As String) wknm = nm End Property で、動いていますが・・・。 |
▼ichinose さん: こんにちは。返事が遅れてすみません。 他の問題で引っ掛かっています。(まだ未決です。) >ひとつのブックに対しての処理の数だけボタンを増やしたと言う事でしょうかね? そうです。 >でも、そうだとしたら、最初のボタン作成時に関連付けされているかどうかだと思いますが、・・・。 >2つボタンの例ですが、 >Dim new_btn() As New Class1 ここで Dim new_btn() As New Class1, new_btn2() As New Class1 として、new_btn2がクリックされたとき、 Private Sub btn2_Click() MsgBox "押されたのは、" & btnid & "のボタンだよ" btn2.Enabled = False btn.Enabled = False End Sub が、うまくいけば良いんですが。 よろしくお願いします。 |
▼haru さん: こんばんは。 >>Dim new_btn() As New Class1 > ここで > Dim new_btn() As New Class1, new_btn2() As New Class1 > として、new_btn2がクリックされたとき、 > >Private Sub btn2_Click() > MsgBox "押されたのは、" & btnid & "のボタンだよ" > btn2.Enabled = False > btn.Enabled = False >End Sub [#515]のコードと少しづつ違ってきているので全体が見えなくなってきています。 私なりに解釈しましたが、以下のコードが意図されてる事と違っていたら、すみませんが、 全体のコードをアップしてみて下さい。 最初にユーザーフォームモジュールです。 '================================================================= Dim new_btn() As New Class1 Dim new_btn2() As New Class1 '=================================================== Private Sub CommandButton1_Click() ReDim new_btn(Workbooks.Count) ReDim new_btn2(Workbooks.Count) For i = 1 To Workbooks.Count Set new_btn(i).btn = Controls.Add("Forms.CommandButton.1") ', CommandButton2, Visible) With new_btn(i) .fnm = Workbooks(i).Name .btn.Caption = Workbooks(i).Name & "処理1" .btn.Left = 18 .btn.Top = i * 30 .btn.Width = 175 .btn.Height = 20 .id = i End With Set new_btn2(i).btn = Controls.Add("Forms.CommandButton.1") With new_btn2(i) .fnm = Workbooks(i).Name .btn.Caption = Workbooks(i).Name & "処理2" .btn.Left = 200 .btn.Top = i * 30 .btn.Width = 175 .btn.Height = 20 .id = i End With Next End Sub '====================================================== Sub unenable_cmd(i As Long) new_btn(i).btn.Enabled = False new_btn2(i).btn.Enabled = False End Sub '====================================================== '以下クラスモジュールです '====================================================== Public WithEvents btn As MSForms.CommandButton Private btnid As Long 'ボタンID用 Private wknm As String '============================================== Private Sub btn_Click() MsgBox "押されたのは、" & btnid & "のボタンだよ" If btnid > 1 Then Workbooks(wknm).Close Call UserForm1.unenable_cmd(btnid) End If End Sub '================================================ Property Get id() As Long id = btnid End Property '================================================ Property Let id(idx As Long) btnid = idx End Property '================================================ Property Get fnm() As String fnm = wknm End Property '================================================ Property Let fnm(nm As String) wknm = nm End Property |