Используйте флажок, чтобы установить строку как «переменную», затем используйте кнопку для форматирования ячейки при нажатии

#excel

Вопрос:

Я создал лист диспетчера задач в Excel, где столбец I для объявления содержит ряд шагов, которые необходимо выполнить для каждого задания, и, начиная со строки 21, последующие строки содержат разные задания.

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

Я планирую добавить кнопки опций в столбец a, и при выборе эта строка станет переменной. Затем при нажатии на кнопку ячейка будет окрашена соответствующим образом.

Я могу заставить кнопки опций работать, и я думаю, что смогу заставить работать форматирование ячеек, но я не могу понять, как сделать выбранную строку переменной, на которую я могу ссылаться в источнике, т. Е. сделать ячейку (я: «переменная») Желтый при нажатии.

Любая помощь очень ценится.

Ответ №1:

С помощью Application.Caller вы можете получить TopLeftCell кнопку выбора.

 Sub OptionBtn_Click()
    With ActiveSheet
        .Range("I" amp; .Shapes(Application.Caller).TopLeftCell.Row).Interior.Color = vbYellow
    End With
End Sub
 

Если у вас есть много кнопок для создания, вероятно, это проще автоматизировать.

 
Sub CreateOptionButtons()
    Dim lr As Long
    Dim pointsarr As Variant
    Dim grp As GroupBox
    Dim btn As OptionButton
    Dim ws As Worksheet
    Dim startrow As Long
    Dim i As Long
    
    Set ws = Worksheets("Sheet1") 'Change to your sheet name
    startrow = 21 'Change as needed
    
    With ws
        lr = .Cells(.Rows.Count, 2).End(xlUp).Row
        pointsarr = getPoints(lr, startrow, 1, ws) 'Change as needed
        Set grp = .GroupBoxes.Add(pointsarr(0), pointsarr(1), pointsarr(2), pointsarr(3)   3) 'the   3 is so the last button is grouped
        
        For i = startrow To lr
            pointsarr = getPoints(i, i, 1, ws)
            Set btn = .OptionButtons.Add(pointsarr(0), pointsarr(1), pointsarr(2), pointsarr(3))
            With btn
                .OnAction = "Module1.OptionBtn_Click" 'Change as needed
                .Caption = "Row " amp; i 
                .Name = "OptionButton" amp; i
            End With
        Next i
    End With
End Sub

Function getPoints(lastrow As Long, start As Long, col As Long, ws As Worksheet) As Variant
    Dim left As Long
    Dim top As Long
    Dim width As Long
    Dim height As Long
    Dim returnarr(3) As Long
    
    With ws
        If col = 1 Then
            left = 1
        Else
            left = .Range(.Cells(1, 1), .Cells(1, col - 1)).width
        End If
        
        If start = 1 Then
            top = 1
        Else
            top = .Range(.Cells(1, 1), .Cells(start - 1, 1)).height
        End If
        
        width = .Columns(col).width
        
        height = .Range(.Cells(start, col), .Cells(lastrow, col)).height
        
    End With
    returnarr(0) = left
    returnarr(1) = top
    returnarr(2) = width
    returnarr(3) = height
    
    getPoints = returnarr()
        
End Function
 

Возможно, вам придется поиграть с некоторыми значениями, в вероятных местах рядом с ними есть комментарии.