2017-10-27 22 views
1

私は、表示されている特定のワークシートにある列の数に基づいてExcelユーザーフォームで可変数のコントロール(コンボボックス)を作成しようとしています。理想的には、既存のものを削除して、実行時に新しいものを作成したいと思います.100を作成して、目に見えるものと目に見えないものの間を行き来するだけです。私は現時点でコンボボックスとループを作成しますが、作成するのは1だけです。コンボボックスが上書きされているように見え、作成された最後のコンボボックスで終了します。実行時に同じuserformにすべてを得るための提案はありますか?実行時にコントロールを動的に作成する方法

Private Sub CommandButton1_Click() 
Dim cCont As New Control 

Dim ws As Worksheet 
Dim lc As Long 
Dim i As Long 

Set ws = Loan_Data 

lc = Loan_Data.Cells(1, Columns.Count).End(xlToLeft).Column 


For i = 1 To lc 
    Set cCont = Me.Controls.Add("Forms.CommandButton.1", "NewCombo" & i) 
    With cCont 
     .Caption = cCont.Name 
     .AutoSize = True 
     .Visible = True 
    End With 
Next i 

End Subの

+2

コントロールのスタックをすべて同じ位置に作成しているのではなく、その上に最後のコントロールを作成するだけではないですか? –

+1

ボタンを作成しているように見えますが、ボタン同士を重ねて作成しています。したがって、それは1つを作成するだけであるように見せます。あなたは作成後に場所を更新する必要があります – Maldred

+0

よく私はダム感じる。ありがとうございます –

答えて

2

私はあなたと私は、実行時にいくつかのコンボボックスを作成するために使用する手順の例を共有することができます。

Private Sub Agrega_Combo(Unidades As Integer) 
'Procedimiento para agregar los ComboBox, etiquetas y unidades a la lista. 
    Dim i, j As Integer 
    Dim Cmb As Control 
    Dim Lbl As Control 

    'Ciclo para crear los ComboBox y Etiquetas en el 'ArrUnidades' 
    For i = 1 To UBound(ArrUnidades) 
    'Agrega el ComboBox 
     Set Cmb = Me.Controls.Add("Forms.combobox.1") 
     'Se establece el nombre y la posición del nuevo ComboBox 
     With Cmb 
      .Name = "Combobox" & i 
      .Left = 66 
      .Width = 36 
      If i = 1 Then 
       .Top = 34 
      Else 
       .Top = 34 + (24 * (i - 1)) 
      End If 
     End With 
    'Agrega la Etiqueta' 
     Set Lbl = Me.Controls.Add("Forms.label.1") 
     With Lbl 
      .Name = "Label" & i 
      .Caption = ArrUnidades(i) & " :" 
      .Left = 30 
      .Width = 36 
      If i = 1 Then 
       .Top = 38 
      Else 
       .Top = 38 + (24 * (i - 1)) 
      End If 
     End With 
     'Ciclo para agregar las unidades indicadas al llamar el procedimiento. 
     For j = 1 To Unidades 
      Me.Controls("ComboBox" & i).AddItem j 
     Next j 
     'Selecciona el primer valor de la lista. 
     Me.Controls("ComboBox" & i).Text = Me.Controls("ComboBox" & i).List(0) 
    Next i 
End Sub 

希望します。

+1

プロシージャが終了すると 'Cmb'が有効範囲外になります。つまり、必要に応じてイベントを処理できないことに注意してください。動的コントロールでイベント(例: 'Click'、' Change'など)を処理する必要がある場合は、それらをクラスでラップし、 'WithEvents'プライベートフィールドを持ち、これらのオブジェクトを保持する方法が必要ですフォームインスタンスレベルでの参照 - フォームの[** default instance **](https://rubberduckvba.wordpress.com/2017/10/25/userform1-show/)からすべての操作を行っている場合は、 *はうまくいかないでしょう。 –

1

数学を少しすれば、それは完全に動的になることができます。コントロールを配置するフレームを使用します。これで、フレームに対する相対座標が得られました。 "y_offset"と "lineheight"変数と "x_offset"変数と "linewidth"変数を使用し、計算された位置(左上)でコントロールを作成します。作成中にオフセット+(lines * lineheight)をカウントし、結果に応じてフレームScrollHeight(および/またはScrollWidth)を設定します。

ときどきそうしました。非常にうまく動作します。

関連する問題