Ir ao conteúdo
  • Cadastre-se

Problema com botões, que alteram na linha de cima!


Ir à solução Resolvido por Visitante,

Posts recomendados

Boa noite! Estou com problema em uma tabela, onde possui duas linhas com formatações, cálculos e também botões que alteram os valores da célula, preciso ter 100 linhas iguais a esta, o problema é que quando copio essa linha inteira e colo ela embaixo com os botões junto e toda a formatação, os botões ficam alterando os valores da linha de cima e não da linha atual, anexei o arquivo abaixo para compreender melhor! Sei que posso alterar o vínculo da célula, mas isso teria que fazer em cada botão um por um e em cada linha uma por uma, levaria uma semana inteira pra fazer isso, agradeço se alguém tiver uma luz aí, abraços!

tabela-lucasfaller.xlsx

Link para o comentário
Compartilhar em outros sites

Olá, lucas.

Se quiser experimentar esta solução utilizando macros, instale os dois códigos abaixo em um módulo comum.

O primeiro código replica uma vez a linha 4, e o segundo replica cinco vezes a linha 4. Ambos copiam as fórmulas, a formatação e os "Controles giratórios" (que você chamou de "botões"), e atribuem aos "Controles" os respectivos "Vínculos de célula".

Abaixo o link de arquivo com os códigos instalados, pronto para uso.

Sub ReplicaLinha4()  Dim s As Shape, LR As Long, k As Long   LR = Columns("A:J").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Range("A4:J4").Copy Cells(LR + 1, 1).Resize(, 10)    Rows(LR + 1).RowHeight = 25    With ActiveSheet      For k = 2 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End WithEnd SubSub Replica5Linha4()  Dim s As Shape, LR As Long, k As Long    LR = Columns("A:J").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Range("A4:J4").Copy Cells(LR + 1, 1).Resize(5, 10)    Rows(LR + 1 & ":" & LR + 6).RowHeight = 25    With ActiveSheet      For k = 14 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End WithEnd Sub

tabela-lucasfaller 2.zip

 

Link para o comentário
Compartilhar em outros sites

 

Será que existe alguma forma de excluir uma linha por um botão também?

 

O código abaixo exclui a linha 3. Associe o código a um botão.

  Você não informou o tipo do botão, então se for um botão com código próprio coloque somente a linha Rows(3).Delete

Sub ExcluiLinha3()  Rows(3).DeleteEnd Sub

 

Link para o comentário
Compartilhar em outros sites

Beleza, deu certo!

 

Mas amigo, vou te incomodar só mais uma vez, o problema é que preciso ter uma autosoma em baixo da última linha pra ter um total dos lucros, porém quando adiciono uma linha, ela vai para baixo da autosoma, e não participa da soma entende?

 

Segue arquivo com o exemplo.
 

tabela.rar

Link para o comentário
Compartilhar em outros sites

 

Mas amigo ... o problema é que preciso ter uma autosoma em baixo da última linha pra ter um total dos lucros, porém quando adiciono uma linha, ela vai para baixo da autosoma, e não participa da soma entende?

 

Alterei o código para ler a última linha preenchida na coluna "A" e para inserir uma linha logo abaixo dela preservando assim a sua fórmula de soma, no entanto, para incluir automaticamente na soma a nova linha inserida, substitua a sua fórmula =SOMA(J3:J5)

por esta  =SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1))

 

 

Amigo, você fez algumas alterações para pior no modelo que postei:

1. no meu modelo, que seguiu o seu primeiro, a linha matriz (linha a ser copiada) era a linha 4, você mudou para a linha 3; fiz os ajustes nos códigos abaixo

2. nos "Controles giratórios" da linha 3 deixe os campos assim (como estão no modelo que postei):

    valor atual >> coloque 0 ou deixe em branco

    vínculo da célula >> deixe em branco

    limpe as células "B3:D3"

3. você vinculou o botão "+ 5 linhas" ao código que insere 1 linha (?); se você pretende replicar somente 1 linha por vez então remova o botão citado (mantenha o código caso no futuro queira utilizá-lo)

4. no seu primeiro arquivo a sua tabela ocupava até a coluna "J", no segundo, até a "K"; fiz os ajustes nos códigos abaixo

5. no seu segundo arquivo (post #5), na linha 3, você conseguiu sobrepor os "Controles giratórios" (???), aí o código copia 6 objetos em lugar de copiar 3, pois há 2 objetos sobrepostos em "B3", mais 2 em "C3" e mais 2 em "D3" (???) acarretando erro na ação do código ao vincular as células aos objetos; para corrigir selecione com o botão direito do mouse o "Controle" que está em "B3" e delete-o,  restará o "Controle" que está por baixo do deletado, repita o procedimento em "C3" e em "D3".

Instale os dois códigos abaixo no lugar dos existentes no seu arquivo.

Sub ReplicaLinha3()  Dim s As Shape, lr As Long, k As Long   Application.ScreenUpdating = False   lr = Columns("A").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Rows(lr + 1).Insert    Range("A3:K3").Copy Cells(lr + 1, 1).Resize(, 11)    Rows(lr + 1).RowHeight = 25    With ActiveSheet      For k = 2 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End With    Application.ScreenUpdating = TrueEnd SubSub Replica5Linha3()  Dim s As Shape, lr As Long, k As Long    Application.ScreenUpdating = False    lr = Columns("A").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Rows(lr + 1 & ":" & lr + 5).Insert    Range("A3:K3").Copy Range(Cells(lr + 1, 1), Cells(lr + 5, 11))    Rows(lr + 1 & ":" & lr + 5).RowHeight = 25    With ActiveSheet      For k = 14 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End With    Application.ScreenUpdating = TrueEnd Sub
Link para o comentário
Compartilhar em outros sites

Show de bola, obrigado, ficou legal! Eu fiz uma segunda planilha que puxa alguns totais da primeira planilha pra ter um controle melhor, porém não consegui usar a soma  =SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1)) de uma planilha para outra, coloquei assim também =Fevereiro!=SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1)) e também não deu, aí fiz o cálculo na primeira planilha mesmo la na lateral, e daí na segunda planilha só puxei usando  =Fevereiro!T1 ! Se tiver alguma lógica melhor que eu possa usar, agradeço! Segue abaixo o arquivo pra você ver como ficou! Obrigado pela baita mão aí amigo!

tabela.rar

Link para o comentário
Compartilhar em outros sites

Eu fiz uma segunda planilha que puxa alguns totais da primeira planilha pra ter um controle melhor, porém não consegui usar a soma  =SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1)) de uma planilha para outra, coloquei assim também =Fevereiro!=SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1)) e também não deu, aí fiz o cálculo na primeira planilha mesmo la na lateral, e daí na segunda planilha só puxei usando  =Fevereiro!T1

Esta fórmula que passei, =SOMA(ÍNDICE(J:J;1):ÍNDICE(J:J;LIN()-1)) funciona somente na linha logo abaixo da tabela, conforme seu pedido anterior. Da forma que você fez, colocando na linha 1, a fórmula não retorna o resultado correto. Em consequência, as fórmulas da outra planilha retornam também resultado incorreto.

=ÍNDICE(Fevereiro!J:J;CORRESP(99^99;Fevereiro!J:J;1))

Coloque de volta a fórmula  =SOMA(J2:ÍNDICE(J:J;LIN()-1)) (simplificada) na linha logo abaixo da tabela e utilize na planilha "Histórico-Financeiro" a fórmula que postei acima, seguindo a mesma estrutura para as demais colunas além da coluna "J".

Link para o comentário
Compartilhar em outros sites

Brother, existe alguma forma de colocar links nas opões de uma caixa de combinação? Pois tenho ali na tabela uma caixa de combinação com os meses, eu queria que, ao clicar no mês ali na lista, fosse para a planilha referente ao mês clicado. Se tiver alguma dica agradeço, pois no google não achei nada até agora. Obrigado!

Link para o comentário
Compartilhar em outros sites

Brother, existe alguma forma de colocar links nas opões de uma caixa de combinação? Pois tenho ali na tabela uma caixa de combinação com os meses, eu queria que, ao clicar no mês ali na lista, fosse para a planilha referente ao mês clicado. Se tiver alguma dica agradeço, pois no google não achei nada até agora. Obrigado!

 

Veja se funciona. Selecione o objeto Combo com o botão direito. O nome dele irá aparecer na "Caixa de nome", que fica logo acima da letra "A" que identifica a primeira coluna da planilha. Coloque o nome correto da Combo no código abaixo no lugar de "Drop-Down 1". Ainda com o objeto selecionado, no menu suspenso escolha "Atribuir macro..." e na nova janela clique em "Novo", em seguida vai se abrir o editor de VBA com um código parecido com este:

Sub Dropdown1_Alteração()End Sub

em seguida acrescente as 3 linhas abaixo, o código vai ficar assim:

Sub Dropdown1_Alteração()  With ActiveSheet.Shapes("Drop-Down 1")       Sheets(.ControlFormat.List(.ControlFormat.ListIndex)).Select  End WithEnd Sub

A planilha cujo nome for selecionado na Combo será ativada.

 

Link para o comentário
Compartilhar em outros sites

Funcionou sim, só que tem um detalhe, estando na planilha JANEIRO, e selecionar no combo FEVEREIRO, ele te manda pra planilha FEVEREIRO, porém la na planilha JANEIRO, o combo fica selecionado FEVEREIRO. Se tiver como não deixar gravado o valor do combo na planilha anterior, fica melhor, se não, nem esquenta muito com isso, já ta bom assim a tabela! Segue abaixo o arquivo. 

tabela.rar

Link para o comentário
Compartilhar em outros sites

Bah...tchê... tua tabela tá trilegal...bah...

 

Acrescentei um comando para limpar a seleção.

Sub Dropdown1_Alteração()  With ActiveSheet.Shapes("Drop-Down 1")    Sheets(.ControlFormat.List(.ControlFormat.ListIndex)).Select    .ControlFormat.Value = False 'limpa a seleção  End WithEnd Sub

 

Link para o comentário
Compartilhar em outros sites

Deu certo! Vou aproveitar o elogio e te perguntar mais uma coisa, kkkkkkkk..

 

Tem como eu colocar o  resultado de uma subtração dentro dessa fórmula =SE((D6-E6)<1;"FAZER PEDIDO";"EM ESTOQUE") ?
Ficaria mais ou menos assim: =SE((D6-E6)<1;"FAZER PEDIDO";D6-E6"EM ESTOQUE") mas há alguma coisa errada pois o excel não aceita!

O objetivo seria: SE O ESTOQUE FOR MENOR QUE 1 ENTÃO MOSTRA A MENSAGEM "FAZER PEDIDO", SE NÃO, MOSTRA A QUANTIDADE QUE HÁ EM ESTOQUE E A MENSAGEM DO LADO, POR EXEMPLO: 1 EM ESTOQUE

 

Assim poderei excluir a coluna ESTOQUE, pois tenho que adicionar outros dados. Segue em anexo a tabela.

 

Obrigado amigo!

 

tabela.rar

Link para o comentário
Compartilhar em outros sites

Cara, não sei se fui eu que fiz ***** ou bugo minha tabela, adicionei mais 2 colunas com controle giratório, e agora simplesmente os outros 3 do começo não funcionam mais, não adianta copia e cola, não adianta faze tudo de novo e nem coloca controles novos, to desde ontem de manhã tentando descobri o que ta acontecendo! Se poder dar uma olhada pra mim, eu agradeço! 

tabela.rar

Link para o comentário
Compartilhar em outros sites

  • Solução

É preciso deletar os "Controles" duplicados em "D6:E6" e em "G6".
Depois, substitua os códigos existentes pelos códigos abaixo, que já estão ajustados para a nova estrutura da sua planilha.
 

Sub ReplicaLinha3()  Dim s As Shape, lr As Long, k As Long   Application.ScreenUpdating = False   lr = Columns("B").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Rows(lr + 1).Insert    Range("B6:O6").Copy Cells(lr + 1, 2).Resize(, 14)    Rows(lr + 1).RowHeight = 25    With ActiveSheet      For k = 4 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End With    Application.ScreenUpdating = TrueEnd SubSub Replica5Linha3()  Dim s As Shape, lr As Long, k As Long    Application.ScreenUpdating = False    lr = Columns("B").Find("*", SearchDirection:=xlPrevious, _      SearchOrder:=xlByRows, LookIn:=xlValues).Row    Rows(lr + 1 & ":" & lr + 5).Insert    Range("B6:O6").Copy Range(Cells(lr + 1, 2), Cells(lr + 5, 15))    Rows(lr + 1 & ":" & lr + 5).RowHeight = 25    With ActiveSheet      For k = 24 To 0 Step -1        With .Spinners(ActiveSheet.Spinners.Count - k)          .LinkedCell = .TopLeftCell.Address        End With      Next k    End With    Application.ScreenUpdating = TrueEnd Sub


 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...