Private Sub UserForm_Activate()
If ActiveSheet.Range("AK4").Value = 0 Then
CXBTN1.Value = False
ElseIf ActiveSheet.Range("AK4").Value = "FALSE" Then
CXBTN1.Value = False
Else
CXBTN1.Value = True
End If
'CheckBox
If ActiveSheet.Range("AL4").Value = 0 Then
CXBTN2.Value = False
ElseIf ActiveSheet.Range("AL4").Value = "FALSE" Then
CXBTN2.Value = False
Else
CXBTN2.Value = True
End If
End Sub
Есть ли способ пройти через это? Я делаю это вручную. Кажется, я не могу найти цикл для этого.
Кажется, нет никакой ошибки. но сделать это с 84 отдельными кнопками займет слишком много времени. а кодов слишком много и большая погрешность.
Тогда я не могу понять ничего, связанного с вашей настоящей проблемой. Пожалуйста, отредактируйте наш вопрос и лучше объясните, чего вы хотите. Вам нужно предоставить логику, основанную на том, что делает код более компактным. Я имею в виду, если таких кнопок 84 и нужно использовать для первой "Ак4", для следующей "АЛ4", для следующей "АМ4", "АН4" и так далее - это то, за чем надо следить и ставить на месте. Тогда что вы пытаетесь сделать с помощью кнопки CXBTN1.Value = True
?
Так:
celladdrs = Array("AK4", "AL4") 'extend as needed
ctls= Array(CXBTN1, CXBTN2)
for i = 0 to 1
addr = celladdrs(i)
' Use "Set" for object assignment!
Set control = ctls(i)
If ActiveSheet.Range(addr).Value = 0 Then
control.Value = False
ElseIf ActiveSheet.Range(addr).Value = "FALSE" Then
control.Value = False
Else
control.Value = True
End If
Next
Это полностью решит проблему!!!!!! ваше здоровье
Рад помочь :-) Тогда не могли бы вы «принять» мой ответ? Спасибо!
Предположим, что имя всех кнопок, которые необходимо изменить, постоянно увеличивается от 1 до 85, воспользуйтесь следующим способом. Не нужно ничего помещать в массивы. Если вы добавите новую кнопку, будет достаточно изменить максимальное число, подлежащее увеличению (с 85 на 86 и т. д.):
Private Sub UserForm_Activate()
Dim i As Long, rngMatch As Range
Const btPref As String = "CXBTN"
Set rngMatch = Range("AK4")
For i = 1 To 85 'use here the number of buttons
If rngMatch.Offset(, i - 1).Value = 0 Or rngMatch.Offset(, i - 1).Value = "FALSE" Then
Me.Controls(btPref & i).Value = False
Else
Me.Controls(btPref & i).Value = True
End If
Next i
End Sub
Не проверял, но должно работать так, как вам нужно. Конечно, если именование кнопок против увеличения столбцов соответствует правилу...
Что вы подразумеваете под «сделать это вручную»? Разве приведенный выше код не делает то, что должен делать? В любом случае попробуйте использовать
UserForm_Initialize
вместоUserForm_Activate
, но это не будет решением... Вы имеете в виду, что вы показываете форму вручную и вам нужно показать ее с помощью фрагмента кода? Или что? Если он работает и не делает того, что вам нужно, уверены ли вы, что активный лист — это тот, который вам нужен? Вызывает ли это какую-либо ошибку?CXBTN2
— это кнопка? Если нет (я предположил это, глядя на его название), то что это?