Excel VBA質問箱 IV

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

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


3781 / 13646 ツリー ←次へ | 前へ→

【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 お礼[未読]

【60179】UserFormnoのComboBox_Changeについて
質問  ma  - 09/2/2(月) 14:19 -

引用なし
パスワード
   いつも、ここで見て参考にさせていただいております。
この度、過去を見たのですがうまく探せなかったので質問させていただきます。

UFに、ComboBoxが4つあります。

データーシートが、1枚あります。

ComboBox1が、データーシートの「A列」
ComboBox2が、データーシートの「B列」
ComboBox3が、データーシートの「C列」
ComboBox4が、データーシートの「D列」

のデーターを、表示できるようにしてあります。

例えば、ComboBox1でデーターを選択するとChangeで残りのComboBox2〜4に対応する値が入力されるようにしてあります。

それぞれの、ComboBoxを選択すると_Changeで同じように他のComboBoxに値が入力されるようにしてあります。

他の、ComboBoxに値を入れるときは「Application.EnableEvents = False」
にして、入れているのですが他のComboBoxに値が変更になった瞬間にそのComboBoxのChangeが起動してしまいます。

これを、止める方法をお分かりになる方がいらっしゃいましたらご教授願いたいと思います。

よろしくお願いいたします。

【60180】Re:UserFormnoのComboBox_Changeについて
発言  Jaka  - 09/2/2(月) 14:56 -

引用なし
パスワード
   ▼ma さん:
>他の、ComboBoxに値を入れるときは「Application.EnableEvents = False」
>にして、入れているのですが他のComboBoxに値が変更になった瞬間にそのComboBoxのChangeが起動してしまいます。
>
>これを、止める方法をお分かりになる方がいらっしゃいましたらご教授願いたいと思います。
無いと思います。
ですからFlg使って、判定させるとか。

【60181】Re:UserFormnoのComboBox_Changeについて
発言  Yuki  - 09/2/2(月) 15:50 -

引用なし
パスワード
   ▼ma さん:
>例えば、ComboBox1でデーターを選択するとChangeで残りのComboBox2〜4に対応する値が入力されるようにしてあります。
>
>それぞれの、ComboBoxを選択すると_Changeで同じように他のComboBoxに値が入力されるようにしてあります。
>
>他の、ComboBoxに値を入れるときは「Application.EnableEvents = False」
>にして、入れているのですが他のComboBoxに値が変更になった瞬間にそのComboBoxのChangeが起動してしまいます。
>
各ComboBoxのChangeイベントで次のComboBoxのListIndexを-1にするとか

【60183】Re:UserFormnoのComboBox_Changeについて
お礼  ma  - 09/2/2(月) 16:40 -

引用なし
パスワード
   Jakaさん Yukiさん 
早速の、レスありがとうございました。
レスがとても早いので、びっくりしています。

今回、Jakaさんの方法を探して検討してみます。
ありがとうございました。

分からない、ところがありましたら質問させていただきます。
その時は、よろしくお願いいたします。

【60189】イベントを止める方法について  Jakaさ...
お礼  ma  - 09/2/3(火) 13:14 -

引用なし
パスワード
   昨日投稿する前に、頭の中で if○○ then で分けられればと考えていたのですが最後まで思いつきませんでした。

そこで、投稿させていただきました。
Jakaさんから、「flg」のヒントをえて

過去ログを検索して、 【49591】Re:チェックボックスの選択 Jakaさん と  【49872】Re:シート別のマクロの動かし方 勝子さん のログを探しました。

お二人を参考にして、何とか満足のいくベースのものは出来ました。

If flg = True Then
  flg = False ← ここが、思い浮かばなかった・・・・。
  Exit Sub
End If

始めに、下の物を作りました。

Public flg As Boolean

Private Sub ComboBox1_Change()
    If flg = True Then
      flg = False
      Exit Sub
    End If
      flg = True
        ComboBox1.Value = "1"
      flg = True
        ComboBox2.Value = "1"
      flg = True
        ComboBox3.Value = "1"
      flg = False
End Sub
Private Sub ComboBox2_Change()
    If flg = True Then
      flg = False
      Exit Sub
    End If
      flg = True
        ComboBox1.Value = "2"
      flg = True
        ComboBox2.Value = "2"
      flg = True
        ComboBox3.Value = "2"
      flg = False
End Sub
Private Sub ComboBox3_Change()
    If flg = True Then
      flg = False
      Exit Sub
    End If
    flg = True
        ComboBox1.Value = "3"
      flg = True
        ComboBox2.Value = "3"
      flg = True
        ComboBox3.Value = "3"
      flg = False
End Sub
Private Sub UserForm_Initialize()
flg = True
  ComboBox1.Value = "1"
flg = True
  ComboBox2.Value = "2"
flg = True
  ComboBox3.Value = "3"
flg = False
End Sub

そして、下の物に直しました。

Public flg As Boolean
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 3
  flg = True
    With UserForm3
      .Controls("ComboBox" & i).Value = i
    End With
Next
  flg = False
End Sub
Private Sub ComboBox1_Change()
Call tiyusi(1)
End Sub

Private Sub ComboBox2_Change()
Call tiyusi(2)
End Sub
Private Sub ComboBox3_Change()
Call tiyusi(3)
End Sub

Sub tiyusi(bangou)
Dim i As Integer
  If flg = True Then
    flg = False
    Exit Sub
  End If
  For i = 1 To 3
    flg = True
      With UserForm3
        .Controls("ComboBox" & i).Value = bangou
      End With
  Next
    flg = False
End Sub

どちらも、同じ結果になりました。

今後、Classを使っての改良が時間があればやってみたいと思います。

Jakaさん、ありがとうございました。
また、何かございましたらよろしくお願いいたします。

【60208】Re:イベントを止める方法について  Ja...
発言  Jaka  - 09/2/4(水) 14:55 -

引用なし
パスワード
   ▼ma さん:
>>Sub tiyusi(bangou)
>Dim i As Integer
>  If flg = True Then
>    flg = False
>    Exit Sub
>  End If
>  For i = 1 To 3
>    flg = True
>      With UserForm3
>        .Controls("ComboBox" & i).Value = bangou
>      End With
>  Next
>    flg = False
>End Sub
こうした方が無駄が少ないような気が。

Sub tiyusi(bangou)
Dim i As Integer
  If flg = False Then
    flg = True
    For i = 1 To 3
     With UserForm3
       .Controls("ComboBox" & i).Value = bangou
     End With
    Next
    flg = False
  End If
End Sub

【60211】Re:イベントを止める方法について  Ja...
お礼  ma  - 09/2/4(水) 16:44 -

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


お忙しい中、お手間を取らせてしまいましてありがとうございました。
確かに、無駄が無いです。

どうも、頭が固いせいか一つ一つ書かないと出来ないようです。
これからも、よろしくご指導お願いいたします。

現在、Class化に向けて取り組んでいますが????と言う感じです。
どうも、クラスの考え方が理解していないのが原因のようです。

UFから、必要な分のClassは出来たのですが
クラス内での、Flgの使い方が出来ないでいます。

組んだもので、必要な答えは出るのですが
例えば、ComboBox1のクラスの途中で他のComboBoxの値を変えると他のComboBoxクラスが起動しているようで答えが出るまでに何度も同じ処理をしています。

flgの、位置が悪いのか何度か変えてみたのですがやはりダメみたいです。

過去ログで、クラスに関するものを見ているのですが今のところこのような内容を見つけることが出来ません。

別のクラスが、起動したときに抜けられる方法を考えてみます。

Class1の中で、

1回目は、flg=Falseなので やりたい処理に行きますが
If flg = True Then 
  flg = False 
  Exit Sub
End If
  
flg = True  ← ここで、Trueなのに

  やりたい処理
やりたい処理途中で、ComboBox2などの値が変わると

2回順目が始まり、flg=Falseで if 文を抜けてしまって 「やりたい処理」に進んでしまいます。

If flg = True Then 
  flg = False 
  Exit Sub
End If

クラスを、2つ使ってやれば何とかなるのか?
それとも、もっと基本的なことが分かっていないのにやろうとしていること自体無謀なのか??

でも、何とかできれば今後の改良するときや同じようなものを作るときにかなり時間短縮できると思って取り組んでいます。

あつかましいお願いなのですが、お時間のあるときにヒントなどがございましたらご教授願えればと思います。


▼Jaka さん:
>▼ma さん:
>>>Sub tiyusi(bangou)
>>Dim i As Integer
>>  If flg = True Then
>>    flg = False
>>    Exit Sub
>>  End If
>>  For i = 1 To 3
>>    flg = True
>>      With UserForm3
>>        .Controls("ComboBox" & i).Value = bangou
>>      End With
>>  Next
>>    flg = False
>>End Sub
>こうした方が無駄が少ないような気が。
>
>Sub tiyusi(bangou)
>Dim i As Integer
>  If flg = False Then
>    flg = True
>    For i = 1 To 3
>     With UserForm3
>       .Controls("ComboBox" & i).Value = bangou
>     End With
>    Next
>    flg = False
>  End If
>End Sub

【60223】ちょっと修正。
発言  Jaka  - 09/2/5(木) 10:10 -

引用なし
パスワード
   この部分。
>    For i = 1 To 3
>     With UserForm3
>       .Controls("ComboBox" & i).Value = bangou
>     End With
>    Next
       ↓
    With UserForm3
      For i = 1 To 3
       .Controls("ComboBox" & i).Value = bangou
      Next 
    End With

【60226】Re:イベントを止める方法について  Ja...
発言  Jaka  - 09/2/5(木) 11:29 -

引用なし
パスワード
   コンボボックスの数、
ComboBox1〜ComboBox4
の4個。
別の書き方もあると思いますが....。
っていうか、わざわざクラスにするとめんどいかも。


クラスモジュール(名前は、Class1)

Public WithEvents ComboBoxChangeEvent As MSForms.ComboBox

Private Sub ComboBoxChangeEvent_Change()
Dim CBnm As String, ACOj As String, i As Long
CBnm = ComboBoxChangeEvent.Name
With UserForm1
  ACOj = .ActiveControl.Name
  If CBnm <> ACOj Then Exit Sub
  'MsgBox CBnm & vbLf & .Controls(CBnm).Value
  For i = 1 To 4
    If CBnm <> "ComboBox" & i Then
     .Controls("ComboBox" & i).Value = .Controls(CBnm).Value
    End If
  Next
End With
End Sub


フォームモジュール(名前は、UserForm1)

Dim ComboCls() As New Class1

Private Sub UserForm_Initialize()
Dim i As Long
ComboBox1.List = Range("A1:A5").Value
ComboBox2.List = Range("B1:B5").Value
ComboBox3.List = Range("C1:C5").Value
ComboBox4.List = Range("D1:D5").Value
ReDim ComboCls(1 To 4)
For i = 1 To 4
  Controls("ComboBox" & i).Value = i
  Set ComboCls(i).ComboBoxChangeEvent = Controls("ComboBox" & i)
Next
End Sub

【60241】Re:ちょっと修正。
お礼  ma  - 09/2/5(木) 17:08 -

引用なし
パスワード
   お忙しい中、ありがとうございました。
修正して、使わせていただきます。

【60242】Re:イベントを止める方法について  Ja...
お礼  ma  - 09/2/5(木) 17:17 -

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

お忙しい中、お手間を取らせてしまって申しわけございませんでした。


昨日の、書き込みの私なりに考えてみて取り合えず思うような動きをするものはできました。
ただ、Jakaさんのものと比べるとやはり無駄がかなりあるようです。

今回のものを、私なりに使えるようにしていきます。
これからも、よろしくお願いいたします。

【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さんの物を、使えるようにしてみます。

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

【60247】Re:イベントを止める方法について Jaka...
お礼  ma  - 09/2/5(木) 21:36 -

引用なし
パスワード
   こんばんは。
どうも、気になりパソコン立ち上げてもう一度見てみたくなりよくよく見てみました。

2箇所ほど、こんなことが出来るのか????
と言うところがあり、とても感動しています。

現在は、コンボボックス4個なのですが50個のものを作ることにしているのでそのとき1つ1つ50個設定するの大変だと思ってClassを思いつきました。

お忙しい中、本当にありがとうございました。


>▼Jaka さん:
>コンボボックスの数、
>ComboBox1〜ComboBox4
>の4個。
>別の書き方もあると思いますが....。
>っていうか、わざわざクラスにするとめんどいかも。
>
>
>クラスモジュール(名前は、Class1)
>
>Public WithEvents ComboBoxChangeEvent As MSForms.ComboBox
>
>Private Sub ComboBoxChangeEvent_Change()
>Dim CBnm As String, ACOj As String, i As Long
>CBnm = ComboBoxChangeEvent.Name
        ↑名前の取得ができると思っていなかった。びっくり。

>With UserForm1
>  ACOj = .ActiveControl.Name
        ↑名前の取得ができると思っていなかった。びっくり。


>  If CBnm <> ACOj Then Exit Sub
>  'MsgBox CBnm & vbLf & .Controls(CBnm).Value
>  For i = 1 To 4
>    If CBnm <> "ComboBox" & i Then
>     .Controls("ComboBox" & i).Value = .Controls(CBnm).Value
>    End If
>  Next
>End With
>End Sub
>
>
>フォームモジュール(名前は、UserForm1)
>
>Dim ComboCls() As New Class1
>
>Private Sub UserForm_Initialize()
>Dim i As Long
>ComboBox1.List = Range("A1:A5").Value
>ComboBox2.List = Range("B1:B5").Value
>ComboBox3.List = Range("C1:C5").Value
>ComboBox4.List = Range("D1:D5").Value
>ReDim ComboCls(1 To 4)
>For i = 1 To 4
>  Controls("ComboBox" & i).Value = i
>  Set ComboCls(i).ComboBoxChangeEvent = Controls("ComboBox" & i)
>Next
>End Sub

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