Notifications
Clear all

INSERIR LINHA COM MACRO

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

Senhores , bom dia !

Afim de facilitar , e deixa o projeto mais profissional utilizo a macro para inserir linha , que segue a baixo :

Private Sub inserirlinha_Click()
'Selecione a linha antes de executar
ActiveSheet.Unprotect
With Selection.EntireRow

.Copy
.Insert
End With
Application.CutCopyMode = False
Unload Me
ActiveSheet.Protect
End Sub

Essa macro já segue um padrão legal , pois a mesma adiciona a linha e já copia as formulas .Porém tenho sempre que deixa uma linha em branco pra quando add uma linha a linha adicionar em branco . té aqui tudo bem .

A dúvida é ! :
Teria como adicionar algo nessa macro para que quando a macro for rodada mesmo que seja em cima de uma linha que ja tenha uma escrita a mesma ser adicioanada em branco mais lembrando que as formulas tem de permanecer na linha adicionada .
Obs : essa macro acima ja mim serve e inclusive uso a muito tempo , mas porem caso adiciono em de uma linha que tenha uma escrita tenho de apagar os dados .
No aguardo !

 
Postado : 21/07/2015 3:57 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

marcio, a questão é um pouco confusa, pela sua rotina verifica-se que provavelmente trata de um botão em um formulário, e na segunda linha você utiliza "With Selection.EntireRow", ou seja, com certeza temos uma instrução antes que vai nos leva a linha mencionada acima. Se a intenção é adicionar uma linha em outro ponto podemos contar as linhas e escolher em qual adicionar, e quanto a adicionar uma linha em branco, é só utilizar o Insert sem o Copy, mas se quer manter as formulas, então não estariamos add linha em branco.
Detalhe melhor o que pretende ou anexe um modelo para um melhor entendimento.

[]s

 
Postado : 21/07/2015 5:25 am
(@marciobin)
Posts: 0
New Member
Topic starter
 

Bom dia ,
Segue modelo .

 
Postado : 21/07/2015 6:29 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

marcio, pelo que entendi, você quer somente inserir uma linha em branco e copiar somente a formula que está na coluna "D", se for isto, troque a rotina do botão de confirmação pela abaixo :

Private Sub inserirlinha_Click()
'Selecione a linha antes de executar
   ActiveSheet.Unprotect
    
    With Selection.EntireRow
        'Inserimos uma linha primeiro
        .Insert
        
        'Com o Copy Destination
        'copiamos direto sem precisar utilizar Copy - Paste
        Selection.Offset(-1, 3).Copy Destination:=Selection.Offset(0, 3)
    End With

    Unload Me
    
    ActiveSheet.Protect
    
End Sub

Faça os testes e veja se é isto.

[]s

 
Postado : 22/07/2015 6:42 am
(@marciobin)
Posts: 0
New Member
Topic starter
 

Bom dia
Mauro , exatamente isto .

somente uma duvida :
caso eu seleciono a primeira linha abaixo da linha congelada , a macro nao adiciona , com a primeira linha selecionada ela vai reconhecer a linha congelada e vai adcionar a linha congelada.
mas caso nao tenha jeito ficou muito bom . excelente .

DA UMA OLHADA E FAZ O TESTE SO PRA VC ENTENDER MELHOR

GRATO !

 
Postado : 22/07/2015 8:21 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

marcio, eu havia feito rapidinho e não testei no seu modelo, desta forma para considerarmos a primeira linha que no caso é a 6, colocamos condições de verificação, tente esta abaixo.

Private Sub inserirlinha_Click()
    Dim sLinAtiva  As Long
    Dim sRowOrigem, sRowDestino

'Selecione a linha antes de executar
   ActiveSheet.Unprotect
    
    'Armazena a linha selecionada
    sLinAtiva = Selection.Row
    
    'Verifica se estamos na linha 6 que é a primeira apos os rotulos
    'Define as variaveis de acordo com a linha selecionada
    If sLinAtiva = 6 Then
        sRowOrigem = 1
        sRowDestino = 0
    Else
        sRowOrigem = -1
        sRowDestino = 0
    End If

    With Selection.EntireRow
        .Insert
        Selection.Offset(sRowOrigem, 3).Copy Destination:=Selection.Offset(sRowDestino, 3)
    End With

    Unload Me
    
    ActiveSheet.Protect
    
End Sub

Lembre-se, se as dicas estão sendo satisfatória, favor clicar na mãozinha agardecendo.

[]s

 
Postado : 22/07/2015 8:27 am
(@marciobin)
Posts: 0
New Member
Topic starter
 

Mauro , muito obrigado pela força ,

mas pra nao ficar encomodando muito vou ficar com a penultima mesmo ,
pois o unico poblema ou talvez nem poblema seja , é so eu nao usar a primeira linha .
O resto que eu precisava deu certinho .

OBS : A ULTIMA ADAPTAÇAO ESTA APAGANDO A FORMULA E ESTA ADICIONANDO A LINHA CONGELADA ,
a penultima ja esta otimo , pois tinha 3 anos pesquisando no google e nao conseguia . MUITO GRATO!

 
Postado : 22/07/2015 10:11 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

marcio, tirei a condição de Resolvido, se deixar logo trancam o tópico, e não se preocupe com incomodar, enquanto não tiver uma solução que atenda 100 % pode deixa-lo em aberto.

Quanto suas obs, o congelamento se deve devido a formatação da celula estar como bloqueada, isto é simples de resolver, só não entendi quando disse que está apagando a formula, apos a execução desprotegi a aba e a formula está lá, de qual formula está falando.
Vou fazer os ajustes da formatação e depois retorno.

[]s

 
Postado : 22/07/2015 10:37 am
(@marciobin)
Posts: 0
New Member
Topic starter
 

BOM ,
O procedimento que vou colocar no botao de comando sera o mesmo ??

ou tenho de usar Option Explicit para as

Dim sLinAtiva As Long
Dim sRowOrigem, sRowDestino ???

nao consegui , mas tudo bem .

obs: deveria ter colocado o dia que fiz o topico :
como faço pra mim ta definindo outra coluna , pois , o trabalho que vou usar essa macro , uso duas colunas , sendo uma para RESULTADOS DE JUROS , e outra para SITUAÇAO , que no caso é uma formula que compara a data atual com a data do pagamento e mim retorna "FINALIZADO".

MAS NAO PREUCUPE COM ESSA ai , v o que podes fazer com a primeira situaçao postada .

obrigado !

 
Postado : 22/07/2015 10:53 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

marcio, eu me basiei pelo modelo que anexou, se for colocar esta rotina em outro arquivo com colunas diferentes tem de ajustar na propriedade "Offset" :
Selection.Offset(sRowOrigem, 3).Copy Destination:=Selection.Offset(sRowDestino, 3) - onde as Variaveis sRow representam a linha e o numero depois da virgula a Coluna, ou seja o deslocamento.

Exemplificando :
Selection.Offset(0, 3).Select - o" 0 e o 3" representam (Linha.Coluna) supondo que a seleção está em A6 será selecionado D6 a terceira celula apos A3

Selection.Offset(1, 3).Select - supondo que a seleção está em A6 será selecionado D7 a terceira celula apos A3 uma linha abaixo
pesquise sobre offset na propria ajuda do VBA para entender melhor como funciona ou no google encontrara varios links

Quanto a questão do Option Explicit, como em seu modelo ela não está não coloquei, ela serve para forçar a Declaração dos Tipos das Variáveis, então se tiver teremos de de declarar os tipos das Variáveis :
Dim sRowOrigem, sRowDestino ??? ficando
Dim sRowOrigem, sRowDestino As Long
Mas se quiser apagar os Option Explicit tambem pode.

Então pelo modelo que postou, para ajustarmos a formatação quando A6 for a celula selecionada, troque a rotina anterior por esta.

Private Sub inserirlinha_Click()
    Dim sLinAtiva  As Long
    Dim sRowOrigem, sRowDestino As Long

    'Selecione a linha antes de executar
    ActiveSheet.Unprotect
    
    'Armazena a linha selecionada
    sLinAtiva = Selection.Row
    
    'Verifica se estamos na linha 6 que é a primeira apos os rotulos
    'Define as variaveis de acordo com a linha selecionada
    If sLinAtiva = 6 Then
        sRowOrigem = 1
        sRowDestino = 0
    Else
        sRowOrigem = -1
        sRowDestino = 0
    End If

        With Selection.EntireRow
            .Insert
            Selection.Offset(sRowOrigem, 3).Copy Destination:=Selection.Offset(sRowDestino, 3)
                
                'Se for a linha 6 copiamos e colamos o formato
                If sLinAtiva = 6 Then
                    Selection.Offset(1, 0).Resize(RowSize:=1, ColumnSize:=4).Copy
                    Selection.PasteSpecial xlPasteFormats
                    Application.CutCopyMode = False
                End If
        
        End With

    Unload Me
    
    ActiveSheet.Protect
    
End Sub

[]s

 
Postado : 22/07/2015 11:39 am
(@marciobin)
Posts: 0
New Member
Topic starter
 

Boa Tarde ,
Mauro . exatamente isso agora , valeu pela força ,

Corrigindo o que eu tinha falado anteriormente , falei que tava apagando a formula , foi um erro meu , tinha mudado a formula para a coluna da frente ,
agora voltei pra coluna original e funcionou perfeitamente ,exatamente do jeito que queria .

Brigadao !

 
Postado : 22/07/2015 12:13 pm
(@marciobin)
Posts: 0
New Member
Topic starter
 

Eu de novo ,

Nao to conseguindo fazer a adaptacao

como faço por exemplo pra colocar colocar a macro para respeitar a coluna E & A COLUNA H?

DESCULPA QUALQUER COISA , POIS DEVERIA TER MENCIONADO ISSO NO COMEÇO , AGORA FICA RUIM ,FICAR PERGUNTANDO .

NO AGUARDO !

 
Postado : 22/07/2015 1:22 pm
(@marciobin)
Posts: 0
New Member
Topic starter
 

Muito obrigado,
consegui adaptar.

 
Postado : 22/07/2015 1:51 pm