O motivo pelo qual sua solução não funciona é que o valor ActiveCell
da planilha não é alterado quando um usuário clica em um botão. Ele clica no botão, não na célula.
Existem algumas maneiras de lidar com isso. Você pode criar muitos botões e ter um sub genérico para fazer o trabalho, ou pode interceptar o evento de mudança de célula e responder a ele. O primeiro será uma experiência do usuário muito melhor, mas é mais trabalhoso para configurar inicialmente.
Método 1: Botões
Este método usa o nome do botão para executar a ação apropriada, na célula apropriada. Como uma visão geral, crie todos os seus botões e peça que cada um chame o mesmo sub VBA genérico, que por sua vez descobrirá qual botão o chamou e fará a operação apropriada.
Vamos supor que você chamará seus botões de coisas como ADD_D3
e SUB_D3
, por exemplo, para aumentar / diminuir o valor em D3.
Primeiro, crie uma sub-rotina para fazer o trabalho no VBA:
Sub AdjustValue()
Dim btnName As String
Dim targetCell As String
Dim addAmount As Integer
btnName = Application.Caller
targetCell = Mid(btnName, 5, Len(btnName))
addAmount = IIf(Left(btnName, 3) = "ADD", 1, -1)
ActiveSheet.Range(targetCell).Value = _
ActiveSheet.Range(targetCell).Value + addAmount
End Sub
Quebrando:
- Application.Caller lhe dá o nome do chamador, neste caso o nome do botão
- Retiramos o nome da célula de destino ao pular os primeiros quatro caracteres
- Descobrimos se estamos adicionando ou subtraindo com base nos três primeiros caracteres
- Usamos o nome da célula de destino para atualizar a célula da planilha
Em seguida, crie seus botões; adicione botões de controle de formulário à sua planilha para cada um dos botões + e - de que você precisa.
Para cada um, atribua a ele um nome sistemático com base na célula que ele deve segmentar, conforme descrito acima. Por exemplo, na captura de tela acima, você pode nomear os dois primeiros botões ADD_D3
e SUB_D3
.
Para renomear um botão, clique com o botão direito do mouse para selecioná-lo e, na caixa de endereço no canto superior esquerdo da planilha, sobrescreva o nome (por exemplo, Botão 1) com o novo nome:
Por fim, o acima também deve funcionar para várias planilhas, já que o subutilizador usa ActiveSheet
para acessar a célula.
Método 2: Alteração de seleção
Isso é muito mais simples de configurar, mas é um pouco hacky. Primeiro, configure sua planilha com mais e menos símbolos em cada célula, colorindo-os, no entanto, para torná-los mais parecidos com botões. Por exemplo:
Observequevocêprecisausarumaaspasimples(')paracolocarosímbolonacélulacomotexto,porexemplo,'-
e'+
(issoévisívelnabarradefórmulasnapartesuperiordoexemplo).
Emseguida,crieumaúnicarotinapararesponderaumadessascélulasselecionadas:
SubWorksheet_SelectionChange(ByValTargetAsRange)DimnumCellAsRangeIfTarget.Count<>1ThenExitSubIfTarget.Value="+" Then
Set numCell = Target.Offset(0, -1)
numCell.Select
numCell.Value = numCell.Value + 1
ElseIf Target.Value = "-" Then
Set numCell = Target.Offset(0, 1)
numCell.Select
numCell.Value = numCell.Value - 1
End If
End Sub
Quebrando:
- O nome do sub é importante - diz ao Excel para executar seu sub sempre que o usuário clicar em qualquer célula
- O parâmetro
Target
é a célula que foi clicada pelo usuário, mas também pode ser uma seleção de arrastar. Primeiro, verificamos se o tamanho é exatamente 1 e saia, se não for. - Em seguida, verificamos seu valor para um valor
+
ou-
. Note que não precisamos verificar a marca de aspas. - Em seguida, usamos o comando
Offset
para localizar a célula à esquerda ou à direita, dependendo de estarmos lidando com uma+
ou-
célula inicial - Assim que tivermos a célula numérica, nós a selecionamos primeiro e, em seguida, alteramos seu valor para cima ou para baixo
A razão pela qual selecionamos o número de célula é que ele move a seleção para fora da célula +
ou -
, para que você possa clicar nela novamente. Se você quiser trabalhar nessas células, será necessário desativar esse sub temporariamente, por exemplo, colocando uma linha Exit Sub
no topo.
Nota pequena: Worksheet_SelectionChange
é o que você usaria se estivesse trabalhando na macro da planilha:
SevocêestivertrabalhandonomóduloThisWorkbook
,convémusarosubitemdemudançadeseleçãoglobal:
PrivateSubWorkbook_SheetSelectionChange(ByValShAsObject,ByValTargetAsRange)'CodegoesinhereEndSub
Omesmocódigodevefuncionar-e,nessecaso,funcionaráemtodasasplanilhasdasuapastadetrabalho.
Exemplodeplanilhamostrandoosdoisexemplos aqui .