2015-01-05 2 views
1

У меня есть форма формы Excel VBA, где я пытаюсь добавить несколько флажков в соответствии с количеством элементов в данном словаре.VBA dynamic checkboxes positioning

Это работает, но каждый из моих флажков добавляется в верхний левый угол друг над другом. Как я могу разместить их так, чтобы новейший был сразу ниже предыдущего?

Вот мой соответствующий код:

With CreateObject("Scripting.Dictionary") 
'Variable Checkboxes 
Dim i As Long 
Dim chkBox As MSForms.CheckBox 
For i = 1 To .count - 1 
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i) 
    chkBox.Caption = .Keys()(i) 
    chkBox.VALUE = False 
Next i 

ответ

1

Я думаю, что одна проблема заключается в том, как вы назначаете флажок. Попробуйте использовать флажок вместо MSForms.Checkbox. Возможны дополнительные варианты, включая опцию Top:

With CreateObject("Scripting.Dictionary") 
'Variable Checkboxes 
Dim i As Long 
Dim chkBox As CheckBox 
For i = 1 To .Count - 1 
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i) 
    chkBox.Caption = .Keys()(i) 
    chkBox.Value = False 
    chkBox.Top = ...enter top location here... 

Next i 

End Sub 
+0

Спасибо! Я видел ссылки на Топ и налево и был смущен, почему у меня их не было. Я буду отмечать ваш ответ как правильно! – ale10ander

+0

На самом деле, используя этот код, я получаю несоответствие типа в строке Set chkbox. Я предполагаю, что это потому, что я добавляю Forms.Checkbox.1. Есть ли альтернативный ProgID для другого типа? – ale10ander

+0

Флажок является членом MSForms. Но дает разные варианты в зависимости от того, как он называется. Разочарование вещи в VBA, как это бывает иногда. если вы используете Dim chkBox As MSFOrms.Checkbox, он, как представляется, принимает метод .Top, даже если он не отображается в контекстном прокрутке вниз. Вам также может потребоваться включить chkBox.Visible = True, чтобы он отображался в форме. Дайте мне знать, если это решит. –

2

Вы можете управлять положение относительно их контейнера с помощью Left и Top свойств.

Таким образом, в этом случае, чтобы сложить их друг на друга, вы можете сделать что-то вроде этого:

Const Spacing As Integer = 8 ' Gap between controls. 
For i = 1 To .count - 1 
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i) 
    ' Position the new checkbox. 
    ' This assumes all will be the same size. 
    chkBox.Top = (chkBox.Height + Spacing) * (i - 1) 
    ... 
Next 

Вы, вероятно, хотите, чтобы играть с этим немного, но это следует надеяться, чтобы вы начали ,