2017-06-11 18 views
1

複数ページのコントロールを使ってデータを収集するためのコードをVBAに作成しました。ボタンを押した後に動的テキストボックスを書き直す

入力ウィンドウ: image

各ページでは、私は動的に各チェックボックスのためのExcelのワークシートや、からの行に基づいてチェックボックスを追加しました、ちょうど下の画像のように、テキストボックスと2つのコマンドボタンがあります

自動的にコントロールを追加するためのコードは次のとおりです。

Private Sub UserForm_Initialize() 
fmat_disp.Value = 0 
fmat_set.Value = 0 


'--------------------------------------------------------------------------------------------- 
'Inspeção de Mecânica 
Sheets("Mecânica").Activate 
n_anom = Application.WorksheetFunction.CountA(Range("1:1")) - 1 
AreasInspecao.mecanica.ScrollHeight = 10 + 18 * (n_anom) 
For i = 1 To n_anom 
'Selecionar anomalia 
Set SelAnom = AreasInspecao.mecanica.Controls.Add("Forms.CheckBox.1", "sel_anom_" & i) 
SelAnom.Caption = Worksheets("Mecânica").Cells(1, i + 1) 
SelAnom.AutoSize = True 
SelAnom.Height = 18 
SelAnom.Left = 5 
SelAnom.Top = 5 + (SelAnom.Height) * (i - 1) 
SelAnom.Tag = i 

同じだけのキャプションを変更し、テキストボックスとプラス/マイナスボタンになります。

私は何をしたいことは次のとおりです。 1)チェックボックスがチェックされたときに、それぞれのテキストボックス1 2を示さなければならない)マイナス記号を押したときに、それぞれのTEXTBOXは 3をデクリメントしなければなりませんが)プラス記号を押したときに、それぞれのTEXTBOXは 4をインクリメントする必要があります)「FinalizarInspeção」が押されている場合は、集められたすべてのデータをExcelに送ってワークシートに記入する必要があります。

それぞれのボタン/チェックボックスをそれぞれのテキストボックスにリンクする方法は分かりませんが、それぞれのサブルーチンを作成する必要はありません。私は約500のサブルーチンを持っています....それは手動では管理することが不可能です....

+0

イメージはありますか? –

+0

申し訳ありません... imgurl画像へのリンクが追加されました! –

+1

あなたが動的にコントロールを追加している場合、あなたはこのような何かが必要です。http://www.siddharthrout.com/2011/08/05/vba-control-arrays/それはイベントをキャプチャする方法を示します:あなたがする必要があるすべてをdoは、関連するコントロールのグループをトリガーされたコードで識別できるように、コントロールに名前を付けます。 –

答えて

0

ここでは、チェックボックスやボタンのクリックイベントを扱うための概要です。

クリックをキャプチャするための最初の2つのカスタムクラス:これらはそれぞれ非常に単純です。クリックすると、クリックされたコントロールを引数としてuserformのメソッドが呼び出されます。

'clsCheck 
Public WithEvents chk As MSForms.CheckBox 

Private Sub chk_Click() 
    frmExample.HandleClick chk 
End Sub 

'clsButton 
Public WithEvents btn As MSForms.CommandButton 

Private Sub btn_Click() 
    frmExample.HandleClick btn 
End Sub 

ユーザーフォームコード - 私のフォームの名前は "frmExample"です。

コントロールのグループが「単位」として扱われるようにする命名規則に注意してください。

Option Explicit 

'These two global collections hold instances of the custom classes 
Dim colCheckBoxes As Collection 
Dim colButtons As Collection 


Private Sub UserForm_Activate() 

    Const CON_HT As Long = 18 
    Dim x As Long, cbx As MSForms.CheckBox, t 
    Dim btn As MSForms.CommandButton, txt As MSForms.TextBox 
    Dim oCheck As clsCheck, oButton As clsButton 

    Set colCheckBoxes = New Collection 
    Set colButtons = New Collection 

    For x = 1 To 10 

     t = 5 + CON_HT * (x - 1) 

     Set cbx = Me.Controls.Add("Forms.CheckBox.1", "cbox_" & x) 
     cbx.Caption = "Checkbox" & x 
     cbx.Width = 80 
     cbx.Height = CON_HT 
     cbx.Left = 5 
     cbx.Top = t 
     colCheckBoxes.Add GetCheckHandler(cbx) '<< save in collection 

     Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnplus_" & x) 
     btn.Caption = "+" 
     btn.Height = CON_HT 
     btn.Width = 20 
     btn.Left = 90 
     btn.Top = t 
     btn.Enabled = False '<<buttons start off disabled 
     colButtons.Add GetButtonHandler(btn) '<< save in collection 

     Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnminus_" & x) 
     btn.Caption = "-" 
     btn.Height = CON_HT 
     btn.Width = 20 
     btn.Left = 130 
     btn.Top = t 
     btn.Enabled = False '<<buttons start off disabled 
     colButtons.Add GetButtonHandler(btn) '<< save in collection 

     'no events are captured for the textboxes... 
     Set txt = Me.Controls.Add("Forms.Textbox.1", "txt_" & x) 
     txt.Width = 30 
     txt.Height = CON_HT 
     txt.Left = 170 
     txt.Top = t 

    Next x 

End Sub 

'All "clicked" controls saved in instances of the custom classes 
' get passed here. Handle based on control type/name 
Public Sub HandleClick(ctrl As MSForms.Control) 
    Dim num 
    num = Split(ctrl.Name, "_")(1) 'which set of controls are we working with? 
    Dim txt As MSForms.TextBox 
    'get the matching text box... 
    Set txt = Me.Controls("txt_" & num) 
    If ctrl.Name Like "cbox_*" Then 
     If ctrl.Value Then txt.Value = 1 
     Me.Controls("btnplus_" & num).Enabled = ctrl.Value 
     Me.Controls("btnminus_" & num).Enabled = ctrl.Value 
    ElseIf ctrl.Name Like "btnplus_*" Then 
     txt.Value = txt.Value + 1 
    ElseIf ctrl.Name Like "btnminus_*" Then 
     txt.Value = txt.Value - 1 
    End If 
End Sub 


'couple of "factory" functions for the event-handling classes 
Private Function GetCheckHandler(cb As MSForms.CheckBox) 
    Dim rv As New clsCheck 
    Set rv.chk = cb 
    Set GetCheckHandler = rv 
End Function 

Private Function GetButtonHandler(btn As MSForms.CommandButton) 
    Dim rv As New clsButton 
    Set rv.btn = btn 
    Set GetButtonHandler = rv 
End Function 

サンプルファイル:https://www.dropbox.com/s/k74c08m0zkwn9l7/tmpFormEvents.xlsm?dl=0

+0

ありがとう、ティム!私は私のインターフェースでいくつかの変更をしなければならなかったaltoughそれは、魅力のように働いた... は私が複数ページ内でこれを行うことができないと思うので、私はボタンにリンクされたフレームを作成し、Aに見える一つのフレームを作りましたどのボタンがアクティブ化されたかに基づいて、時間 –

関連する問題