No seu caso, usar os botões de opção é certamente a solução melhor / mais pragmática. Se você precisar emular um grupo de opções com caixas de seleção, veja mais abaixo
Grupo de opções
Maneira manual:
- Insira uma Caixa de grupo (guia Desenvolvedor- > Inserir- > Controles de formulário > Caixa de grupo) - este é um retângulo no qual você colocará os diferentes botões de opção
- Coloque os botões de opção que você precisa no retângulo (guia Desenvolvedor- > Inserir- > Controles de formulário > Botão de opção)
- Selecione um dos botões de opção no seu grupo e vincule-o à célula que você quer - na caixa de diálogo Controle de formato (depois do clique direito) ou simplesmente digitando
=$E$1
na barra de fórmulas.
Esta célula vinculada agora manterá o número do botão de opção pressionado; no seu caso, isso pode ser 1, 2 ou 3. Agora você pode combinar isso com qualquer outra função, por exemplo, INDEX/OFFSET/CHOOSE
.
Modo VBA
A rotina a seguir colocará um grupo de opções ao lado de cada célula:
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
Você pode colocar os botões de opção executando 'subPlaceOptionGroupsInRange Sheets ("yourSheet"). Range ("E2: E30"), 3, "Label1", "Label2", "Label3"
Caixas de seleção
Se você quiser 3 caixas de seleção vinculadas ao grupo de opções, você precisará de uma célula / coluna para cada um dos três botões / opções. Em um exemplo, as células A1, B1, C1 são vinculadas a três caixas de seleção, que pertencem a um grupo.Para alcançar o estado exclusivo mútuo, você precisará atribuir a macro a seguir a todos os botões de opção:
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