Я пытаюсь использовать динамически созданный пользовательский формат и основываясь на том, какие ящики проверяют, выделяют определенные ячейки.Как пропустить флажки на динамически созданной пользовательской форме?
В качестве фона это устройство для литья под давлением. 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, но я чувствую, что есть более эффективный способ, и я просто не могу» трещина.
Я не понимаю, что вы пытаетесь сделать в последующих действиях. –
Это позволит выбрать ячейки и изменить их цвет и добавить текст «БЛОКИРОВАТЬ», если они выбраны как заблокированные в пользовательской форме. Я работаю с 16 заявлениями, мне было просто любопытно, был ли лучший/более эффективный способ. –
Я не вижу причины для утверждений if. Выясните, какие изменения в каждом случае и используйте ваш цикл, чтобы каждый раз устанавливать значения приращения c, m, j и k. –