Notifications
Clear all

Inserir nova linha igual a superior

13 Posts
2 Usuários
0 Reactions
2,566 Visualizações
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Boa tarde.

Pesquisei bastante e não encontri nenhum tópico a respeito.

Na minha planilha, numa parte dela com umas 10 linhas, preciso criar um botão ao final de cada uma dessas linhas, que ao ser clicado adiciona uma uma cópia dessa linha logo abaixo.
Consigo fazer isso facilmente na primeira linha. O problema das seguintes é que ao adicionar uma linha a mais na primeira, isso altera o numero das linhas seguintes.

Espero que tenha conseguido me explicar.

Agradeço qualquer ajuda.

 
Postado : 07/11/2019 4:09 pm
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Obrigado pela resposta.
Nao estou sabendo explicar muito bem.
Em uma única planilha com apenas uma aba, quero criar um botão na linha 12, por exemplo, que ao ser clicado, duplique a linha 12. Outro botão na linha 13 que duplique a linha 13. Outro na linha 16 duplicando essa mesma linha.
O maior problema é que ao duplicar a linha 12, a linha que era 13 agora ja é 14.
Espero que tenha conseguido me explicar e agradeço muito a ajuda.

 
Postado : 09/11/2019 12:13 pm
(@dahansen22)
Posts: 0
New Member
Topic starter
 

... Não vou, necessariamente duplicar as linhas nessa ordem. As vezes quero duplicar somente a linha 13 e de pois a 12. Pode ser que eu precise duplicar uma linha duas ou tres vezes. Para isso, queria clicar varias vezes no botão.

 
Postado : 09/11/2019 12:19 pm
(@coutinho)
Posts: 0
New Member
 

dahansen22, eu fiquei um pouco confuso, o ideal seria postar um modelo em algum drive virtual e colocando o link aqui, exemplificando o que pretende, a resposta seria mais precisa.
Em vez de usar um botão para cada linha, poderiámos utilizar somente uma rotina onde abriria um form ou caixa de mensagem para se digitar a linha e qtas vezes quer replicar, ou ainda o evento da sheet (Worksheet_BeforeDoubleClick) inde apos o duplo clique duplicasse as linhas.

[]s

Mauro Coutinho

 
Postado : 13/11/2019 7:52 am
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Boa tarde.
Novamente, obrigado pelas respostas.
Segue o link com a planilha: https://drive.google.com/file/d/1_WA_7m ... sp=sharing
Acho que vai ficar bem claro agora.
Ainda não consegui achar uma solução.

 
Postado : 13/11/2019 3:18 pm
(@coutinho)
Posts: 0
New Member
 

dahansen22
Com o exemplo já é meio caminho andado, só que vocêr não colocou qual a rotina está utizando qdo diz que consegue fazer isso na primeira linha, tambem não detalhou o que pretende, tipo :
"adiciona uma cópia dessa linha logo abaixo"
"duplique a linha 12. Outro botão na linha 13 que duplique a linha 13. Outro na linha 16 duplicando essa mesma linha"

Então, se entendi corretamente, você quer adicionar uma nova linha entre as Linhas 10 a 23, mas o que fiquei em duvida é :
* Ao adicionar uma linha tem de manter a qde de linhas conforme está no exemplo - 14 linhas ou pode deslocar alterando a qde de linhas ?
* adicionar uma cópia - seria cópia com o Produto ja digitado ou cópia somente da linha com as formulas e o campo Produto em branco ?

Procure detahar melhor, asim ficará mais fácil ajudar evitando ficarmos por suposições.

[]s
Mauro Coutinho

 
Postado : 14/11/2019 7:17 am
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Bom dia.
Respondendo as suas perguntas, Mauro Coutinho.
"* Ao adicionar uma linha tem de manter a qde de linhas conforme está no exemplo - 14 linhas ou pode deslocar alterando a qde de linhas ?"
Pode e deve deslocar alterando a quantidade de linhas, pois tem que manter todas as que já estão na planilha.

"* adicionar uma cópia - seria cópia com o Produto ja digitado ou cópia somente da linha com as formulas e o campo Produto em branco ?"
Seria um cópia da linha como ela esstá hoje na planilha, com as formulas e o comentário.

Essa planilha faz orçamentos de cozinhas. O que acontece é que, por exemplo na linha 11 eu tenho o item "Balcão Pía - prof. 0,59". As vezes vai existir mais de um balcão e com medida diferente. Daí a necessidade de se ter mais uma linha inserida logo abaixo, com as mesmas configurações dessa. Essa nova linha vai estar na linha 12, deslocando todas as seguntes. A que antes era 12, agora vai ser 13, a que era 13 agora vai ser 14, e assim por diante.

Pode acontecer de a cozinha ter mais de um "Aereo Pia - prof. 0,45", que hoje está na linha 20. Porém se eu ja tiver duplicado a linha 11 "Balcão Pia - prof. 0,59", o aereo estará na linha 21. Tendo mais de um AEREO, vou querer duplicar também esta linha.

Pode ser que eu tenha que duplicar varias linhas e até todas, e algumas mais de uma vez, por exemplo se tiver 4 AEREOS vou precisar de 4 linhas com a especificação do AEREO. Por isso pensei em colocar um botão em cada linha para que, ao clicar nesse botão, a linha onde está o botão se duplique.

Você pergunta qual a rotina que eu usei na primeira linha, foi uma macro com uma sequencia de ações, mas isso não funciona para as demais, justamente porque inserindo uma nova linha, as seguintes alteram a posição.

Obrigado pela ajuda e espero ter conseguido me explicar agora.

Andre (dahansen22)

 
Postado : 16/11/2019 7:33 am
(@coutinho)
Posts: 0
New Member
 

Andre, veja se entendi corretamente.
Na aba clique com o botão direito / Exibir Código e cole a rotina abaixo.

Conforme o que eu havia sugerido, em vez de ficarmos add botões e deixar o arquivo maior, utilizei o Evento "BeforeDoubleClick" da aba, assim a rotina será executada após dar dublo click na celula, deixei limitado a partir da linha 10, mas podemos limitar por colunas tambem, vai depender do que definir.

Faça os testes e qq duvida retorne.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim sLin As Double
    Dim sLinNew
    
    'Se menor que a 10 linha sai da rotina
    If Target.Row < 10 Then
        Exit Sub
    End If
    
        Application.ScreenUpdating = False
        
        'Informe qde de linhas a inserir e copiar
        sLin = InputBox("Informe a Qde de Linhas a Copiar", "Qde de linhas a inserir")
    
    'Realiza o Lop e insere e copia a linha de acordo com a qde informada
    For sLinNew = 1 To sLin
        
        With Target.Worksheet
            .Rows(Target.Row + sLinNew).Insert (xlDown)
            Target.EntireRow.Copy
           
            With .Range("A" & Target.Row + sLinNew)
                .PasteSpecial xlPasteFormats
                .PasteSpecial xlPasteFormulas
            End With
        End With
        
    Next sLinNew

    Application.CutCopyMode = False
    Cancel = True

    Target.Activate
    Application.ScreenUpdating = True
    
End Sub

[]s
Mauro Coutinho

 
Postado : 18/11/2019 9:40 am
(@dahansen22)
Posts: 0
New Member
Topic starter
 

...mais duas considerações, Mauro Coutinho, sobre a tua rotina.
Testei com umas pessoas aqui. Para inserir a medida normal na planilha, elas deram um duplo click na celula específica que fica no mesmo internalo da tua rotina. E lógicamente ficaram perdidas quando abriu a janela pedindo o numero de linhas duplicar. Pior, uma digitou um numero gigante e ai vc já viu o que aconteceu.
Outra questão é que não funciona com a planilha protegida.

Pensei se é possível aplicar essa tua rotina para apenas uma celula de cada linha ao invés da linha inteira. Isso é possível?

Obrigado.

 
Postado : 18/11/2019 12:52 pm
(@coutinho)
Posts: 0
New Member
 

Editado, corrigido a rotina

Andre, desculpe, meio corrido aqui, mas vamos lá.

Copie a rotina abaixo para um modulo, e depois clique como o botão direito em cada Botão da planilha e escolha Atribuir Macro e selecione essa.
Não sei o porque, mas baixei o seu modelo 3 vezes e não aparece nenhuma celula com comentários, mas com essa rotina é para copiar tudo.
Como não citou se vai utilizar senha para a proteção definida na rotina, eu deixei duas opções, uma com a proteção padrão do excel, senha em branco e outra, nas linhas que estão desabilitadas se definir a senha na propria rotina, se for utilizar essa opção, habilite as linhas e exclua as outras.

Ressaltando, que na cópia, os Botões já veem com a macro ATRIBUIDA, não precisa fazer a atribuição manual.

Sub AdicionaCopiaLinha()
    Dim ws As Worksheet
    Dim chkBT As Button
    Dim lRow As Long
    Dim rngD As Range

Dim pwd1 As String 'Definimos a Variável para a Senha de Proteção
pwd1 = "Teste" 'Senha de Proteção - Altere pra a que pretende
   
    Set ws = ActiveSheet
   
    With ws
        'Desprotege a planilha com a senha padrão em branco
        .Unprotect Password:=pwd1 'Desprotege a planilha com a senha definida
        
        'Setamos o Controle Activex
        Set chkBT = ws.Buttons(Application.Caller)
            
            'Capturamos a linha em que esta o Botão
            lRow = chkBT.TopLeftCell.Row
           
        'Definimos o Range
        Set rngD = ws.Rows(lRow)
            rngD.Copy 'Copia
            rngD.Insert Shift:=xlDown 'Insere abaixo
           
            'Seleciona a primeira celula da nova linha
            Cells(lRow + 1, 1).Select
       
        Application.CutCopyMode = False
       
        'Protege a planilha
        .Protect Password:=pwd1 'Protege com a Senha Definida
    End With
   
End Sub

Faça os testes e qq duvida retorne, que assim que der um tempinho eu dou uma olhada, ou algum colega ajuda.

[]s
Mauro Coutinho

 
Postado : 19/11/2019 2:52 pm
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Mauro Coutinho.
Mais uma vez obrigado. Fiz o que vc falou. Criei o modulo, copiei a rotina para ele e depois atribui a macro ao botão. Porem está dando erro na seguinte linha: lRow = chkBT.TopLeftCell.Row
Ah, respondendo a sua pergunta, pretendo utilizar senha para a proteção.

Abraço

Andre

 
Postado : 19/11/2019 4:25 pm
(@coutinho)
Posts: 0
New Member
 

Mauro Coutinho.
Mais uma vez obrigado. Fiz o que vc falou. Criei o modulo, copiei a rotina para ele e depois atribui a macro ao botão. Porem está dando erro na seguinte linha: lRow = chkBT.TopLeftCell.Row
Ah, respondendo a sua pergunta, pretendo utilizar senha para a proteção.

Abraço

Andre

Andre, me desculpa, na pressa ao limpar e indentar as linhas acabei suprimindo uma instrução, editei a postagem e arrumei a rotina, agora está correta, faça os testes.

Como disse que vai utilizar Senha, eu deixei a mesma como "Teste" ajuste para a qual voce quer na linha:
pwd1 = "Teste" 'Senha de Proteção - Altere pra a que pretende

Qualquer duvida retorne.

[]s Mauro Coutinho

 
Postado : 19/11/2019 8:40 pm
(@dahansen22)
Posts: 0
New Member
Topic starter
 

Muito Bom, Mauro Coutinho. Era exatamente isso que eu queria. Vc me ajudou muito e aprendi uma coisa nova. Muito obrigado.

Sabe que provisóriamente eu tinha acrescentado as linhas e ocultei. Criei um botão para reexibir e ocultar novamente. Foi uma solução provisória. Mas o que vc fez era exatamente o que eu queria.

Obrigado novamente.

Depois vou ver como encerra esse tópico.

Abraço

 
Postado : 21/11/2019 3:55 pm