Я хотел бы установить флажки в каждой ячейке E2:E30 и F2:F30, где один флажок должен быть отмечен либо в столбце E, либо в столбце F в каждой строке.
1 ответ
В вашем случае использование Option Buttons, безусловно, является лучшим / более прагматичным решением. Если вам нужно эмулировать группу опций с помощью флажков, см. Ниже
Вариант группы
Ручной способ:
- Вставьте групповое поле (вкладка «Разработчик» -> «Вставка» -> «Элементы управления формой» -> «Групповое поле») - это прямоугольник, в который вы поместите различные кнопки выбора.
- Поместите нужные опции в прямоугольник (вкладка «Разработчик» -> «Вставка» -> «Элементы управления формой» -> «Кнопка выбора»)
- Выберите любую кнопку опции в своей группе и свяжите ее с нужной ячейкой - либо в диалоговом окне «Управление форматом» (после щелчка правой кнопкой мыши), либо просто набрав
=$E$1на панели формул.
Эта связанная ячейка теперь будет содержать номер нажатой кнопки выбора, в вашем случае это может быть 1, 2 или 3. Теперь вы можете комбинировать это с любой другой функцией, например, INDEX/OFFSET/CHOOSE .
Путь VBA
Следующая процедура помещает группу параметров рядом с каждой ячейкой:
Private Const cStrPrefix As String = "o_"
Private Const cDblHorizontalSpacing As Double = 2
Private Const cDblLabelWidth As Double = 40
Private mWS As Worksheet
Private mStrAddr As String
Private mRngLink As Range
Private mVarLabels() As Variant
Private mIntCount As Integer
Public Sub subPlaceOptionGroupsInRange(rngLinks As Range, _
intNumberOfButtons As Integer, _
ParamArray varLabels() As Variant)
Dim intOldCalcMode As Integer
Application.ScreenUpdating = False
intOldCalcMode = Application.Calculation
Application.Calculation = xlCalculationManual
'Init variables
Set mWS = rngLinks.Worksheet
mIntCount = intNumberOfButtons
mVarLabels = varLabels
For Each mRngLink In rngLinks.Cells
mStrAddr = mRngLink.Address
subDeleteOptionGroup
subPlaceOptionGroup
subPlaceOptionButtons
Next
Application.Calculation = intOldCalcMode
Application.ScreenUpdating = True
End Sub
Private Sub subDeleteOptionGroup()
Dim i As Integer
On Error Resume Next
For i = 1 To mIntCount
mWS.OptionButtons(cStrPrefix & mStrAddr & "_" & i).Delete
Next
mWS.GroupBoxes(cStrPrefix & mStrAddr).Delete
End Sub
Private Sub subPlaceOptionGroup()
Dim objGroupBox As GroupBox
Set objGroupBox = mWS.GroupBoxes.Add( _
mRngLink.Offset(, 1).Left, mRngLink.Top, _
(mIntCount + 2) * cDblHorizontalSpacing + _
mIntCount * cDblLabelWidth, _
mRngLink.Height)
With objGroupBox
.Characters.Text = ""
.Name = cStrPrefix & mStrAddr
.Display3DShading = True
End With
End Sub
Private Sub subPlaceOptionButtons()
Dim i As Integer
Dim objOptionButton As OptionButton
For i = 1 To mIntCount
Set objOptionButton = mWS.OptionButtons.Add( _
mRngLink.Offset(, 1).Left _
+ i * cDblHorizontalSpacing + (i - 1) * cDblLabelWidth, _
mRngLink.Top, cDblLabelWidth, mRngLink.Height)
With objOptionButton
.Characters.Text = mVarLabels(i - 1)
.Display3DShading = True
.Name = cStrPrefix & mStrAddr & "_" & i
.LinkedCell = mStrAddr
End With
Next
End Sub
Вы можете разместить свои кнопки выбора, запустив `subPlaceOptionGroupsInRange Sheets(" yourSheet ").Диапазон («E2:E30»), 3, "Label1", "Label2", "Label3"
Флажки
Если вы хотите, чтобы 3 флажка были связаны аналогично группе параметров, вам потребуется ячейка / столбец для каждой из трех кнопок / параметров. В примере ячейки A1, B1, C1 связаны с 3 флажками, которые принадлежат одной группе.Чтобы достичь взаимоисключающего состояния, вам нужно назначить следующий макрос каждой кнопке выбора:
Public Sub subChangeCheckbox()
Dim cb As CheckBox
Dim rngTarget As Range
Dim intCol As Integer
Set cb = ActiveSheet.CheckBoxes(Application.Caller)
Set rngTarget = ActiveSheet.Range(cb.LinkedCell)
'Prevent unchecking
If rngTarget.Value = False Then
rngTarget.Value = True
Exit Sub
End If
'Unselect previously selected checkbox
For intCol = 1 To 3
If rngTarget.Column intCol Then
ActiveSheet.Cells(rngTarget.Row, intCol).Value = False
End If
Next intCol
End Sub
