2015-07-15 1 views
2

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

В качестве фона это устройство для литья под давлением. QA устанавливает номера полостей, которые работают. Эта динамическая пользовательская форма создает флажки на основе номеров полостей, которые вводятся на листе.

Option Explicit 

Private Sub UserForm_Initialize() 

Dim col   As Long 
Dim row   As Long 
Dim lcol  As Long 
Dim i   As Long 
Dim j   As Long 
Dim chkBox  As MsForms.CheckBox 
Dim l   As MsForms.Frame 
Dim t   As MsForms.Label 

Set l = Me.Controls.Add("Forms.Frame.1", "cavz", True) 
    l.Caption = "BLOCKED CAVITIES" 
    l.Height = 195 
Set t = l.Controls.Add("Forms.Label.1", "mark") 
    t.Caption = "Mark all cavities that are currently blocked:" 
    t.Width = 175 
    t.Top = 10 

col = 2 'Set your column index here 
row = 8 
lcol = 17 
j = 1 

For i = col To lcol 
Set chkBox = l.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i) 
If Worksheets("QA").Cells(row, i).Value <> "" Then 
    chkBox.Caption = Worksheets("QA").Cells(row, i).Value 
ElseIf Worksheets("QA").Cells(row, i).Value = "" Then 
    GoTo 10 
End If 
If i <= 9 Then 
    'MsgBox "i = " & i 
    chkBox.Left = 5 
    chkBox.Top = 5 + ((i - 1) * 20) 
ElseIf i > 9 Then 
    j = j + 1 
    'MsgBox "j = " & j 
    chkBox.Left = 100 
    chkBox.Top = 5 + ((j - 1) * 20) 
End If 
10 
Next i 

End Sub 

Private Sub CommandButton2_Click() 
Unload Me 
End Sub 

Private Sub CommandButton1_Click() 

Dim x As Control 
Dim cavz As MsForms.Frame 

For Each x In cavz.Controls 
If x.Value = True Then 
    If x.Value = Range("B8") Then 
     Range("B8:B14").Select 
     Selection.Interior.ColorIndex = 16 
    End If 
End If 
Next x 

End Sub 

Я начал делать одно, и каким-то образом это превратилось в мой код. Это не самый аккуратный код, но я все равно считаю себя новичком в этом. Плюс, это первый раз, когда я не смог найти ответ самостоятельно и, таким образом, впервые попросил о помощи. Таким образом, любая помощь будет принята с благодарностью!

Спасибо!

UPDATE Это здорово! Спасибо, Дон. Однако у меня есть следующий вопрос. Возможно, я слишком долго стучал головой об этом, но я не могу придумать более эффективный способ сделать это. Вот то, что я сейчас делаю:

For i = 2 To 17 
Set ctl = Controls.Item("CheckBox_" & i) 
    If ctl = True Then 
     If i = 2 Then 
      Range(Cells(j, c), Cells(m, c)).Select 
      Selection.Interior.ColorIndex = 16 
      Range(Cells(k, c), Cells(m, c)).Select 
      With Selection 
       .Merge 
       Cells(k, c) = "BLOCKED" 
       .Orientation = 90 
       .VerticalAlignment = xlCenter 
       .HorizontalAlignment = xlCenter 
      End With 
     End If 
Next i 

и т.д.

Я нахожусь в процессе написания, если я = 1 до 17, но я чувствую, что есть более эффективный способ, и я просто не могу» трещина.

+0

Я не понимаю, что вы пытаетесь сделать в последующих действиях. –

+0

Это позволит выбрать ячейки и изменить их цвет и добавить текст «БЛОКИРОВАТЬ», если они выбраны как заблокированные в пользовательской форме. Я работаю с 16 заявлениями, мне было просто любопытно, был ли лучший/более эффективный способ. –

+0

Я не вижу причины для утверждений if. Выясните, какие изменения в каждом случае и используйте ваш цикл, чтобы каждый раз устанавливать значения приращения c, m, j и k. –

ответ

0

Пронумеруйте их по имени так же, как вы их создали.

Dim ctl As Control 

For i = 2 To 17 
    Set ctl = Controls.Item("CheckBox_" & i)  
Next 'i 

Кроме того, я хотел бы создать константы уровня модуля для начальных значений седловины, lcol и т.д., и повторно использовать те, в обеих процедурах.

+0

Привет, Дон! Спасибо за это. Я только что добавил обновление к моему первоначальному вопросу и хотел посмотреть, есть ли у вас какие-либо предложения. Еще раз спасибо! –