Как установить автоматически сгенерированный переключатель в true в VBA? - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю лист Excel, в котором переключатели автоматически генерируются на основе значения определенного параметра. Пожалуйста, обратитесь к этому для ясного понимания:

Группа радиокнопок копируется n количество раз. где n - количество строк, ссылающихся на параметр.

Каждые переключатели в этой автоматически сгенерированной матрице должны быть проверены на соответствие условию, и для одной из двенадцати переключателей должно быть установлено значение True в одной группе, которая соответствует условию. Основное осложнение заключается в том, что каждая группа переключателей копируется в требуемые строки в соответствии с требованием, и поэтому переключатели генерируются n * 12 раз, и я не знаю, как запрограммировать каждую переключаемую кнопку, которая генерируется автоматически.

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

Я создал матрицу со следующим кодом:

    Dim n, m, i, j, x, k, a As Integer
n = (Sheets("ALLO").Range("E4").Value) * 2       
x = Sheets("ALLO").Range("E3").Value
m = (Sheets("ALLO").Range("E5").Value) + 1
a = m

For i = 2 To n Step 2                               
Sheets("Dummy_Result").Range("A2:M2").Copy Destination:=Sheets("Results").Range("A" & i)
Next i

For j = 3 To n Step 2
Sheets("Dummy_Result").Range("A3:M3").Copy Destination:=Sheets("Results").Range("A" & j)
Next j

For k = n + 1 To m Step 1
Sheets("Dummy_Result").Range("A3:M3").Copy Destination:=Sheets("Results").Range("A" & k)
Next k

End Sub

Моя обновленная программа, для автоматического создания кнопок для диапазона, зависящего от значения «m». Количество сгенерированных кнопок должно быть прямо пропорционально значению «m». Эта программа не работает, когда я использую динамический диапазон вместо фиксированного (как предложено Mr.JosephC)

Sub Test()
    Dim n, m, i, j, x, k, a As Integer
    n = (Sheets("ALLO").Range("E4").Value) * 2       'No of Tack stations
    x = Sheets("ALLO").Range("E3").Value
    m = (Sheets("ALLO").Range("E5").Value) + 1
    a = m

    For i = 2 To n Step 2                               'Correct
    Sheets("Dummy_Result").Range("A2").Copy Destination:=Sheets("Results_1").Range("A" & i)
    Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))
    Next i

    For j = 3 To n Step 2
    Sheets("Dummy_Result").Range("A3").Copy Destination:=Sheets("Results_1").Range("A" & j)
Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))

    Next j

    For k = n + 1 To m Step 1
    Sheets("Dummy_Result").Range("A3").Copy Destination:=Sheets("Results_1").Range("A" & k)
Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))
    Next k


End Sub

Private Sub AddOptionButtons(ByRef TargetRange As Range)

    Dim oCell As Range
    For Each oCell In TargetRange
        oCell.RowHeight = 20
        oCell.ColumnWidth = 6
        Dim oOptionButton As OLEObject
        Set oOptionButton = TargetRange.Worksheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Left:=oCell.Left + 1, Top:=oCell.Top + 1, Width:=15, Height:=18)
        oOptionButton.Name = "ob" & oCell.row & "_" & oCell.Column 
        'oOptionButton.Object.Caption = "Button"             oOptionButton.Object.GroupName = "grp" & oCell.Top
    Next
End Sub**strong text**

Пожалуйста, обратитесь к пустышке здесь

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Это добавит дополнительные кнопки к каждой ячейке в целевом диапазоне. Он немного изменит размеры ячеек, чтобы попытаться освободить для них достаточно места (вы можете изменить расположение кнопок выбора и размера ячеек по своему усмотрению). Он будет называть кнопки выбора с их «индексными» значениями на основе номеров строк и столбцов, в которых они установлены, т.е. ob2_4 - это кнопка выбора в строке 2, столбец 4 (D). Также будет установлено, что имя группы будет одинаковым для всех кнопок выбора в одной строке.

Sub Test()
    Call AddOptionButtons(Sheet1.Range("B5:D7"))
End Sub

Private Sub AddOptionButtons(ByRef TargetRange As Range)

    Dim oCell As Range
    For Each oCell In TargetRange
        oCell.RowHeight = 20
        oCell.ColumnWidth = 6
        Dim oOptionButton As OLEObject
        Set oOptionButton = TargetRange.Worksheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Left:=oCell.Left + 1, Top:=oCell.Top + 1, Width:=15, Height:=18)
        oOptionButton.Name = "ob" & oCell.Row & "_" & oCell.Column 'Name them to make it easier if you need to access them later
        'oOptionButton.Object.Caption = "Caption" ' If you want to add text to the buttons
        oOptionButton.Object.GroupName = "grp" & oCell.Top
    Next
End Sub

Личная заметка: Кроме того, пожалуйста, используйте значимые имена для ваших переменных. :) Единственный раз, когда вы должны использовать односимвольные переменные, это если у вас есть требования к аппаратному обеспечению, связанные с размером вашего кода.

0 голосов
/ 06 ноября 2018

Это просто то, с чего можно начать. Представьте, что у вас есть 6 опций кнопок управления формой, например:

enter image description here

Затем, если вы передадите их в массив buttons1, вы можете просмотреть их по индексу и присвоить их значение True на основе другого массива с условиями condition1:

Public Sub TestMe()

    Dim condition1 As Variant
    condition1 = Array(False, True, False, False, False, False)

    Dim buttons1 As Variant
    buttons1 = Array("Option Button 2", "Option Button 3", "Option Button 4", _
                    "Option Button 5", "Option Button 6", "Option Button 7")

    Dim cnt As Long
    For cnt = LBound(buttons1) To UBound(buttons1)
        With Worksheets(1).Shapes(buttons1(cnt)).OLEFormat
            If condition1(cnt) Then .Object.Value = True
        End With
    Next cnt

End Sub

Таким образом, после выполнения кода, поскольку второй блок в массиве condition1 равен True, выбирается Option Button 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...