2016-08-17 29 views
0

ExcelとVBAを使用してアンケートを作成します。私は質疑応答のテーブルを持っています。アンケートが始まると、私のコードはフォーム上のチェックボックスのラベルを上書きして答えを表示します。私は答えを取ってきて、チェックボックスの真偽値を使って列に書きます。Excel VBA:名前に基づいてチェックボックスをループする方法

変数 "aRow"は各質問の回答数です。 "lastAns"は最後の回答の行番号です。回答の数に応じて、いくつかのチェックボックスが非表示になります。 "CheckBox1"〜 "CheckBox4"は、チェックボックスの名前です。

次のコードは機能しますが、長すぎるため、チェックボックスをループしてその都度ラベルを変更するよりよい方法があります。私にそれを行う方法を教えてください! ありがとう!私のコメントへのフォローアップの答えとして

 `lastAns = Cells(qRow, 5).End(xlDown).Row + 1 
     aRow = lastAns - qRow 
     If aRow >= 1 Then 
      Me.CheckBox1.Visible = True 
      Me.CheckBox1.Caption = Cells(qRow, 5) 
      Else: Me.CheckBox1.Visible = False 
     End If 
     If aRow >= 2 Then 
      Me.CheckBox2.Visible = True 
      Me.CheckBox2.Caption = Cells(qRow + 1, 5) 
      Else: Me.CheckBox2.Visible = False 
      End If 
     If aRow >= 3 Then 
      Me.CheckBox3.Visible = True 
      Me.CheckBox3.Caption = Cells(qRow + 2, 5) 
      Else: Me.CheckBox3.Visible = False 
      End If 
     If aRow >= 4 Then 
      Me.CheckBox4.Visible = True 
      Me.CheckBox4.Caption = Cells(qRow + 3, 5) 
      Else: Me.CheckBox4.Visible = False 
      End If 
       .....SAME CODE CONTINUES TILL 7...` 
+0

作業するコードは[コードレビュー](HTTPSに掲載する必要があります:// codereview.stackexchange.com/)。 AFAIKでは、コントロールの名前を文字列として作成し、コントロールコレクションのキーとして渡す必要があります。 –

答えて

1

、ここで私はあなたが探していると思うものです:最適化を必要としている

arow = lastAns - qRow 
    Dim i As Long, ctl As Control 
    For i = 1 To 4 
     Set ctl = Me.Controls("CheckBox" & i) 
     If i <= arow Then 
      ctl.Visible = True 
      ctl.Caption = Cells(qRow + i - 1, 5) 
     Else 
      ctl.Visible = False 
     End If 
    Next i 
関連する問題