#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
Возможно, вам придется поиграть с некоторыми значениями, в вероятных местах рядом с ними есть комментарии.