|
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さんの物を、使えるようにしてみます。
ありがとうございました。
|
|