botão Adicionar / Subtrair Excel VBA

4

Aqui está um exemplo do meu projeto nesta foto

Eu gosto de colecionar, então estou fazendo uma folha de inventário no Excel.

Eu quero fazer uma maneira que eu possa clicar em um botão e isso afeta a próxima célula, ou anterior

Por exemplo:

A célula C3 teria um botão Adicionar , a célula D3 teria o número de cópias que eu tenho daquele item, e a célula E3 teria um botão Subtrair . Ao clicar no botão no C3, ele adicionaria mais um ao número na célula D3. Se você clicar no botão em C1, ele subtrairia da célula D3. Parece bastante simples.

Heres as condições embora:

Eu tenho 200 itens por folha em 20 folhas (não no exemplo). Eu gostaria de alguma forma que eu poderia adicionar as macros para todos os botões sem ter que fazer uma nova macro específica para cada botão. Eu também não quero que funcione com a célula selecionada. Ele precisa afetar a célula à direita do botão de adição e a célula à esquerda do botão de subtração.

Procurei uma resposta em todos os lugares e cheguei bem perto da solução.

A coisa mais próxima que eu pude encontrar, mas não é o que eu não sou o que eu estou procurando:

 Sub AddOne()
 ActiveCell.Value = ActiveCell.Value + 1
 End Sub

 Sub SubtractOne()
 ActiveCell.Value = ActiveCell.Value - 1
 End Sub

Espero que isso faça sentido e agradeço a todos pelo seu tempo.

    
por Corkrum 23.05.2014 / 15:08

1 resposta

4

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:

  1. Application.Caller lhe dá o nome do chamador, neste caso o nome do botão
  2. Retiramos o nome da célula de destino ao pular os primeiros quatro caracteres
  3. Descobrimos se estamos adicionando ou subtraindo com base nos três primeiros caracteres
  4. 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:

  1. O nome do sub é importante - diz ao Excel para executar seu sub sempre que o usuário clicar em qualquer célula
  2. 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.
  3. Em seguida, verificamos seu valor para um valor + ou - . Note que não precisamos verificar a marca de aspas.
  4. Em seguida, usamos o comando Offset para localizar a célula à esquerda ou à direita, dependendo de estarmos lidando com uma + ou - célula inicial
  5. 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 .

    
por 23.05.2014 / 17:25