- Excel VBA 質問スレ Part38 [転載禁止]©2ch.net
517 :デフォルトの名無しさん[sage]:2015/10/23(金) 12:12:13.25 ID:C4TSXTyD - ユーザーフォーム関連で困っているのでご教授ください。
自社の台帳入力にあたり入力項目が多いので省力化と入力ミス防止のため、ユーザーフォームを用意しコマンドボタン押下で対象セルに一括登録するマクロを書きました。 ユーザーフォームは29箇所のテキストボックスと4箇所のコンボボックス構成され、編集されたかどうかを判定するためいずれかのオブジェクトでChangeイベントが有ったときにパブリック変数Changeで編集フラグを立てています。 コマンドボタン押下で呼び出されるプロシージャにはApplication.EnableEvents = Falseを記述しています。 動作は希望通りの物ができたのですが、コマンドボタン押下後の動きをF8で追っていくとなぜか特定のコンボボックスのチェンジイベントが発生し、 編集フラグの有無を判定後フラグなしの場合にフラグ立てるプロシージャ(Combobox1_Changeとします)に動作が移ります。 それが一度ならばまだしも各オブジェクトのValue値を対応するセルに入れるコード度にCombobox1_Changeを呼び出してしまいます(合計33回)。 いずれかのオブジェクトに入力された時点でフラグは立っているので無意味なコードを何度も繰り返し実行していることになります。 念のために”Combobox1_Change”を”Combobox1x_Change”とするなどして名称を変更した場合には他のプロシージャに動作が移る事はありません。 動作に支障はないものの、実行速度も気持ち遅く感じております。 どなたか原因がわかるかたいらっしゃいませんか?
|
- Excel VBA 質問スレ Part38 [転載禁止]©2ch.net
519 :デフォルトの名無しさん[sage]:2015/10/23(金) 13:52:01.55 ID:C4TSXTyD - >>518
編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、 フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
|
- Excel VBA 質問スレ Part38 [転載禁止]©2ch.net
522 :デフォルトの名無しさん[sage]:2015/10/23(金) 15:43:55.61 ID:C4TSXTyD - >>520
>これをまとめてやってはいけない理由がわからない。 用途は受注の一元管理のための物です。 受注時、請求時、入金時に各項目を入力する物で、フォームをみれば未請求・未入金が分かるようにしてあります。 請求や入金時には該当する受注のレコードを表示して空欄を埋めます。 >スピンボタンを押したときにまとめてチェックすれば? その方法の方がスマートと思います。 一度取り組んでみます。 >>521 >疑問その1: そもそも編集されたかどうかは、何のために知る必要があるの? スピンボタンを押したときに変更されていればMsgboxで確認後にセルに上書きしてから別のレコードに移る為です。 >疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、 イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは? おっしゃるとおりです。 変更有りと見なされて確認のMsgboxが出ますが上書きするだけのコードなので変更がなければキャンセルしてレコードは移ります。 なお編集フラグはフォームのコード上で一つしか用意していないのでどこかが編集されればフラグONとなります。 フラグの立て方やチェックのタイミングはご指摘された点も納得でき、私の至らない部分も理解できますが ご教授いただきたいのはなぜ同じコンボボックスのチェンジイベントが何度も発生し同じコードが繰り返し呼び出されるのか、と言う点なんです。
|
- Excel VBA 質問スレ Part38 [転載禁止]©2ch.net
528 :デフォルトの名無しさん[sage]:2015/10/23(金) 17:05:55.98 ID:C4TSXTyD - >>525
コマンドボタンを押した後の動作は 1 編集フラグを確認する変数を確認 2 編集されている場合は上書き確認のメッセージボックスを表示 3 OKボタンが押されれば各コントロールの値を指定するセルに代入するプロシージャ(登録処理)を呼び出す。 問題は3の登録処理プロシージャ内の .Cells(参照行, 2).Value = ComboBox_受注者.Value .Cells(参照行, 3).Value = TextBox_見積番号.Value .Cells(参照行, 5).Value = ComboBox_受注先.Value の様に対応するセルに各コントロールの値を渡すコード全てで”ComboBox_受注先_Change”が呼び出され実行されます。 入力されるセルは33箇所あるため33回呼び出しています。 >>526 イベントプロシージャを使わないのも選択の一つですが、原因を知りたいというのが一番です。 >>527 Valueに値をいれているのではなくセルに対応するコントロールのValueを渡しているんです。 (セルと対応するコントロールはそれぞれ対になっています) なのにChangeイベントプロシージャが呼び出されます。
|
- Excel VBA 質問スレ Part38 [転載禁止]©2ch.net
531 :デフォルトの名無しさん[sage]:2015/10/23(金) 17:19:50.77 ID:C4TSXTyD - >>530
謎のChangeイベントが発生して何度も呼び出されるComboBoxのRowSourceは作業用のデータ格納用の別シートを参照しているんです。
|