2016-07-20 18 views
0

各テキストボックスの変更に対していくつかのlable値を更新しようとしました。 ウェブサイトでthis linkthis linkが検索されましたが、引き続き問題が発生しました。私は「クラス」がどのように機能するのか分かりません。 "QuoTxtBoxEvt" という名前のクラスでUserform - 複数のテキストボックスのイベント変更

コード:ユーザーフォームで

Option Explicit 

Private WithEvents TxtBoxGroup As MSForms.textbox 

Public Sub TxtBoxGroup_Change() 
    With frmQuo 
     .TextBox28.value = Val(.TextBox8.value) * Val(.TextBox9.value) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox11.value) * Val(.TextBox12.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox14.value) * Val(.TextBox15.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox17.value) * Val(.TextBox18.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox20.value) * Val(.TextBox21.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox23.value) * Val(.TextBox23.value)) 
     If .CheckBox1 = True Then .TextBox28.value = Val(.TextBox28.value) * (100 - Val(.TextBox26.value))/100 
     If .CheckBox2 = True Then .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox28.value) * Val(.TextBox27.value)/100) 
    End With 
End Sub 

コード:

Private Sub UserForm_Initialize() 
'Variables for textbox change event handler 
Dim TxtBoxGroupEventHandler() As New QuoTxtBoxEvt 
Dim vfrmControl As Control 
Dim i As Integer 

'Event handler for textbox change to update total cost 
i = 1 
For Each vfrmControl In Me.Controls 
    If TypeName(vfrmControl) = "TextBox" Then 
     ReDim Preserve TxtBoxGroupEventHandler(1 To i) 
     Set TxtBoxGroupEventHandler(i).TxtBoxGroup = vfrmControl 
     i = 1 + i 
    End If 
Next vfrmControl 
End Sub 

これらの私のコード今のところ、それはエラーを返します。私のコードで何が間違っていますか?誰かが簡単に "クラス"をコードする方法を教えてもらえますか?多くの

はORZ

編集に感謝: 私は私のことで値を更新し、各テキストボックスの変更イベントでそのサブを呼び出すサブを作成し、これを達成するための別の方法を得ました。しかし、これを行うには、この最良の方法(正しい方法ですか?)ですか?またはクラスメソッドを使用する方が良いですか?

+0

質問:ユーザーがボタンを追加すると、ユーザーがそれをクリックすると、それらに関連する 'TextBoxes'に従ってすべての値に値が更新されます。あなたのコードを簡単にするでしょうか? 'TextBoxes'の変更のたびにそれを持っていなければならない場合 –

+0

回答:私の上司はボタンT^Tを好きではありません。 – KokJoo89

答えて

0

イベントをグループ化するときは、クラスを使用してコントロールへの参照を保持します。次に、各コントロールのクラスの新しいインスタンスを作成し、コレクションまたは配列変数に追加します。コレクションまたは配列変数は、モジュールレベルで宣言する必要があります。このようにして、コントロールへの参照は、初期化サブルーチンの実行が終了した後でもコード内に保持されます。

.TextBox8.valueまたは.TextBox9.valueの値が変更されたときにイベントが発生する必要があるようです。このため、私は余分なセットアップを経ていないでしょう。

Private Sub TextBox8_Change() 
    RecalcTextBoxes 
End Sub 

Private Sub TextBox9_Change() 
    RecalcTextBoxes 
End Sub 

Sub RecalcTextBoxes() 
    With frmQuo 
     TextBox28.Value = Val(TextBox8.Value) * Val(TextBox9.Value) 
     TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox11.Value) * Val(TextBox12.Value)) 
     TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox14.Value) * Val(TextBox15.Value)) 
     TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox17.Value) * Val(TextBox18.Value)) 
     TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox20.Value) * Val(TextBox21.Value)) 
     TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox23.Value) * Val(TextBox23.Value)) 
     If CheckBox1 = True Then TextBox28.Value = Val(TextBox28.Value) * (100 - Val(TextBox26.Value))/100 
     If CheckBox2 = True Then TextBox28.Value = Val(TextBox28.Value) + (Val(TextBox28.Value) * Val(TextBox27.Value)/100) 
    End With 
End Sub 

あなたは自分自身を再トリガからTxtBoxGroup_Changeイベントを防ぐことができますあなたのQuoTxtBoxEvtクラスにフラグを追加する必要があります。今のところそれは、TextBox28の値を8回変えています。つまり、TxtBoxGroup_Changeイベントを8回呼び出すと、8 * 8回の呼び出しが繰り返されます。

Option Explicit 

Private WithEvents TxtBoxGroup As MSForms.TextBox 
Private EditMode As Boolean 

Public Sub TxtBoxGroup_Change() 

    If EditMode Then 
     Exit Sub 
    Else 
     EditMode = True 
    End If 

    With frmQuo 
     .TextBox28.value = Val(.TextBox8.value) * Val(.TextBox9.value) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox11.value) * Val(.TextBox12.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox14.value) * Val(.TextBox15.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox17.value) * Val(.TextBox18.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox20.value) * Val(.TextBox21.value)) 
     .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox23.value) * Val(.TextBox23.value)) 
     If .CheckBox1 = True Then .TextBox28.value = Val(.TextBox28.value) * (100 - Val(.TextBox26.value))/100 
     If .CheckBox2 = True Then .TextBox28.value = Val(.TextBox28.value) + (Val(.TextBox28.value) * Val(.TextBox27.value)/100) 
    End With 

    EditMode = False 

End Sub 
+0

トーマス、あなたにはお答えいただきありがとうございますが、あなたの答えは私にはウィキのようです。私は変装する時間が必要です。 ^^ Cheer – KokJoo89

+0

私の場合、私は2つのテキストボックスchange_event(すべてのテキストボックス、私はクラスの中に16を書き込んでいます)を追跡する必要があります。現在、私はそれを動作させるためにクラスを書くことに失敗しました。だから、私は16番目のテキストボックスchange_eventに追加する必要があった(サブを作成する)1番目の方法を取る。私はコントロールを意味のある名前にしようとしましたが、ループのように名前がわかることがあります。私はそれらをユニークな名前に名前を変更した後でもループすることができますか? – KokJoo89

+0

それはコードレビューの多くになった。 'QuoTxtBoxEvt'クラスでエラーが発生しました。イベントを処理するときは、イベントを再トリガーしないように注意してください。 –

関連する問題