Excel VBA質問箱 IV

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

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


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

【17389】以前の記事から Kobasan 04/8/28(土) 8:39 質問[未読]
【17390】Re:以前の記事から ichinose 04/8/28(土) 9:03 発言[未読]
【17392】Re:以前の記事から Kobasan 04/8/28(土) 9:38 お礼[未読]
【17405】Re:以前の記事から Kobasan 04/8/28(土) 21:41 お礼[未読]
【17406】Re:以前の記事から Kobasan 04/8/28(土) 21:46 質問[未読]
【17407】Re:以前の記事から つん 04/8/28(土) 22:04 回答[未読]
【17410】Re:以前の記事から ichinose 04/8/28(土) 22:25 発言[未読]
【17409】Re:以前の記事から ichinose 04/8/28(土) 22:14 発言[未読]
【17414】Re:以前の記事から Kobasan 04/8/28(土) 23:41 お礼[未読]
【17393】Re:以前の記事から 角田 04/8/28(土) 9:55 発言[未読]
【17400】Re:以前の記事から Kobasan 04/8/28(土) 13:48 お礼[未読]

【17389】以前の記事から
質問  Kobasan  - 04/8/28(土) 8:39 -

引用なし
パスワード
    以前の記事に下記のものがあり、クラスモジュールを使って試したところ、「指定したオブジェクトは見つかりません」というエラーが出て、UserForm1が表示されません。
 クラスモジュールを使うのは初めてなと、本を見ても少しの説明しかのってないので、どこでミスしているのかよく分かりません。
 ユーザーフォームモジュールはUserForm1に貼り付け、CheckBoxは3つつくっています。クラスモジュールはClass1に貼り付けました。
どなたか対策を教えて下さい。
--------------------------
【10411】Re:イベントの処理をまとめて記述
複数個の
 Private Sub CheckBox1_Click()
 ・・・
 End Sub

 Private Sub CheckBox2_Click()
 ・・・
 End Sub
 ・・・
を1つにする方法?

【10412】Re:イベントの処理をまとめて記述 
クラスモジュールを使えばできそうですけど試してみますか?

★ユーザーフォームモジュール
Option Explicit
Dim ColCls As Collection
Private Sub UserForm_Initialize()
  Dim ClsT As Class1
  Dim i  As Long
  
  Set ColCls = New Collection
  For i = 1 To 3
    Set ClsT = New Class1
    Call ClsT.propertysSet(Me("CheckBox" & i), Me("TextBox" & i))
    ColCls.Add ClsT
    Set ClsT = Nothing
  Next i
End Sub

Private Sub UserForm_Terminate()
  Set ColCls = Nothing
End Sub

★クラスモジュール(Class1)
Option Explicit
Private WithEvents Chk As MSForms.CheckBox
Private Txt      As MSForms.TextBox

Sub propertysSet(ByVal ChkT As MSForms.CheckBox, ByVal TxtT As MSForms.TextBox)
  Set Chk = ChkT
  Set Txt = TxtT
End Sub

Private Sub Chk_Click()
  If Chk Then
    Txt.Value = 1
  Else
    Txt.Value = ""
  End If
End Sub

という感じです。
違ったらすいません。

【17390】Re:以前の記事から
発言  ichinose  - 04/8/28(土) 9:03 -

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

> 以前の記事に下記のものがあり、クラスモジュールを使って試したところ、「指定したオブジェクトは見つかりません」というエラーが出て、UserForm1が表示されません。
> クラスモジュールを使うのは初めてなと、本を見ても少しの説明しかのってないので、どこでミスしているのかよく分かりません。
> ユーザーフォームモジュールはUserForm1に貼り付け、CheckBoxは3つつくっています。クラスモジュールはClass1に貼り付けました。
>どなたか対策を教えて下さい。
以下のコードをそのままコピーして確認しましたが、
正常に動いていますよ(確認したのはExcel2000で)。

このコードは、Userform1にあるコントロールが

Checkbox1、Checkbox2、Checkbox3(これがチェックボックスコントロール)
Textbox1、Textbox2、Textbox3(これがテキストボックスコントロール)


というオブジェクト名でなければなりませんが、
これは正しく貼り付けられていますか?
何となくですが、テキストボックスがUserform1に貼り付けてないのでは?


>--------------------------
> 【10411】Re:イベントの処理をまとめて記述
>複数個の
> Private Sub CheckBox1_Click()
> ・・・
> End Sub
>
> Private Sub CheckBox2_Click()
> ・・・
> End Sub
> ・・・
>を1つにする方法?
>
> 【10412】Re:イベントの処理をまとめて記述 
>クラスモジュールを使えばできそうですけど試してみますか?
>
>★ユーザーフォームモジュール
>Option Explicit
>Dim ColCls As Collection
>Private Sub UserForm_Initialize()
>  Dim ClsT As Class1
>  Dim i  As Long
>  
>  Set ColCls = New Collection
>  For i = 1 To 3
>    Set ClsT = New Class1
>    Call ClsT.propertysSet(Me("CheckBox" & i), Me("TextBox" & i))
>    ColCls.Add ClsT
>    Set ClsT = Nothing
>  Next i
>End Sub
>
>Private Sub UserForm_Terminate()
>  Set ColCls = Nothing
>End Sub
>
>★クラスモジュール(Class1)
>Option Explicit
>Private WithEvents Chk As MSForms.CheckBox
>Private Txt      As MSForms.TextBox
>
>Sub propertysSet(ByVal ChkT As MSForms.CheckBox, ByVal TxtT As MSForms.TextBox)
>  Set Chk = ChkT
>  Set Txt = TxtT
>End Sub
>
>Private Sub Chk_Click()
>  If Chk Then
>    Txt.Value = 1
>  Else
>    Txt.Value = ""
>  End If
>End Sub
>
>という感じです。
>違ったらすいません。

【17392】Re:以前の記事から
お礼  Kobasan  - 04/8/28(土) 9:38 -

引用なし
パスワード
   ichinose さん早々に解答下さり有り難うございます。
ご推察の通り、テキストボックスをUserform1に貼り付けたら、動きました。
すっきりしました。有り難うございます。
>
>

【17393】Re:以前の記事から
発言  角田 WEB  - 04/8/28(土) 9:55 -

引用なし
パスワード
   こんにちは。
>Call ClsT.propertysSet(Me("CheckBox" & i), Me("TextBox" & i))
省略時の既定メンバ解釈により動いていますが正確には
Me("CheckBox" & i), Me("TextBox" & i)
  ↓
Me.Controls("CheckBox" & i), Me.Controls("TextBox" & i)

>Dim ColCls As Collection
>Private Sub UserForm_Initialize()
>  Dim ClsT As Class1
>  Dim i  As Long
>  
>  Set ColCls = New Collection
>  For i = 1 To 3
>    Set ClsT = New Class1
>    Call ClsT.propertysSet(Me("CheckBox" & i), Me("TextBox" & i))
>    ColCls.Add ClsT
>    Set ClsT = Nothing
>  Next i
本体のクラス変数(ClsT)をローカル変数にして、コレクションに
参照を残して処理しているのはメモリーリークしそうな書き方ですね〜

>クラスモジュールを使うのは初めてなと、本を見ても少しの説明しかのってないので
こちら参考に(§5までが一般的なクラスモジュールによる一元化の手法です)

擬似からの脱却
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm

【17400】Re:以前の記事から
お礼  Kobasan  - 04/8/28(土) 13:48 -

引用なし
パスワード
   角田 さん、アドバイス有り難うございます。
ご指摘のホームページを見ました。少し時間をかけて勉強しすます。

【17405】Re:以前の記事から
お礼  Kobasan  - 04/8/28(土) 21:41 -

引用なし
パスワード
   ChecBox1〜3を列C,B,Dに対応させて、
チェックされたら列を非表示にする
チェックがとれたら列を表示する
を今までのクラスモジュールを利用して記述するとどうなるのですか。

Private Sub Chk_Click()
  If Chk Then
    Txt.Value = 1
  Else
    Txt.Value = ""
  End If
End Sub

のところを変えればよいのは分かるのですが、
CheckBoxの番号と列との関係づけが難しいです。

【17406】Re:以前の記事から
質問  Kobasan  - 04/8/28(土) 21:46 -

引用なし
パスワード
   間違えました。質問です!!!

>ChecBox1〜3を列C,B,Dに対応させて、
>チェックされたら列を非表示にする
>チェックがとれたら列を表示する
>を今までのクラスモジュールを利用して記述するとどうなるのですか。
>
>Private Sub Chk_Click()
>  If Chk Then
>    Txt.Value = 1
>  Else
>    Txt.Value = ""
>  End If
>End Sub
>
>のところを変えればよいのは分かるのですが、
>CheckBoxの番号と列との関係づけが難しいです。

【17407】Re:以前の記事から
回答  つん E-MAIL  - 04/8/28(土) 22:04 -

引用なし
パスワード
   こんばんは〜
ちょっとやってみました。
・・・やってみたら出来た・・という程度なんで、
マズイところはないか?・・・ichinoseさんチェックお願いします^^;

>>ChecBox1〜3を列C,B,Dに対応させて、
>>チェックされたら列を非表示にする
>>チェックがとれたら列を表示する
>>を今までのクラスモジュールを利用して記述するとどうなるのですか。
>>
>>Private Sub Chk_Click()
>>  If Chk Then
>>    Txt.Value = 1
>>  Else
>>    Txt.Value = ""
>>  End If
>>End Sub
>>
>>のところを変えればよいのは分かるのですが、
>>CheckBoxの番号と列との関係づけが難しいです。

'==クラスモジュール=======================================
Private WithEvents Chk As MSForms.CheckBox
Private ColNum As Long

Sub propertysSet(ByVal ChkT As MSForms.CheckBox, ByVal ColN As Long)
  Set Chk = ChkT
  ColNum = ColN
End Sub

Private Sub Chk_Click()
  If Chk Then
    Worksheets("Sheet1").Columns(ColNum).Hidden = True
  Else
    Worksheets("Sheet1").Columns(ColNum).Hidden = False
  End If
End Sub

'==フォームモジュール=======================================
Dim ColCls As Collection
Private Sub UserForm_Initialize()
  Dim ClsT As Class1
  Dim i  As Long
 
  Set ColCls = New Collection
  For i = 1 To 3
    Set ClsT = New Class1
    Call ClsT.propertysSet(Me("CheckBox" & i), i + 1)
    ColCls.Add ClsT
    Set ClsT = Nothing
  Next i
End Sub

Private Sub UserForm_Terminate()
  Set ColCls = Nothing
End Sub

お試しください・・・

【17409】Re:以前の記事から
発言  ichinose  - 04/8/28(土) 22:14 -

引用なし
パスワード
   ▼Kobasan さん:
こんばんは。
>ChecBox1〜3を列C,B,Dに対応させて、
>>チェックされたら列を非表示にする
>>チェックがとれたら列を表示する
>>を今までのクラスモジュールを利用して記述するとどうなるのですか。
>CheckBoxの番号と列との関係づけが難しいです。

クラスモジュールに↑の情報も登録しておかないとわかりませんよね?
私は、この手の処理ではコレクションは使用しないので
とりあえず、私流の方法で・・・。
以下に記述するコードは、
userform1に
Checkbox1、Checkbox2、Checkbox3の3つのコントロールを貼り付けて下さい。

Userform1のモジュールに
'==============================================================
Private mycls(1 To 3) As Class1
'==============================================================
Private Sub UserForm_Initialize()
  For idx = 1 To 3
    Set mycls(idx) = New Class1
    With mycls(idx)
     .id = idx
     Set .chk = Controls("checkbox" & idx)
     End With
    Next idx
End Sub
'ご提示されたコレクションでも同じ処理はできますから
'考えてみて下さい

'クラスモジュール(Class1)では
'================================================================
Public WithEvents chk As MSForms.CheckBox
Public id As Long
'================================================================
Private Sub chk_Click()
  Columns(Array("b", "c", "d")(id - 1)).Hidden = chk.Value
'チェックボックスと列との対応が記述どおり"c","b","d"ならArrayの中の順序を
'変更してください
End Sub


確認してみて下さい。

【17410】Re:以前の記事から
発言  ichinose  - 04/8/28(土) 22:25 -

引用なし
パスワード
   ▼つん さん:
こんばんは。
また、かぶってしまいました・・・。
拝見したら、ちょっとだけ違うのでそのまま残しておきますね!!
方法は、色々あるということで・・・。

【17414】Re:以前の記事から
お礼  Kobasan  - 04/8/28(土) 23:41 -

引用なし
パスワード
   こんばんわ
ichinose さん、つんさん、早々に解答有り難うございます。
どちらもうまく動きました。
クラスモジュールを使えるよう、もう少し時間をかけていきたいと思います。
今回初めて、クラスモジュールを使ってみて、勉強になりましたし、これからも使っていきたいと思います。
有り難うございます。

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