Excel VBA質問箱 IV

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

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


21879 / 76734 ←次へ | 前へ→

【60243】イベントを止める方法について(駄馬編)
発言  ma  - 09/2/5(木) 17:20 -

引用なし
パスワード
   Jakaさんへ

昨日掲示板に、ご質問したClassかなのですが何とかできました。
クラスについての、知識がよく理解していなかったのが原因でした。

秀和システムの「ExeclVBAパーフェクトマスター(44)(Execl2000/2002完全対応)」P64 に、
Subプロシャージャの記述があり、その中に「Friend」の記載を見つけヘルプで探して使うことにしました。


サンプル 新規BOOKを作ります。
UF1を作ります。
コンボBOXを3つ作ります。

UFが、呼び出されるとき初期値としてコンボBOX1〜3はそれぞれのコンボBOX番号を表示します。
ComboBox1 = 「1」 が 表示される
ComboBox2 = 「2」 が 表示される
ComboBox3 = 「3」 が 表示される

例 ComboBox2の「2」を消したり違う値などを入れると「Change」が起動して値を変更した
ComboBox2の「2」が他のComboBox1=2 ComboBox3 = 2 と変更される。

これで一応、動いていると思うのですがflgで、判断して処理を止めていると思います。


クラスについて

私が、VBA書籍などを読んだりして理解していたクラスの知識は

ComboBoxが3個あるので、クラス1を3個作る。
Class1の中に、flgを使ってやれば今回の他のComboBoxを呼び出したりはしないと考えていました。
実際、やったら呼び出していて何回も無限Loopみたくなりました。
最終的には、ComboBox1を変えたのにComboBox3の値の3が他のComboBoxに出ることになりました。

そこで、クラスを2重化にしてflg部分を2つ目のクラスに「Friend」で記載してやれば良いと考えてやってみたら
結局は、前と同じで他の「Change」が起動して値を変えることが出来ませんでした。

クラスを、2重化にしてもclass1 を作るときに class2も作るわけですがこれだと
ComboBox1のclass1とclass2で1セット
ComboBox2のclass1とclass2で2セット
ComboBox3のclass1とclass3で3セット

と、3個の独立した(こんな考えで良いのか??)物ができる。そして、flgの初期値はそれぞれ「False」なので
他のComboBoxから呼び出したとき始めは「flg」は「False」処理をして「flg」を「True」にして処理を進めていき
他の、ComboBoxに値を入れると他のComboBoxの「Change」が起動してしまいます。
flgの初期値は、Falseなので処理が止まるのではなく処理が進んで行ってしまうことが分かりました。
そこで、今回UFに「flg」の値を飛ばして切り替えさせられれば良いのではないかと考えてやってみました。
動かしてみたら、何とか思うように動きました。


これとは別の方法も、考えたのですが今日は時間が無いのでまた後にでもやってみたいと思います。
それは、Classの2重化です。
UFと同じように、Class1に flgの値を置きます。
問題なのは、UFでComboBoxをクラス化するのではなくてclass1の中でComboBoxを3個クラス化できれば
今回成功したUFを同じような結果が出来ると考えました。
classの2重かは、【 擬似からの脱却 】を参考にしました。
もう1年以上も、読んでいる資料なのですがclass名を変えて動かしてみるくらいは出来たのですが書いてある内容は読んで
いるうちはフムフムと思うのですが実際作れるのを言われると全然何も出来ない状態でした。
ただ、今回の件で【 擬似からの脱却 】 全部は理解していませんが少しはこれは自分でも分かるところなどは
使えるようになりました。

Jakaさんからのヒント「flg」で今回は色々学ばせていただきました。
本当に、ありがとうございました。
これからも、分からないことがございましたら書き込みさせていただきます。
その折には、お手すきのときにご教示願いたいと思います。


'--------------------
'UserForm1に記入する
'--------------------
Option Explicit
Option Base 1

Dim Myclass1(3) As New Class1
Private m_flg As Boolean
Private Sub UserForm_Initialize()
Dim myCmbBox As New Collection
Dim i As Integer
Dim i01 As Integer
  For i = 1 To 3
      UserForm1.Controls("ComboBox" & i).Value = i
      myCmbBox.Add Item:=Controls("ComboBox" & i)

    Set Myclass1(i) = New Class1

    With Myclass1(i)
       .Cmb = myCmbBox(i)
       .Index = i
       .Value = UserForm1.Controls("ComboBox" & i).Value
'       .flg = True
    End With
  Next

End Sub
Private Sub UserForm_Terminate()
  Dim i As Long
  'Classを破棄
  For i = 1 To 3
    Set Myclass1(i) = Nothing
  Next i
End Sub
Public Property Get m_flg01() As Boolean
  m_flg01 = m_flg
End Property
Friend Property Let m_flg01(ByRef inflg As Boolean)
   m_flg = inflg
End Property

'----------------------------
'    Class1に記入する
'----------------------------
Option Explicit

Private WithEvents myCmb As MSForms.ComboBox
Private m_intIndex As Integer
Private m_Value As String

Public Property Get Cmb() As MSForms.ComboBox
   Set Cmb = myCmb
End Property
Public Property Let Cmb(ByVal cmdNewValue As MSForms.ComboBox)
   Set myCmb = cmdNewValue
End Property
Public Property Get Index() As Integer
   Index = m_intIndex
End Property
Public Property Let Index(ByVal intNewValue As Integer)
   m_intIndex = intNewValue
End Property
Public Property Get Value() As String
   Value = m_Value
End Property
Public Property Let Value(ByVal inValue As String)
   m_Value = inValue
End Property
Private Sub myCmb_Change()
  MsgBox "クリックしたボタンは ComboBox" & m_intIndex
  If UserForm1.m_flg01 = False Then '= True
    UserForm1.m_flg01 = True 'False
    m_Value = m_intIndex
Call hiyouzi(m_Value)
    UserForm1.m_flg01 = False
  End If
End Sub
Sub hiyouzi(ByRef kensaku As String)
Dim i01 As Long
  With UserForm1
    For i01 = 1 To 3
       .m_flg01 = True
      .Controls("ComboBox" & i01).Value = kensaku
    Next
       .m_flg01 = False  'True
  End With
End Sub


どうも、まだ無駄が多いような気がします。
Jakaさんの物を、使えるようにしてみます。

ありがとうございました。
1 hits

【60179】UserFormnoのComboBox_Changeについて ma 09/2/2(月) 14:19 質問
【60180】Re:UserFormnoのComboBox_Changeについて Jaka 09/2/2(月) 14:56 発言
【60181】Re:UserFormnoのComboBox_Changeについて Yuki 09/2/2(月) 15:50 発言
【60183】Re:UserFormnoのComboBox_Changeについて ma 09/2/2(月) 16:40 お礼
【60189】イベントを止める方法について  Jakaさん... ma 09/2/3(火) 13:14 お礼
【60208】Re:イベントを止める方法について  Jaka... Jaka 09/2/4(水) 14:55 発言
【60211】Re:イベントを止める方法について  Jaka... ma 09/2/4(水) 16:44 お礼
【60226】Re:イベントを止める方法について  Jaka... Jaka 09/2/5(木) 11:29 発言
【60242】Re:イベントを止める方法について  Jaka... ma 09/2/5(木) 17:17 お礼
【60243】イベントを止める方法について(駄馬編) ma 09/2/5(木) 17:20 発言
【60247】Re:イベントを止める方法について Jakaさ... ma 09/2/5(木) 21:36 お礼
【60223】ちょっと修正。 Jaka 09/2/5(木) 10:10 発言
【60241】Re:ちょっと修正。 ma 09/2/5(木) 17:08 お礼

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