2015-10-19 3 views
0

У меня возникли трудности с пониманием методов кодирования VBA (у меня есть только опыт R). Я пытаюсь связать значение флажка userform с конкретной ячейкой на листе, используя VBA.Флажок/Сотовая связь с несколькими пользовательскими формами

Sub x() 
    Dim Range As Range 

    If userfrom.checkbox1.Value = True Then 
     Range.Offset(0, 7).Value = 1 
    Else 
     Range.Offset(0, 7).Value = "" 
    End If 


    If userform.checkbox2.Value = True Then 
     Range.Offset(0, 8).Value = 1 
    Else 
     Range.Offset(0, 8).Value = "" 
    End If 


    If userform.checkbox3.Value = True Then 
     Range.Offset(0, 9).Value = 1 
    Else 
     Range.Offset(0, 9).Value = "" 
    End If 

    Unload userform 

End Sub 

Я пришел через метод распределения флажков массивов, но я не в состоянии понять пример в резьбе. В идеале, я представляю себе, что это объявление массива флажков, а также массив ячеек - и связать каждый элемент в каждом массиве вместе, т. Е. CheckboxArray (1) -> cellArray (1); checkboxArray (2) -> cellArray (2); и т. д.

Мой коллега изучил мой код и сказал, что его можно улучшить, то есть завершить в одной строке.

Возможно ли это?

+3

Просто любопытно - почему бы не спросить своего коллегу для ответа тогда? – pnuts

+0

По моему мнению, его домашняя работа – Poof

+0

вы можете просто установить значение ячейки этого флажка в свойствах флажка, установив ControlSource в нужную ячейку. –

ответ

0

Вы можете просто установить ControlSource флажка в предопределенную ячейку на вашем листе и полностью удалить код.

Однако, если вам нужно, чтобы он был динамическим, на основе рабочего листа или диапазона, с которым вы работаете, вот функциональное, эффективное решение, которое не зависит от количества флажков в форме и легко обновляется.

Btw, я не знаю, если это действительно может быть завершено в одной строке. Весь целочисленный подсчет был получен из кода вашего OP.

Sub x() 

Dim c As Control 

For Each c In Controls 

    If TypeName(c) = "CheckBox" Then 

     i = Replace(c.Name, "CheckBox", "") 

     If c.Value = True Then SetRange i + 6, 1 Else: SetRange i + 6, "" 

    End If 

Next 

End Sub 

Sub SetRange(i As Integer, sVal As String) 

Dim wks As Worksheet 
Set wks = Sheets("Sheet1") 'change to your sheet 

With wks 

    .Range("A1").Offset(, i).Value = sVal 'change "A1" to desired range 

End With 

End Sub 
Смежные вопросы