Ir ao conteúdo

Excel desejo aplicar macro excel/vba em tabela para automatizar operação


Ir à solução Resolvido por Midori,

Posts recomendados

Postado

Bom dia, pessoal. Sou novo por aqui.

 

Estou criando um relatório com informações pré-definidas para aplicar no trabalho, a fim de otimizar o tempo e agilizar as operações de elaboração do citado relatório. Para tanto estou fazendo uso de algumas macros.

 

Pois bem, gostaria de um código (acho que o mais adequado é um evento SELECTIONCHANGE) para abrir uma INPUTBOX, para inserir uma informação na célula da linha da coluna F, quando a célula da mesma linha da coluna D fosse preenchida (com qualquer dado). 


A propósito, gostaria que o código começasse na primeira linha da tabela, após o cabeçalho (no caso, D25) e fosse até a última linha da planilha criada (que pode ser qualquer uma, já que não há limite de linhas).

 

Quanto à inputbox, quero registrar apenas o número do anexo e a folha referente ao documento consultado. Tipo: inputbox("Digite nº anexo/folha:", "Digite o nº do anexo e da folha", "Digite aqui").

 

Bem, para esse caso só meio veio a opção de criar uma inputbox. Não sei se há outra alternativa melhor.

 

Para melhor compreender, vou enviar a planilha (que, diga-se, ainda está em fase de elaboração), para vocês me ajudarem.

 

Desde já, agradeço à ajuda.

Relatório de Audiências-PROJETO EM ELABORAÇÃO.rar

Postado

@Nilton Cézar Pode usar inputbox ou formulário para isso. Com um formulário poderia ter duas caixa de texto para informar o número e a página separadamente.

 

Com inputbox poderia ser algo assim.

 

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 25 And Target.Column = 4 Then
        Dim Anexo As String
        
        Anexo = InputBox("Digite o nº do anexo e da folha separados por virgula")
        
        If InStr(Anexo, ",") <> 0 Then
            Dim Numero  As String
            Dim Folha   As String
            
            Numero = Trim(Split(Anexo, ",")(0))
            Folha = Trim(Split(Anexo, ",")(1))
            Target.Offset(, 2) = "anexo " & Numero & ", fl." & Folha
        End If
    End If
End Sub

 

  • Curtir 1
Postado

Midori, fantástico! Funcionou direitinho! Parece que você leu meus pensamentos! Era exatamente isso que eu queria!

 

Muito obrigado mesmo!

 

  • Midori, APÓS inserir o número do anexo e folha (na respectiva célula da coluna F), teria como você incrementar o código para deixar a CÉLULA ANTERIOR DA MESMA LINHA SELECIONADA (coluna E). Isso facilitaria a próxima operação, na mesma linha.

 

  • Outra coisa: há situações que precisamos COLOCAR APENAS O NÚMERO DO ANEXO. Contudo, percebi que a inputbox não responde quando colocamos apenas o número do anexo.

 

Sendo assim, é possível alterar a linha de código para PERMITIR TAMBÉM A INSERÇÃO SÓ DO NÚMERO DO ANEXO, QUANDO FOR O CASO?

 

De antemão, agradeço pela atenção.

Postado

@Nilton Cézar A macro com as alterações,

 

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 25 And Target.Column = 4 Then
        Dim Anexo   As String
        Dim Numero  As String
        Dim Folha   As String
        
        Numero = "anexo "
        Folha = ", fl. "
        Anexo = Trim(InputBox( _
            "Digite o nº do anexo e da folha separados por virgula"))
        
        If Anexo <> "" Then
            If InStr(Anexo, ",") = 0 Then
                Numero = Numero & Anexo
                Folha = ""
            Else
                Numero = Numero & Trim(Split(Anexo, ",")(0))
                Folha = Folha & Trim(Split(Anexo, ",")(1))
            End If
            Target.Offset(0, 2) = Numero & Folha
            Target.Offset(0, 1).Select
        End If
    End If
End Sub

 

  • Curtir 1
Postado

Bom dia, Midori. Ótimo! Ficou perfeito!  👏👏👏👏👏👏👏👏👏👏👏

 

Midori, como você pôde ver, meu relatório foi construído com base numa tabela, pois acredito que é a melhor forma para replicar fórmulas, validação de dados, além de manter outras configurações.

 

A propósito, dentre outras, no meu projeto, tinha uma macro para INSERIR ÚLTIMA LINHA e outra para EXCLUIR ÚLTIMA LINHA na tabela.

 

  • Contudo, a macro de EXCLUIR ÚLTIMA LINHA estava deletando a primeira linha da tabela (não queria isso!)

 

  • E a macro INCLUIR ÚLTIMA LINHA  estava com comportamento confuso, mas voltou ao normal, porém estou sem confiar nela. 

 

Por isso, as exclui. Sendo assim, gostaria que elas fossem mais consistentes e confiáveis.

 

ESSE PROJETO É MUITO IMPORTANTE PARA O MEU TRABALHO. POR ISSO ESTOU TE INCOMODANDO TANTO (ESPERO QUE NÃO SE ABORREÇA!).

 

Pois bem, aproveitando o ensejo, por favor, me envie também 2 MACROS:

 

a) uma para INSERIR ÚLTIMA LINHA na tabela e

b) outra para EXCLUIR ÚLTIMA LINHA na tabela.

 

Para melhor compreensão, estou enviando novamente o arquivo.

 

Mais uma vez agradeço sua cooperação.

 

 

Relatório de Audiências-PROJETO EM ELABORAÇÃO.rar

Postado

@Nilton Cézar Como a sua tabela já está definida você pode pegar o range dela e usar ListRows para inserir e excluir,

 

Em Range coloque o nome da tabela, coloquei TabelaPensão se for outro é só editar.

 

Sub InserirLinha()
    Range("TabelaPensão").ListObject.ListRows.Add AlwaysInsert:=True
End Sub

Sub ExcluirLinha()
    Dim Linha As Long
    
    Linha = Range("TabelaPensão").Rows.Count
    
    If Linha = 1 Then
        Range("TabelaPensão").ClearContents
    Else
        Range("TabelaPensão").ListObject.ListRows(Linha).Delete
    End If
End Sub

 

  • Curtir 1
Postado

Bom dia, Midori.

 

Primeiramente, obrigado, mais uma vez, pelas macros EXCLUIR ÚLTIMA LINHA e INCLUIR ÚLTIMA LINHA, que você tão prontamente me enviou.

 

Midori, fiz alguns testes com as DUAS MACROS acima, inclusive com aquele espetacular EVENTO CHANGE (de incluir nº do anexo/folha), e tentei fazer algumas modificações, mas não consegui (sou muito leigo em VBA!).

 

Após, fiz algumas observações:

 

  • Gostaria que a macro EXCLUIR ÚLTIMA LINHA, se possível, deixasse sempre SELECIONADA a ÚLTIMA CÉLULA DA LINHA ANTERIOR (derradeira célula da coluna F), após o processo de exclusão.

 

Midori, ainda sobre a macro acima, ao que parece, o formato tabela não permite excluir a primeira linha da tabela, PORÉM gostaria, por favor, que fosse adicionada na macro EXCLUIR ÚLTIMA LINHA:

 

  • um comando para IMPEDIR a exclusão da primeira linha da tabela, com uma msgbox contendo uma mensagem, por exemplo, “Não é possível excluir esta linha”, para deixar o projeto mais interativo com o usuário.

 

Acho que, nesse caso, tem que fazer referência exata a primeira linha da tabela (ah, não sei!). Tentei incluir esse comando, na macro que você me enviou, mas não deu certo:

 

'If para proteger linha/cabeçalho. Evitar deletar a linha 25.

If lin < 25 Then

MsgBox ("Não é possível excluir esta linha.")

Exit Sub

End If

 

Midori, quanto à macro INCLUIR ÚLTIMA LINHA, gostaria que:

 

  • a macro acima deixasse sempre SELECIONADA a ÚLTIMA CÉLULA DA LINHA ADICIONADA (derradeira célula da coluna F), após o processo de inclusão.

 

OBSERVAÇÃO: apenas lembrando que a exclusão tem como limite a primeira linha da tabela, e a inserção de linha é sem limites.

 

Lembrando ainda que o projeito já enviei nas postagens anterior.

 

Midori, em relação ao EVENTO CHANGE, para não ficar muita informação nesta mensagem, deixarei para a próxima postagem.

 

Bem, espero não ter falado demais!

Postado

Bom dia, Midori.

 

Midori, COMETI UM ERRO NA MENSAGEM ANTERIOR.

 

Sendo assim, DESCONSIDERE a postagem acima.

 

Para melhor compreensão das informações, VOU ENVIAR OUTRA, a fim de evitar confusão.

 

Midori, desculpe-me o engano.

 

Postado

COMO DITO ACIMA, ESTA É A MENSAGEM QUE ESTÁ VALENDO!

 

 

Boa tarde, Midori.

 

Primeiramente, obrigado, mais uma vez, pelas macros EXCLUIR ÚLTIMA LINHA e INCLUIR ÚLTIMA LINHA, que você tão prontamente me enviou.

 

Midori, fiz alguns testes com as DUAS MACROS acima e observei o seguinte:

 

  • ➡️ Gostaria que a macro EXCLUIR ÚLTIMA LINHA, se possível, deixasse sempre SELECIONADA a PRIMEIRA CÉLULA DA LINHA (da coluna C), após o processo de exclusão.

 

Midori, ainda sobre a macro acima, ao que parece, o formato tabela não permite excluir a primeira linha da tabela, PORÉM gostaria, por favor, que fosse adicionada na macro EXCLUIR ÚLTIMA LINHA:

 

  • ➡️ Um comando para IMPEDIR a exclusão da primeira linha da tabela, com uma MSGBOX contendo uma mensagem, por exemplo, “Não é possível excluir esta linha”, para deixar o projeto mais interativo com o usuário.

 

Midori, quanto à macro INCLUIR ÚLTIMA LINHA, gostaria que:

 

  • ➡️ A macro acima deixasse sempre SELECIONADA a PRIMEIRA CÉLULA DA LINHA ADICIONADA (da coluna C), após o processo de inclusão.

 

OBSERVAÇÃO: apenas lembrando que a exclusão tem como limite a primeira linha da tabela, e a inserção de linha é sem limites.

 

Ah, já ia esquecendo! TEM COMO VOCÊ DEIXAR INFORMADO A LINHA DE CÓDIGO RESPONSÁVEL POR ESCOLHER QUAL CÉLULA SERÁ SELECIONADA, CASO EU MESMO QUEIRA FAZER MODIFICAÇÕES FUTURAS.

 

Lembrando ainda que o projeto já enviei nas postagens anterior.

 

Postado

@Nilton Cézar A primeira linha da tabela é a 25. Essa linha não deve ser excluída porque faz parte da estrutura básica da tabela (a tabela foi criada em Inserir > Tabela) e é onde tem as listas de validação. Para excluir teria que apagar também a linha 24 dos nomes das colunas e assim vai desconfigurar o que foi criado e depois teria que inserir outra tabela.

 

A linha selecionada no caso de InserirLinha é .ListObject.ListRows.Count e na exclusão é a primeira da tabela .Cells(1,1)

Sub InserirLinha()
    With Range("TabelaPensão")
        .ListObject.ListRows.Add AlwaysInsert:=True
        .Cells(.ListObject.ListRows.Count, 1).Select
    End With
End Sub

Sub ExcluirUltimaLinha()
    Dim Linha As Long
    With Range("TabelaPensão")
        Linha = .Rows.Count
    
        If Linha = 1 Then
            .ClearContents
            MsgBox "Não é possível excluir esta linha", vbExclamation
        Else
            .ListObject.ListRows(Linha).Delete
            .Cells(1, 1).Select
        End If
    End With
End Sub

 

  • Curtir 1
Postado

Midori, que bom que você voltou!

 

Meus colegas já comentaram sobre a possibilidade de este projeto ser bastante útil e célere na confecção de relatórios de audiência.

 

Sendo assim, gostaria de apresentá-lo semana que vem, pois, a contar dos estudos sobre Excel, já faz um bom tempo que estou envolvido nesse projeto.

 

Dessa forma, Midori, gostaria de intensificar mais nossas postagens, caso seja possível e você tenha tempo, é claro! Aliás, não falta muito para concluir esse trabalho.

 

A propósito, desculpe-me esse vai e vem das macros. É porque faço alguns testes e vejo a necessidade de fazer alguns ajustes.

 

Além disso, desejo que esse projeto seja agradável de manusear, como um aplicativo, e funcionando semelhantemente tal qual um app (acho, inclusive, que vou chama-lo de “Programa de Relatório de Audiência”, salvo se for sugerido outro nome mais chamativo).

 

Por fim, Midori, gostaria de ressaltar sua ajuda. Tem sido bastante útil, eficiente e valiosa.

 

 

 

 

Postado

Então, vejamos. Como disse, sempre faço alguns testes, para analisar o comportamento das macros na dinâmica da tabela.

 

A propósito, obrigado, mais uma vez, pelas ALTERAÇÕES feitas, conforme postagem anterior.

 

Pois bem, estou colocando ícones flutuantes na tabela (que vi num vídeo), as quais foram atribuídas as macros de EXCLUIR ÚLTIMA LINHA e INCLUIR ÚLTIMA LINHA, as últimas que você me enviou e as quais foram alteradas.

 

Assim, percebi que os ícones acompanham as linhas, quando são acionados, como se estivessem FUGINDO do usuário.

 

Sendo assim, diante desse fator, VOU FICAR com as macros EXCLUIR ÚLTIMA LINHA INCLUIR ÚLTIMA LINHA, que você me enviou INICIALMENTE (sexta-feira às 14:24)

 

Isso porque as macros iniciais NÃO FAZEM DESLIZAR os ícones, no momento do clique, e, por isso, acho que elas são mais adequadas. 

 

Por falar nisso, para efeito de lembrança, registro abaixo a macro EXCLUIR ÚLTIMA LINHA enviada pela primeira vez por você:

 

Sub ExcluirLinha()
    Dim Linha As Long
    
    Linha = Range("TabelaPensão").Rows.Count
    
    If Linha = 1 Then
        Range("TabelaPensão").ClearContents
    Else
        Range("TabelaPensão").ListObject.ListRows(Linha).Delete
    End If
End Sub

 

Assim, Midori, da mesma forma da postagem anterior, APENAS quanto à macro EXCLUIR ÚLTIMA LINHA, envida pela PRIMEIRA VEZ e acima destacada, gostaria que fosse adicionado:

 

  • Um comando para IMPEDIR a exclusão da primeira linha da tabela, com uma MSGBOX contendo uma mensagem, por exemplo, “Não é possível excluir esta linha.”, para deixar o projeto mais interativo com o usuário.

 

Obrigado pela preciosa colaboração e atenção.

 

Postado

@Nilton Cézar A única diferença na execução entre a última macro e a anterior é que a última vai selecionar a célula como você pediu e também mostra o Msgbox. Mas isso não devia interferir nos ícones dessa forma. Para impedir a exclusão manual da linha você pode proteger a planilha.

  • Curtir 1
Postado

Midori, na verdade, a macro alterada, a última que você me enviou, quando eu clico no ícone, ELE DÁ UM SALTO para a primeira linha, e o resto faz igual a primeira, exceto quanto à msgbox, que é justamente o que eu desejaria inserir na macro inicial. 

 

Por outro lado, eu gostei da primeira, porque, quando a gente clica, no ícone para excluir as linhas, ELE FICA PARADO ONDE ESTÁ, sem dar aquele salto, como acima mencionado.

 

Acredito que essa flexibilidade, embora discreta, deixa o manuseio do projeito mais agradável, sem surpresas.

 

Por isso, gostaria que você adicionasse, na primeira macro de EXCLUIR ÚLTIMA LINHA enviada, um comando para IMPEDIR a exclusão da primeira linha da tabela, com uma MSGBOX, como acima descrito.

 

Espero que tenha entendido.

 

 

 

 

Postado

 

13 horas atrás, Nilton Cézar disse:

gostaria que você adicionasse, na primeira macro de EXCLUIR ÚLTIMA LINHA enviada, um comando para IMPEDIR a exclusão da primeira linha da tabela, com uma MSGBOX

 

A macro de qualquer forma não ia excluir a primeira linha, como comentei acima, então só coloquei o Msgbox, veja se é assim,

 

Sub ExcluirLinha()
    Dim Linha As Long
    
    Linha = Range("TabelaPensão").Rows.Count
    
    If Linha = 1 Then
        Range("TabelaPensão").ClearContents
        MsgBox "Não é possível excluir esta linha", vbExclamation
    Else
        Range("TabelaPensão").ListObject.ListRows(Linha).Delete
    End If
End Sub

 

 

Os saltos que você se refere deve ser por causa dos Selects. Quando uma linha é inserida, automaticamente a macro seleciona a última linha em branco e quando uma é excluída seleciona a primeira linha da tabela. Fiz isso porque entendi que foi o que pediu:

 

Em 28/03/2021 às 17:23, Nilton Cézar disse:

Gostaria que a macro EXCLUIR ÚLTIMA LINHA, se possível, deixasse sempre SELECIONADA a PRIMEIRA CÉLULA

 

Em 28/03/2021 às 17:23, Nilton Cézar disse:

A macro acima deixasse sempre SELECIONADA a PRIMEIRA CÉLULA DA LINHA ADICIONADA (da coluna C), após o processo de inclusão.

 

  • Curtir 1
Postado

Bom dia, Midori.

 

É DESSE JEITO MESMO! A MACRO FICOU ÓTIMA! AQUELA MSGBOX FICOU EXCELENTE!

 

Citação

Os saltos que você se refere deve ser por causa dos Selects. Quando uma linha é inserida, automaticamente a macro seleciona a última linha em branco e quando uma é excluída seleciona a primeira linha da tabela. Fiz isso porque entendi que foi o que pediu:

 

Na verdade, considerando o disposto acima, quanto ao desfecho da exclusão de linha, minha sugestão anterior era de que, após acionar a macro de exclusão, ficasse selecionada a célula inicial da última linha em branco.

 

Mas, agora é desnecessário, porque, considerando a dinâmica da macro que insere linha, aquela que foi alterada, a macro de exclusão teria uma execução semelhante, que, diante do que foi exposto anteriormente, não seria interessante.

 

Mas, agora ficou EXCELENTE!

 

Obrigado, Midori.

 

A propósito, estou tentando enviar outra mensagem, mas não consigo. A postagem sempre mescla com a mensagem anterior.

Eu só consigo postar outra mensagem, quando a anterior é visualizada? É isso?

 

 

Postado

Midori, fiz recentemente alguns testes com o EVENTO CHANGE, enviado por você anteriormente.

 

Veja só. A tabela contém validação personalizada, com textos pré-definidos; porém eles são intencionalmente EDITÁVEIS. Isso possibilita ao usuário adaptar melhor alguma situação específica.

 

Pois bem, após inserir um texto padronizado, na célula da coluna D, a inputbox abre automaticamente, como havíamos realmente sugerido. Veja o código do evento em questão, alterado por último (Postado quinta-feira às 17:40):

 

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 25 And Target.Column = 4 Then
        Dim Anexo   As String
        Dim Numero  As String
        Dim Folha   As String
        
        Numero = "anexo "
        Folha = ", fl. "
        Anexo = Trim(InputBox( _
            "Digite o nº do anexo e da folha separados por virgula"))
        
        If Anexo <> "" Then
            If InStr(Anexo, ",") = 0 Then
                Numero = Numero & Anexo
                Folha = ""
            Else
                Numero = Numero & Trim(Split(Anexo, ",")(0))
                Folha = Folha & Trim(Split(Anexo, ",")(1))
            End If
            Target.Offset(0, 2) = Numero & Folha
            Target.Offset(0, 1).Select
        End If
    End If
End Sub

 

Contudo, observei que, sempre que fazemos edições (ou retificação da edição anteriormente feita, na célula da coluna D), abre a inputbox. Assim, percebi que é desconfortável fechar constantemente o citado pop-up sempre que fazemos modificações na célula.

 

➡️ Diante disso, Midori, gostaria, mais uma vez, que fosse feita algumas ALTERAÇÕES no EVENTO CHANGE, somente nesse sentido:

 

  • Abrir a inputbox APENAS quando fosse CLICADA/SELECIONADA a CÉLULA DA COLUNA F, onde será inserido o nº do anexo /folha, previsto no código. Em seguida, deixasse SELECIONADA a mesma CÉLULA DA COLUNA F.

 

Isso permite que o usuário tenha mais liberdade para fazer quantas edições desejar, sem ter o inconveniente de fechar seguidas vezes os pop-ups.

 

No demais, Midori, por favor, DEIXE MANTIDAS as demais linhas de código do EVENTO CHANGE acima destacado.

 

Obrigado pelas ajudas e pela compreensão.

 

 

Postado

@Nilton Cézar Para mostrar o inputbox só quando clicar na célula o evento vai ser SelectionChange,

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row >= 25 And Target.Column = 6 Then
        Dim Anexo   As String
        Dim Numero  As String
        Dim Folha   As String
        
        Numero = "anexo "
        Folha = ", fl. "
        Anexo = Trim(InputBox( _
            "Digite o nº do anexo e da folha separados por virgula"))
        
        If Anexo <> "" Then
            If InStr(Anexo, ",") = 0 Then
                Numero = Numero & Anexo
                Folha = ""
            Else
                Numero = Numero & Trim(Split(Anexo, ",")(0))
                Folha = Folha & Trim(Split(Anexo, ",")(1))
            End If
            Target = Numero & Folha
        End If
    End If
End Sub

 

  • Curtir 1
Postado

Midori, é assim mesmo! Ficou ótimo! 👏👏👏

 

Veja só. Eu estou idealizando todos os recursos para que fiquem VINCULADOS À TABELA. Ou seja, NÃO pretendo que NENHUMA ação seja executada FORA DA TABELA.

 

No caso do evento SELECTIONCHANGE, acima enviado, ele EXECUTA a inputbox mesmo FORA DA TABELA. Segue o código anterior:

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row >= 25 And Target.Column = 6 Then
        Dim Anexo   As String
        Dim Numero  As String
        Dim Folha   As String
        
        Numero = "anexo "
        Folha = ", fl. "
        Anexo = Trim(InputBox( _
            "Digite o nº do anexo e da folha separados por virgula"))
        
        If Anexo <> "" Then
            If InStr(Anexo, ",") = 0 Then
                Numero = Numero & Anexo
                Folha = ""
            Else
                Numero = Numero & Trim(Split(Anexo, ",")(0))
                Folha = Folha & Trim(Split(Anexo, ",")(1))
            End If
            Target = Numero & Folha
        End If
    End If
End Sub

 

  • Sendo assim, gostaria, Midori, se possível, incrementar o evento supra, para que o evento ocorra APENAS DENTRO DA TABELA, nos mesmos moldes do código acima enviado.

 

____________________________________________________________________________

 

 

➡️  UMA DÚVIDA: No projeto, já tinha outro evento SELECTIONCHANGE.

 

Assim, no início, deu conflito nos eventos, acusando erro de duplicidade de nome, conforme a mensagem abaixo:

 

Citação

Erro de compilação:

Nome repetido encontrado: Worksheet_SelectionChange

 

Para sanar o erro eu:

  • DELETEI o "End Sub" do PRIMEIRO evento e
  • EXCLUI a expressão: Private Sub Worksheet_SelectionChange(ByVal Target As Range) do SEGUNDO evento.

Aparentemente deu certo

 

É assim mesmo que procede para depurar o erro de repetição acima?

 

Desde já, agradeço, Midori.

Postado

@Nilton Cézar Para limitar o evento dentro da tabela o SelectionChange pode ficar assim,

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Range("TabelaPensão"), Target) Is Nothing Then
        If Target.Column = 6 Then
            Dim Anexo   As String
            Dim Numero  As String
            Dim Folha   As String
        
            Numero = "anexo "
            Folha = ", fl. "
            Anexo = Trim(InputBox( _
                "Digite o nº do anexo e da folha separados por virgula"))
        
            If Anexo <> "" Then
                If InStr(Anexo, ",") = 0 Then
                    Numero = Numero & Anexo
                    Folha = ""
                Else
                    Numero = Numero & Trim(Split(Anexo, ",")(0))
                    Folha = Folha & Trim(Split(Anexo, ",")(1))
                End If
                Target = Numero & Folha
            End If
        End If
    End If
End Sub

 

19 horas atrás, Nilton Cézar disse:

➡️  UMA DÚVIDA: No projeto, já tinha outro evento SELECTIONCHANGE.

 

Assim, no início, deu conflito nos eventos, acusando erro de duplicidade de nome, conforme a mensagem abaixo:

Um módulo não pode ter procedimentos com nome repetido. Se a Sub não tinha nada você pode apagar e deixar só a do inputbox, mas se tinha algum código pode colocar no outro SelectionChange.

  • Curtir 1
Postado

Midori, ficou EXCELENTEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

Você é simplesmente ESPETACULARRRRRRRRRRRRRRRRRRRRRRRRRR!!!!!!!!!!!!!!!!!

 

Estamos quase concluindo essa parte de inclusão e exclusão de linhas.

 

Gostaria de mais duas macros, sendo uma para INSERIR VÁRIAS LINHAS e outra para EXCLUIR VÁRIAS LINHAS, com inputbox (para a escolha da quantidade de linhas), além de outros detalhes, como serão descritos abaixo.

 

Essas macros eu as chamaria de macros coringas, pois elas teriam atuação com mais flexibilidade (pretendo atribui  botões a elas). Elas seriam uma espécie de Rainha, no xadrez.

 

Pois bem, as macros seriam assim:

 

🟠 Macro EXCLUIR VÁRIAS LINHAS (deixando a seleção de célula livre, como nas macros enviadas anteriormente (Postado sexta-feira às 14:24 e Postado ontem às 07:48)):

 

  • excluir linhas em QUALQUER LUGAR da tabela. Ou seja, a) EM CIMA, exceto a primeira linha, com aquele comando/MsgBox: "Não é possível excluir esta linha", como anteriormente enviada; b) no MEIO; ou c) no FIM da tabela.

 

  • excluir QUANTAS LINHAS DESEJAR a critério do usuário.

 

  • abrir uma INPUTBOX, para definir o número de linhas a excluir, já aparecendo, de início, a quantidade 1. A função ficaria tipo assim:

                             InputBox("Digite o número de linhas a excluir:", "Excluir linhas.", "1")

 

  • um comando para recusar, na inputbox, a digitação de letras ou outros caracteres quaisquer, mediante uma MSGBOX com a mensagem, por exemplo, “Digite apenas números.”   

 

  • Sentido da exclusão: ⬆️

 

  • a ação seja executada apenas DENTRO da tabela (ou seja, macros vinculadas à tabela).

 

__________________________________________________________

 

 

 

🟠  Macro INCLUIR VÁRIAS LINHAS (deixando a seleção de célula livre, como nas macros enviadas anteriormente (Postado sexta-feira às 14:24)):

 

  • Incluir linhas em QUALQUER LUGAR da tabela. Ou seja, a) EM CIMA;  b) no MEIO; ou c) no FIM da tabela.

 

  • Incluir QUANTAS LINHAS DESEJAR a critério do usuário.

 

  • abrir uma INPUTBOX para definir o número de linhas a incluir, já aparecendo, de início, a quantidade 1. A função ficaria tipo assim:

 

                                    InputBox("Digite o número de linhas a inserir:", "Inserir linhas.", "1")

 

  •  um comando para recusar, na inputbox, a digitação de letras ou outros caracteres quaisquer, mediante uma MSGBOX com a mensagem, por exemplo, “Digite apenas números.”

 

  • Sentido da inclusão: ⬇️    

 

  • a ação seja executada apenas DENTRO da tabela (ou seja, macros vinculadas à tabela).

 

_______________________________________________________________________

 

 

Acho que coloquei muita informação, Midori. Mas, a intenção era deixar bem detalhado, para evitar ajustes futuros.

 

Eu sei que estou te importunando demais. Mas, estamos quase concluindo e esse projeto é muito importante para o meu setor de trabalho.

 

Espero que tenha paciência comigo.

 

A propósito, eu entendi a explicação enviada anteriormente, conforme abaixo destacada:

 

Citação

Um módulo não pode ter procedimentos com nome repetido. Se a Sub não tinha nada você pode apagar e deixar só a do inputbox, mas se tinha algum código pode colocar no outro SelectionChange.

 

Postado

Na macro que exclui várias linhas limitei o número de linhas para a quantidade existente na tabela, então se p.ex a tabela tiver 3 linhas e no input informarem mais linhas a macro só vai apagar essas 3 linhas.

 

Function InputLinhas(Modo As String) As Variant
    Dim NumLinhas   As Variant
    Do While 1
        NumLinhas = Application.InputBox( _
            "Digite o número de linhas a " & Modo & ": ", _
                Modo & " linhas", 1)
            If NumLinhas = False Or IsNumeric(NumLinhas) Then Exit Do
            MsgBox "Digite apenas números"
        Loop
    InputLinhas = NumLinhas
End Function

Sub ExcluirVariasLinhas()
    Dim Tabela As Range
        
    Set Tabela = Range("TabelaPensão")
    
    If Not Intersect(Tabela, ActiveCell) Is Nothing Then
        Dim NumLinhas   As Variant
        
        NumLinhas = InputLinhas("Excluir")
        
        If NumLinhas <> False Then
            Dim LinhaAtual  As Long
            Dim L           As Long
            Dim I           As Long
            
            I = 1
            L = Val(NumLinhas)
            LinhaAtual = (ActiveCell.Row - Tabela.Cells(1).Row) + 1
            If L > LinhaAtual Then L = LinhaAtual
        
            Do While I <= L
                If Tabela.Rows.Count = 1 Then
                    Tabela.ClearContents
                    Exit Do
                Else
                    Tabela.ListObject.ListRows(LinhaAtual - I + 1).Delete
                End If
                I = I + 1
            Loop
        End If
    End If
End Sub

 

Postado

Boa tarde, Midori.

 

Primeiramente, MUITO obrigado pelas macros.

 

➡️ Pois bem, fiz alguns testes com a macro EXCLUIR VÁRIAS LINHAS e verifiquei o seguinte:

 

Quando excluímos 4 linhas, ela DESCE 4 linhas, na tabela. Quando excluímos 5 linhas, ela DESCE 5 linhas, e assim por diante.

 

  • Sendo assim, gostaria que, quanto à macro EXCLUIR VÁRIAS LINHAS, após sua execução, ela deixasse, se possível, SELECIONADA A PRIMEIRA CÉLULA/LINHA imediatamente POSTERIOR às linhas excluídas.

 

  • Acho que seria interessante colocar também um comando e uma MSGBOX com a mensagem, por exemplo, "Não é possível excluir esta linha.", para impedir a tentativa de exclusão (acidental) da PRIMEIRA LINHA da tabela.

 

É verdade que isso não é possível, devido ao formato tabela; porém, é apenas para deixar o projeto mais interativo com o usuário.

 

No demais, pode DEIXAR MANTIDA as demais linhas de código da macro acima.

 

Por último, já fiz os testes e verifiquei que a melhor opção é deixar selecionada a linha posterior, como acima solicitado.

 

_____________________________________________________________________________

 

 

➡️ Midori, já em relação à macro INSERIR VÁRIAS LINHAS, confesso que não consegui entender essa macro.

 

Pesquisei na internet, mas não ficou claro para mim essa função. Para ser sincero, nem conhecia essa aplicação.

 

Assim, tentei executar a macro acima com F8, mas não consegui. Tentei atribuir a citada macro a um botão, mas não havia opção de atribuir função. Tentei colocar Sub ...End sub, no módulo, mas não reconheceu. Enfim, não consegui executar essa função no projeto.
 

Midori, como é que funciona a macro referente à INSERIR VÁRIAS LINHAS?

 

Obrigado pela atenção.

 

Postado
4 horas atrás, Nilton Cézar disse:

Sendo assim, gostaria que, quanto à macro EXCLUIR VÁRIAS LINHAS, após sua execução, ela deixasse, se possível, SELECIONADA A PRIMEIRA CÉLULA/LINHA imediatamente POSTERIOR às linhas excluídas.

Para selecionar inclua esta linha após o loop da exclusão,

 

ActiveCell.Offset(-I + 2).Select

 

4 horas atrás, Nilton Cézar disse:

Acho que seria interessante colocar também um comando e uma MSGBOX com a mensagem, por exemplo, "Não é possível excluir esta linha."

 

Coloque o Msgbox no If do teste da linha tabela = 1,

MsgBox "Não é possível excluir esta linha."

 

4 horas atrás, Nilton Cézar disse:

Midori, como é que funciona a macro referente à INSERIR VÁRIAS LINHAS?

 

Pode ser assim,

Sub IncluirVariasLinhas()
    Dim Tabela As Range
        
    Set Tabela = Range("TabelaPensão")
    
    If Not Intersect(Tabela, ActiveCell) Is Nothing Then
        Dim NumLinhas   As Variant
        
        NumLinhas = InputLinhas("Incluir")
        If NumLinhas <> False Then
            Dim LinhaAtual  As Long
            Dim L           As Long
            LinhaAtual = (ActiveCell.Row - Tabela.Cells(1).Row) + 2
            L = Val(NumLinhas)
            
            If L + ActiveCell.Row > [A:A].Rows.Count Then
                L = [A:A].Rows.Count - ActiveCell.Row
            End If
            
            While L > 0
                Tabela.ListObject.ListRows.Add LinhaAtual, True
                L = L - 1
            Wend
        End If
    End If
End Sub

 

Postado

Bom dia, Midori.

 

Midori, sobre as alterações que você me recomendou, vamos lembrar um pouco:

 

➡️  Quanto ao pedido de SELEÇÃO DA PRIMEIRA CÉLULA/LINHA imediatamente POSTERIOR às linhas excluídas, esta foi a recomendação:

 

Citação

Para selecionar inclua esta linha após o loop da exclusão,

 

➡️  Já em relação a colocar também uma MSGBOX, esta foi a orientação:

 

Citação

Coloque o Msgbox no If do teste da linha tabela = 1,

 

Pois bem, fiz os ajustes acima e aparentemente tá funcionando direitinho.

 

LEMBRANDO: essas incrementações foram solicitadas para a macro de EXCLUSÃO DE VÁRIAS LINHAS, enviada anteriormente.

 

:tw_warning:  Mas, apenas para eliminar qualquer dúvida, por favor, Midori, ME CONFIRME SE EU FIZ AS ALTERAÇÕES CORRETAS. Assim, segue um trecho recortado do código da EXCLUSÃO de linhas, com as sugestões em AZUL:

 

            (...)     

 
            Do While I <= L
                If Tabela.Rows.Count = 1 Then
                    Tabela.ClearContents
                    MsgBox "Não é possível excluir esta linha."
                    Exit Do
                Else
                    Tabela.ListObject.ListRows(LinhaAtual - I + 1).Delete
                End If
                I = I + 1
            Loop
            ActiveCell.Offset(-I + 1).Select
        End If
    End If
End Sub

 

Midori, as linhas em azul era para FICAR NESSAS POSIÇÕES MESMO?

______________________________________________________________________________

 

 

🤔 A propósito, acho que entendi a aplicabilidade do procedimento Function (havia me confundido com a macro de inclusão de linhas). Pelo que percebi, essa função funciona como uma macro auxiliar para as macros de INSERIR VÁRIAS LINHAS e EXCLUIR VÁRIAS LINHAS, enviadas anteriormente, as quais retomam as instrução fixadas pela Function.

 

 

___________________________________________________________________________________

 

 

❓  UMA DÚVIDA: Midori, É VERDADE que, QUANTO MAIS MACROS no projeto, MAIS LENTO e TRAVANDO ele fica?

 

ESTA PARECE QUE FOI UMA SESSÃO DÚVIDA.

 

Agradeço a paciência, Midori. Já estamos quase concluindo o projeto. Falta apenas alguns poucos detalhes.

 

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...