Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por Midori,

Posts recomendados

Em 02/04/2021 às 11:47, Nilton Cézar disse:

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

Sim, é isso.

 

Em 02/04/2021 às 11:47, Nilton Cézar disse:

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

Quanto mais macros, mais processamento e recursos a sua planilha vai exigir, mas para o usuário da planilha isso nem sempre é perceptível. A questão da lentidão não é necessariamente pela quantidade de macros e pode ser algo já previsível no projeto como p.ex o loop das Subs Incluir/Excluir várias linhas que vai demorar para rodar de acordo com a quantidade de linhas informadas. Quanto a travamento já é outra coisa que que também não vai acontecer só porque tem muitas macros e pode ser um problema específico no código.

 

Uma forma de evitar a lentidão do loop no caso da inclusão das linhas, seria usar outro método de inclusão, uma alternativa seria um Resize com a quantidade de linhas, p.ex,

 

Sub IncluirVariasLinhas()
    Dim NumLinhas   As Variant
        
    NumLinhas = InputLinhas("Incluir")
        
    If NumLinhas <> False Then
        ActiveCell.Resize(NumLinhas).EntireRow.Insert
    End If
End Sub

 

Assim é mais simples e rápido e vai incluir as linhas como na macro anterior.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, Midori. Obrigado pelas explicações. Entendi direitinho e obrigado pela macro alternativa. Funcionou perfeitamente! Ficou ótimo!👏👏👏👏

 

 

Midori, como havia dito anteriormente, coloquei ÍCONES FLUTUANTES, no projeto. Também coloquei REALCE DE LINHAS, após combinar duas macros referente a duas explicações distintas.

 

Apenas a título de informação, adicionei os shapes (ícones) com base nesta aula: https://www.youtube.com/watch?v=_nRzKpLlbI8. E o realce de linhas, nesta outra: https://www.youtube.com/watch?v=nU-ToK9_4FA .

 

➡️  Pois bem, quanto ao REALCE DE LINHAS, consegui vincular esse recurso à Tabela. Contudo, NÃO consegui vincular os ÍCONES à Tabela, quando seleciono uma linha dentro da Tabela.

 

De acordo com a macro das shapes, a referência é a coluna C, e os ícones se movimentam ao longo da coluna G (indicada pelo nº 4, no código). Mas, os ícones ficam EM QUALQUER LUGAR da coluna G, quando clicamos em qualquer parte da planilha (sheet).

 

⚠️ Estou enviando o projeto com esses recursos, para melhor compreensão das informações. A macro dos ÍCONES está no MÓDULO 2. E o REALCE DE LINHAS, no evento SELECTIONCHANGE da sheet Pensão por morte.

 

  • Assim, Midori, se possível, gostaria que os ÍCONES ficassem vinculados apenas à Tabela, assim como o realce das linhas. Teria como enviar a linha de código para isso?

 

________________________________________________________________________________

 

 

Outra coisa, Midori, em relação à IMPRESSÃO DO RELATÓRIO, após gerar o PDF, fica impresso toda a área visível da planilha.

 

⚠️  Para mim isso não é problema, pois consigo evitar isso. Para tanto, basta ir na aba Layout da Página, selecionar (com o mouse) a área do relatório a ser impressa. Em seguida, clicar em DEFINIR ÁREA DE IMPRESSÃO, após acionar no ícone Área de Impressão. Por fim, clicar no botão GERAR PDF.

 

⚠️  Lembrando que o botão GERAR PDF já tem uma macro atribuída para esse fim, que salva o arquivo em PDF automaticamente na mesma pasta/endereço em que o projeto foi baixado.

 

➡️  Contudo, esse projeto será utilizado por PESSOAS LEIGAS, que sequer conhecem o Excel, muito menos a operação acima. Além disso, com um botão fica bem mais elegante e automatizadas as ações em questão.

 

  • Portanto, Midori, teria alguma macro capaz de executar as etapas acima, destacadas em azul, para imprimir apenas a área de impressão selecionada. Caso tenha, se possível, TERIA COMO ENVIAR ESSE CÓDIGO?

 

Obrigado pelas ajudas imensuráveis e pela enorme paciência. Midori, você é 💯.

 

 

 

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

Link para o comentário
Compartilhar em outros sites

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

Mas, os ícones ficam EM QUALQUER LUGAR da coluna G, quando clicamos em qualquer parte da planilha (sheet).

Para movimentar os ícones apenas quando selecionar a tabela é só colocar a instrução dentro do IF, p.ex,

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Range("TabelaPensãoPorMorte"), Target) Is Nothing Then
        Application.ScreenUpdating = True
        Call mostrarícones
...

 

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

teria alguma macro capaz de executar as etapas acima, destacadas em azul, para imprimir apenas a área de impressão selecionada

 

Sua macro está exportando a planilha ativa com ExportAsFixedFormat nesta parte,

WB.ActiveSheet.ExportAsFixedFormat 

 

Se quiser exportar apenas o range da tabela, pode fazer algo assim,

 

Dim L As Long
    
L = Range("TabelaPensãoPorMorte").Rows.Count

WB.ActiveSheet.Range("TabelaPensãoPorMorte").Offset(-1).Resize(L + 1).ExportAsFixedFormat
...

 

Veja que após ActiveSheet só acrescentei o range da tabela.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa tarde, Midori.

 

Primeiramente, em relação à vinculação dos ÍCONES à tabela, deu certo; PORÉM, quando clicamos FORA da tabela, TRECHOS do realce da última linha selecionada, na tabela, fica SEM REALCE, como se ficasse desbotada.

 

No projeto, fica melhor de visualizar esse fato.

 

Isso não acontecia quando tínhamos apenas o REALCE DE LINHA, pois, mesmo clicando fora da tabela, não deixava a linha desbotada.

 

Pelo que dá para entender da instrução IF, a condição diz que, se não houver nenhum dado, então é vazio (tradução livre). No entanto, é para a linha ficar realçada independente do preenchimento da linha.

 

Assim, Midori, tem como contornar essa situação?

 

Não sei bem, mas, analisando o módulo 2, não é algo relacionada a essa parte azul do código?

 

.Left = ActiveSheet.Range("C" & ActiveCell.Row).Offset(0, 4).Left
.Top = ActiveSheet.Range("C" & ActiveCell.Row).Offset(0, 4).Top

 

Não seria o caso de colocar o range da tabela, considerando que a coluna C é a referência e os ícones se movimentam ao longo da coluna G (indicada pelo nº 4, no código), bem como os shapes ao lado da linha selecionada, na coluna G.

 

 

_________________________________________________________________________

 

 

Já quanto à IMPRESSÃO, também deu certo em parte. Mas, desejo que seja gerado o PDF NÃO apenas da Tabela, mas também de TODAS as informações inseridas fora tabela.

 

➡️  Como exemplo, estou enviado, em anexo, um modelo impresso do PDF do relatório, para você ter uma ideia de como ele deve ficar, após a impressão.

 

⚠️ LEMBRANDO:

 

  • A tabela tem começo. No caso, poderia ser na célula C9, onde se inicia o nome: RELATÓRIO DE (em seguida, na célula seguinte tem uma validação para selecionar o tipo de ação).
  • Contudo, o tamanho da tabela é variável. Seu fim somente se dá quando esgotadas todas as informações processuais pertinentes.
  • Após o preenchimento da tabela, é colocado o nome do responsável pela confecção do relatório (Responsável pelo Relatório: Cézar), cerca de 3 LINHAS ABAIXO DA TABELA. 

 

O ideal é que a macro seguisse o passo a passo descrito anteriormente, como abaixo destacado:

 

Citação

  Para mim isso não é problema, pois consigo evitar isso. Para tanto, basta ir na aba Layout da Página, selecionar (com o mouse) a área do relatório a ser impressa. Em seguida, clicar em DEFINIR ÁREA DE IMPRESSÃO, após acionar no ícone Área de Impressão. 

 

 

⚠️ EM RESUMO:

 

  • Seria uma macro para selecionar da célula C9 até uma célula da TERCEIRA linha abaixo da tabela, constante da coluna F. Em seguida, clicar na aba Layout da Página > Área de Impressão > Definir Área de impressão. 

 

  • E outra macro para limpar a área de impressão: Layout da Página > Área de Impressão > Limpar área de impressão (essa me veio depois, pois percebi que, após definir a área de impressão, a área escolhida permanece selecionada, mesmo após a impressão).

 

Assim, é possível, Midori, criar macros, para ficar nos moldes acima?

 

Muita coisa, né! 

 

Agradeço muito se puder fazer as correções sugeridas.

 

Renomeie já Relatório de Audiência!.pdf

Link para o comentário
Compartilhar em outros sites

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

Primeiramente, em relação à vinculação dos ÍCONES à tabela, deu certo; PORÉM, quando clicamos FORA da tabela, TRECHOS do realce da última linha selecionada, na tabela, fica SEM REALCE, como se ficasse desbotada.

Isso não acontece aqui, quando clico fora a última linha selecionada permanece como antes de clicar. Pode postar um print de como fica a sua planilha?

 

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

Já quanto à IMPRESSÃO, também deu certo em parte. Mas, desejo que seja gerado o PDF NÃO apenas da Tabela, mas também de TODAS as informações inseridas fora tabela.

 

Para ficar assim ajuste o range da impressão,

L = Range("TabelaPensãoPorMorte").Rows.Count + 17

WB.ActiveSheet.Range("C9").Resize(L, 4).ExportAsFixedFormat

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa tarde, Midori.

 

➡️  Primeiramente, quanto ao problema dedesbotamento” no REALCE DA LINHA, segue o print, em anexo, para melhor visualizar a situação.

 

A propósito, anteriormente, relatei algumas impressões sobre isso. Mas, não sei se vem ao caso, Midori.

 

 

________________________________________________________________________________

 

 

➡️  Já em relação à IMPRESSÃO, fiz as ALTERAÇÕES sugeridas por último. Vejamos:

 

9 horas atrás, Midori disse:

Para ficar assim ajuste o range da impressão,




L = Range("TabelaPensãoPorMorte").Rows.Count + 17

WB.ActiveSheet.Range("C9").Resize(L, 4).ExportAsFixedFormat

 

 

Pois bem, Midori, gostaria apenas que você, por favor, CONFIRMASSE se os ajustes, em azul, feitos na macro GERAR PDF, estão CORRETOS. Veja:

 

 

Sub GerarPDF()
'Macro para gerar PDF da planilha respectiva.
   
   Dim WB As Workbook
   Set WB = ActiveWorkbook
   
   Dim L As Long
   L = Range("TabelaPensãoPorMorte").Rows.Count + 17

   
   
   'Selecionar o planilha respectiva.
   Sheets("Pensão por morte").Select
    
  'O código abaixo exporta o PDF para o endereço da planilha (código original).
    WB.ActiveSheet.Range("C9").Resize(L, 4).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    WB.Path & "\Renomeie já Relatório de Audiência!.pdf", Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    OpenAfterPublish:=False
        
    MsgBox ("Relatório de Audiência gerado com sucesso!")


End Sub

 

 

❓Midori, está tudo direitinho no código acima?

 

 

⚠️ ADEMAIS, sobre a linha abaixo, extraída do código supracitado:

 

  • L = Range("TabelaPensãoPorMorte").Rows.Count + 17

 

🤔 Fiquei na dúvida! Pois preciso conhecer um pouco dos códigos, a fim de ter condições de fazer algum ajuste na macro, quando necessário.

 

Assim, por favor, explique-me a linha de código acima, PRINCIPALMENTE O NÚMERO 17.

 

Esse número VAI LIMITAR a quantidade de linhas a serem impressas?

 

Confesso que não gostaria que a tabela/relatório tivesse a impressão restringida pelo número de linhas.

 

Desde já, Midori, agradeço pela ajuda.

 

 

PRINT DO RELATÓRIO DE AUDIÊNCIA.pdf

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Nilton Cézar disse:

Assim, por favor, explique-me a linha de código acima, PRINCIPALMENTE O NÚMERO 17.

 

Esse número VAI LIMITAR a quantidade de linhas a serem impressas?

A edição está correta e esse número não vai limitar porque ele soma 17 com a quantidade de linhas da tabela. Então se a sua tabela p.ex tiver 10 linhas, L vai ser = 27 que é a quantidade de linhas entre a linha 9 e a última linha com o nome do responsável.

 

Mas revendo as alternativas de pegar o range talvez essa não seja a melhor forma, fiz outra macro mais legível e que seleciona da mesma forma,

 

Sub RelAudPM_GerarPDF()
    Dim Area            As Range
    Dim NomeRelatorio   As String
    
    NomeRelatorio = "Renomeie já Relatório de Audiência!.pdf"
    
    Set Area = Range("TabelaPensãoPorMorte")
    Set Area = Range([C9], Area.Cells( _
        Area.Rows.Count + 2, Area.Columns.Count))
    
    Area.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=ActiveWorkbook.Path & "\" & NomeRelatorio, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    MsgBox "Relatório de Audiência gerado com sucesso!", vbInformation
End Sub

 

Assim fica mais claro já que mostra o range começando da célula C9 até a última linha da tabela + 2. Esse 2 é referente a quantidade de linhas fora da tabela onde está o texto do responsável.

 

1 hora atrás, Nilton Cézar disse:

➡️  Primeiramente, quanto ao problema dedesbotamento” no REALCE DA LINHA, segue o print, em anexo, para melhor visualizar a situação.

 

A propósito, anteriormente, relatei algumas impressões sobre isso. Mas, não sei se vem ao caso, Midori.

Isso deve acontecer porque a macro só atualiza a formatação condicional quando a seleção está dentro da tabela (o código está no If do Intersect).

 

Para resolver você pode colocar fora do If a instrução ScreenUpdating ou Calculate. O SelectionChange pode ficar assim, veja se resolve,

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    Application.Calculate
    
    If Not Intersect(Range("TabelaPensãoPorMorte"), Target) Is Nothing Then
        Call mostrarícones
...

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, Midori.

 

Ficaram excelentes! Estão todas funcionando direitinho! Ficou 💯.

 

E o bom é que NÃO aparece a tarja de seleção da linha, no PDF do relatório. Massa!

 

➡️   Midori, eu gostaria apenas de relatar um “BUGUIZINHO” na impressão.

 

Vejamos. Quando eu imprimo o relatório e, EM SEGUIDA, abro o PDF dele e, ao TENTAR imprimir novamente outro relatório, aparece uma CAIXA DE ERRO da macro, conforme é possível ver no arquivo que segue em anexo.

 

Acredito que isso deve ser é uma crítica gerada pelo próprio Foxit (leitor de PDF que uso). Também acho que NÃO há como evitar isso. Talvez seja um erro que o usuário tem que CONVIVER COM ELE.

 

O que pode acontecer é um servidor curioso invadir a macro da impressão e alterar indevidamente o código.

 

Midori, mas talvez não valha a pena mexer nisso.

 

  • Parece-me que esse é um daqueles casos que, para evitar esse bug, é só NÃO abrir o relatório impresso anteriormente. Simples assim. Cuidarei de avisar o pessoal sobre isso.

 

Fica apenas o registro e acredito, Midori, que você deve pensar da mesma forma.

 

 

_______________________________________________________________________

 

 

➡️   Midori, acredito que inverti as ideia! Acho que ANTECIPEI a macro de impressão!

 

Vou explicar. Inicialmente, pensei em criar hiperlinks, para o usuário mudar de relatório, conforme benefício/ação escolhido.

 

Mas, percebi que isso iria implicar a criação de várias macros iguais, para fazer a mesma tarefa, o que mudaria era apenas a sheet a que elas se referiam (pensão por morte, aposentadoria, etc).

 

  • Então, decidi que ficaria mais legal ocultar linhas (com informações pertinentes ao benefício/ação correspondente). E SOMENTE reexibir as linhas respectivas, após escolher o tipo benefício/ação, constante de uma lista presente em uma validação de dados, inserida em uma determinada célula.

 

Também acho que, do modo acima, o projeto ficaria mais elegante e com cara de aplicativo.

 

⚠️  Essas linhas ocultas (para serem eventualmente reexibidas) ficariam entre o cabeçalho do relatório (onde começa RELATÓRIO DE...) e a tabela.

 

❓ Pois bem, Midori, será que a macro RealAudPM_GerarPDF, enviada por último, COMPREENDERÁ as linhas a serem oportunamente REEXIBIDAS, conforme o tipo de benefício/ação escolhido, na impressão do relatório?

 

 

Vaaaaaaaaaaaaaallllllllllllllllllllllllllllllllleeeeeeeeeeeeeeeeeeeuuuuuuuuuuuuuuuuuuuu, Midori,!!!!!!!!!!!!!!!!!!!!!!

 

 

 

Bug da impressão.pdf

Link para o comentário
Compartilhar em outros sites

44 minutos atrás, Nilton Cézar disse:

Vejamos. Quando eu imprimo o relatório e, EM SEGUIDA, abro o PDF dele e, ao TENTAR imprimir novamente outro relatório, aparece uma CAIXA DE ERRO da macro, conforme é possível ver no arquivo que segue em anexo.

Esse erro não acontece aqui mesmo com o pdf aberto. Seu aplicativo deve impedir que o arquivo seja salvo ou editado enquanto está aberto. Para evitar essa mensagem você pode usar On Error no código e informar o usuário para fechar o arquivo, veja se assim fica melhor,

 

Sub RelAudPM_GerarPDF()
    Dim Area            As Range
    Dim NomeRelatorio   As String
    
    On Error Resume Next
    
    NomeRelatorio = "Renomeie já Relatório de Audiência!.pdf"
    
    Set Area = Range("TabelaPensãoPorMorte")
    Set Area = Range([C9], Area.Cells( _
        Area.Rows.Count + 2, Area.Columns.Count))
    
    Area.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=ActiveWorkbook.Path & "\" & NomeRelatorio, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    If Err.Number = 0 Then
        MsgBox "Relatório de Audiência gerado com sucesso!", vbInformation
    Else
        MsgBox "O relatório não foi salvo, feche o arquivo pdf antes de salvar", vbExclamation
    End If
End Sub

 

44 minutos atrás, Nilton Cézar disse:

⚠️  Essas linhas ocultas (para serem eventualmente reexibidas) ficariam entre o cabeçalho do relatório (onde começa RELATÓRIO DE...) e a tabela.

 

❓ Pois bem, Midori, será que a macro RealAudPM_GerarPDF, enviada por último, COMPREENDERÁ as linhas a serem oportunamente REEXIBIDAS, conforme o tipo de benefício/ação escolhido, na impressão do relatório?

 

Essas linhas vão aparecer no relatório PDF se forem exibidas antes da impressão.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa noite, Midori.

 

A macro de impressão ficou simplesmente fantástica! Sem palavras!

 

Como havia dito, Midori, decidi que ficaria mais legal OCULTAR linhas com informações específicas, e somente reexibi-las oportunamente, após escolher o tipo benefício/ação correspondente, através de validação de dados em uma determinada célula.

 

Essas linhas ocultas (para serem eventualmente reexibidas) ficariam entre o cabeçalho do relatório e a tabela (as quais, como esclarecido, entrarão na impressão do relatório).

 

Nesse caso, Midori, acho que deve ser um evento CHANGE (ah, sei lá!)

 

➡️  Então, funcionaria assim. Vejamos:

 

  • O tipo da benefício/ação aparecerá na célula D9, onde tem uma lista da validação de dados.

Em seguida:

  • 1) Se APARECER especificamente quaisquer dos benefícios abaixo (em maiúsculo ou minúsculo):

Aposentadoria especial

Aposentadoria por idade rural

Aposentadoria por idade urbana

Aposentadoria por tempo de contribuição

Seguro-defeso

 

> Então NÃO FAZ NADA (não reexibe nenhuma linha).

 

  • 2) Se APARECER especificamente quaisquer dos benefícios abaixo (em maiúsculo ou minúsculo):

Amparo social ao deficiente

Aposentadoria por invalidez rural

Aposentadoria por invalidez urbana

Auxílio-acidente rural

Auxílio-acidente urbano

Auxílio-doença rural

Auxílio-doença urbano

 

> Então REEXIBIR o intervalo de linhas de 21 a 25.

 

  • 3) Se APARECER especificamente quaisquer dos benefícios abaixo (em maiúsculo ou minúsculo):

Pensão por morte rural

Pensão por morte urbana

 

> Então REEXIBIR o intervalo de linhas de 27 a 49.

 

  • 4) Se APARECER especificamente quaisquer dos benefícios abaixo (em maiúsculo ou minúsculo):

Salário-maternidade rural

Salário-maternidade urbano

 

> Então REEXIBIR o intervalo de linhas de 51 a 61.

 

  • 5) Se APARECER especificamente (em maiúsculo ou minúsculo):

Exibir linhas

 

> Então REEXIBIR o intervalo de linhas de 20 a 65 (esse último caso é para fazer algum ajuste/formatação no relatório, ao longo dessas linhas, caso necessário).

 

  • 6) Se APARECER especificamente quaisquer dos benefícios abaixo (em maiúsculo ou minúsculo):

Amparo social ao idoso

Auxílio-reclusão rural

Auxílio-reclusão urbano

Palavra ou palavras quaisquer (p. ex.: ação de danos morais, etc.), COM EXCEÇÃO da expressão "Exibir linhas", acima mencionada, e dos "benefícios listados no Grupo 1".

 

> Então REEXIBIR o intervalo de linhas de 63 a 65.

 

 

➡️  Assim, Midori, se possível, gostaria, por favor, de uma macro/evento (talvez, o CHANGE), para aplicar essas instruções acima.

 

 

Tô abusando demais, né! Mas, já estamos na fase final do projeto! Vai ficar muito bacana!

 

Link para o comentário
Compartilhar em outros sites

@Nilton Cézar Para exibir/ocultar essas linhas o evento Change é o mais adequado.

 

Para facilitar o trabalho crie uma nova Aba com o nome "Benefício". E na coluna A dessa planilha coloque o tipo do benefício e na coluna B o intervalo de linhas no formato Inicio-Fim, então p.ex se for o intervalo de 21 a 25 vai ficar 21-25. Exemplo,

 

Aposentadoria por invalidez urbana, 21-25

Auxílio-reclusão urbano, 63-65

 

Assim a coluna B da planilha Benefício vai informar o intervalo das linhas e só temos que precisar pesquisar o intervalo com base no benefício. Para isso podemos usar uma função,

 

Function BuscaIntervalo(Beneficio As String) As Variant
    Dim Intervalo As Variant
    
    On Error Resume Next
    
    Intervalo = Replace(WorksheetFunction.VLookup( _
        Beneficio, Sheets("Benefício").[A:B], 2, 0), "-", ":")

    If Err.Number <> 0 Then
        Intervalo = False
    End If
    BuscaIntervalo = Intervalo
End Function

 

Aí é só chamar a função no evento Change da planilha, p.ex,

 

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Range("21:66").EntireRow.Hidden = True
    
    If Target.Address = "$D$9" Then
        Dim Intervalo As Variant
    
        Intervalo = BuscaIntervalo(Target.Value)
    
        If Intervalo <> False Then
            Range(Intervalo).EntireRow.Hidden = False
        End If
    End If
End Sub

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, Midori.

 

Ficou ótimo!

 

Fiz alguns testes e observei o seguinte:

 

➡️  Nos benefícios do Grupo 1, a instrução era para NÃO aparecer linhas; contudo estava aparecendo a tela de erro de macro.

 

❓ Mas, COLOQUEI o número 0 referente aos benefícios do grupo acima, na coluna B (Intervalo). E DEU CERTO! É assim mesmo?

 

_______________________________________________________________________

 

 

➡️   Por fim, no Grupo 6, ao digitar quaisquer ação/benefício, era para APARECER as linhas 63-65, conforme comando abaixo:

 

Citação

Palavra ou palavras quaisquer (p. ex.: ação de danos morais, etc.), COM EXCEÇÃO da expressão "Exibir linhas", acima mencionada, e dos "benefícios listados no Grupo 1".

 

> Então REEXIBIR o intervalo de linhas de 63 a 65.

 

 

⚠️  Contudo NÃO está APARECENDO as linhas referidas. DETALHE: NÃO aparece janela de erro, apenas NÃO REEXIBE as citadas linhas.

 

  • Assim, Midori, por favor, teria como ajustar, se possível, o código para, AO DIGITAR PALAVRA OU QUAISQUER PALAVRAS, aparecer as LINHAS 63-65.

 

Apenas lembrando que as instruções estão no tópico que eu enviei anteriormente.

 

 

❓UMA DÚVIDA: Midori, pretendo bloquear algumas células do projeto com SENHA. Assim, mesmo eu protegendo algumas células das linhas ocultas, elas REEXIBIRÃO normalmente, ao escolher a ação/benefício?

 

 

Ficou massa!

 

 

 

 

Link para o comentário
Compartilhar em outros sites

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

Nos benefícios do Grupo 1, a instrução era para NÃO aparecer linhas; contudo estava aparecendo a tela de erro de macro.

As linhas só serão exibidas se colocar algum benefício na planilha com um intervalo válido. O erro deve ser porque você colocou algum intervalo inválido.

 

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

Mas, COLOQUEI o número 0 referente aos benefícios do grupo acima, na coluna B (Intervalo). E DEU CERTO! É assim mesmo?

Não coloque 0. Se não quiser exibir as linhas na seleção de determinando grupo é só não cadastrar o benefício na planilha.

 

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

Assim, Midori, por favor, teria como ajustar, se possível, o código para, AO DIGITAR PALAVRA OU QUAISQUER PALAVRAS, aparecer as LINHAS 63-65.

 

Acrescente esta condição no Change e veja se resolve,

If Intervalo <> False Then
    Range(Intervalo).EntireRow.Hidden = False
Else
    Range("63:65").EntireRow.Hidden = False
End If

 

Assim as linhas 63:65 serão exibidas para qualquer seleção que não tenha cadastro na planilha Benefício.

 

***

 

Obs: Se pretender ocultar/exibir linhas menores que 13, terá que fazer uma pequena alteração na sub BuscaIntervalo e onde está '-' deverá ficar ';'. E assim o intervalo da coluna B terá que usar o ponto e vírgula como separador no lugar do sinal de menos. Isso porque o Excel pode converter o intervalo para data e assim daria erro no código.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, Midori.

 

Fiz alguns testes, após as últimas sugestões enviadas, e constatei o seguinte. Vejamos.

 

➡️  Midori, quanto aos benefícios do Grupo 1, para que não exibissem linhas, você sugeriu que era só NÃO CADASTRAR os citados benefícios na planilha, em substituição ao número 0, que eu havia colocado antes. Só lembrando:

 

Citação

Não coloque 0. Se não quiser exibir as linhas na seleção de determinando grupo é só não cadastrar o benefício na planilha.

 

⚠️  Deu certo! Por outro lado, como a condição IF, acrescentada ao Change, exibe as linhas 63 a 65, para qualquer seleção que não tenha cadastro na planilha Benefício, ela acaba também EXIBINDO essas linhas, quando colocamos os benefícios do GRUPO 1, que, a propósito, NÃO era para exibir nenhuma linha. 

  • Midori, é possível resolver isso? Caso não seja, poderíamos simplesmente tirar a condição IF, enviada anteriormente, e, quando colocarmos quaisquer palavras, não vai exibir nenhuma linha, tal qual ocorre com os benefícios do Grupo 1.

 

A vantagem de exibir as linhas 63 a 65 era para o caso de colocar alguma informação extra, não prevista para os casos mais comuns, já relacionados.

 

_____________________________________________________________________________

 

 

➡️  De outro lado, quando troquei “ - “ por “ ; ”, na sub BuscaIntervalo, para evitar eventual subtração, deu mensagem de erro de macro. Mas, quando desfaço a alteração na macro, fica normal.

 

⚠️  Coloquei o ponto e vírgula também na coluna do intervalo da planilha APENAS para um benefício, após a alteração acima proposta, e NÃO apresentou o bug ora relatado.

 

Assim, será que é para aplicar TAMBÉM o ponto e vírgula em TODA planilha Benefício? (não testei isso!).

 

❓ A propósito, qual a relação do número 13? (estou perguntando, porque pode ser que não precisemos nos preocupara com quantidade de linhas menores que 13).

 

É muita informação, já tô ficando doido! 🤯

 

Link para o comentário
Compartilhar em outros sites

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

ela acaba também EXIBINDO essas linhas, quando colocamos os benefícios do GRUPO 1, que, a propósito, NÃO era para exibir nenhuma linha. 

Para esses casos podemos escolher uma letra que vai identificar os tipos que devem ser desconsiderados.

 

Acrescente esta nova condição no IF,

If UCase(Intervalo) <> "N" Then
    If Intervalo <> False Then
        Range(Intervalo).EntireRow.Hidden = False
    Else
        Range("63:65").EntireRow.Hidden = False
    End If
End If

 

Assim a macro não vai exibir nenhuma linha quando o valor do benefício na coluna B for igual a N. Dessa forma você deve cadastrar com N os benefícios que não devem exibir nenhuma linha.

 

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

De outro lado, quando troquei “ - “ por “ ; ”, na sub BuscaIntervalo, para evitar eventual subtração, deu mensagem de erro de macro. Mas, quando desfaço a alteração na macro, fica normal.

Teria que trocar em tudo, na Sub e no padrão do intervalo da coluna B.

 

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

A propósito, qual a relação do número 13? (estou perguntando, porque pode ser que não precisemos nos preocupara com quantidade de linhas menores que 13).

Se o Excel identificar que a linha pode ser convertida para data ele vai converter. O valor menor que 13 pode ser identificado como mês dependendo se vem antes ou depois do sinal.

 

Com 01-12 pode ser convertido para 01/dez.

E12-01 pode ficar 12/jan.

 

Isso também poderia ser evitado se a célula ficar formatada para Texto, mas achei mais simples só usar outro caractere.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa tarde, Midori.

 

Primeiramente, entendi perfeitamente a explicação do 13.

 

Fiz os ajustes recomendados, mas continua dando mensagem de erro justamente nos benefícios do Grupo 1, aqueles que você me orientou a colocar a letra na N , na coluna B (e que não é para exibir linha, apenas lembrando).

 

Vou te enviar, em anexo, a tabela Benefício montada com a disposição dos benefícios para você, por favor, conferir se errei em algo.

 

Quanto ao mais, por favor, Midori, veja se montei a macro, com alterações recomendadas, de forma correta. Segue:

 

Citação

'OCULTAR/REEXIBIR LINHAS-TESTE (FUNÇÃO)

 

Function BuscaIntervalo(Beneficio As String) As Variant
    Dim Intervalo As Variant
    
    On Error Resume Next
    
    Intervalo = Replace(WorksheetFunction.VLookup( _
        Beneficio, Sheets("Benefício").[A:B], 2, 0), ";", ":")

    If Err.Number <> 0 Then
        Intervalo = False
    End If
    BuscaIntervalo = Intervalo
End Function

__________________________________________________________________

 

'EVENTO CHANGE OCULTAR/REEXIBIR LINHAS-TESTE

 

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Range("20:65").EntireRow.Hidden = True
    
    If Target.Address = "$D$9" Then
        Dim Intervalo As Variant
    
        Intervalo = BuscaIntervalo(Target.Value)
    
        If Intervalo <> False Then
            Range(Intervalo).EntireRow.Hidden = False
        End If
    End If

 

'Condição acrescentada ao CHANGE.
'Assim as linhas 63:65 serão exibidas para qualquer seleção que não tenha cadastro na planilha Benefício.

 

If Intervalo <> False Then
    Range(Intervalo).EntireRow.Hidden = False
Else
    Range("63:65").EntireRow.Hidden = False
End If


' Condição para a macro não exibir nenhuma linha quando o valor do benefício na coluna B for igual a N.


If UCase(Intervalo) <> "N" Then
    If Intervalo <> False Then
        Range(Intervalo).EntireRow.Hidden = False
    Else
        Range("63:65").EntireRow.Hidden = False
    End If
End If

End Sub

 

  • Veja que coloquei a função Function BuscaIntervalo(Beneficio As String) As Variant junto ao evento Change, ou seja, na mesma sheets (Pensão por morte), no editor VBA.

 ❓Isso é possível? Pode ser isso o problema?

 

Tá dando trabalho essas instruções! E eu também!🙄

 

 

 

TABELA BENEFÍCIO-INTERVALO.pdf

Link para o comentário
Compartilhar em outros sites

@Nilton Cézar Qual é a mensagem de erro? Aqui está funcionando sem problemas.

 

Talvez o erro seja no seu Change que deve ficar assim,

 

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Range("20:65").EntireRow.Hidden = True
    
    If Target.Address = "$D$9" Then
        Dim Intervalo As Variant
    
        Intervalo = BuscaIntervalo(Target.Value)
            
        If UCase(Intervalo) <> "N" Then
            If Intervalo <> False Then
                Range(Intervalo).EntireRow.Hidden = False
            Else
                Range("63:65").EntireRow.Hidden = False
            End If
        End If
    End If
End Sub

 

Se continuar dando erro anexe o arquivo.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Midori, continua dando mensagem de erro. Vou te mostrar o erro, na imagem, em anexo.

 

Acho que é melhor você enviar todo o código completo, com as retificações sugeridas. Ou seja,

 

a) com a condição acrescentada a Change, para exibir as linhas 63:65 para qualquer seleção que não tenha cadastro na planilha Benefício.

 

Em 08/04/2021 às 12:09, Midori disse:

Acrescente esta condição no Change e veja se resolve,


If Intervalo <> False Then
    Range(Intervalo).EntireRow.Hidden = False
Else
    Range("63:65").EntireRow.Hidden = False
End If

 

Assim as linhas 63:65 serão exibidas para qualquer seleção que não tenha cadastro na planilha Benefício.

 

 

b) com a instrução para não vai exibir nenhuma linha quando o valor do benefício na coluna B for igual a N.

 

3 horas atrás, Midori disse:

Para esses casos podemos escolher uma letra que vai identificar os tipos que devem ser desconsiderados.

 

Acrescente esta nova condição no IF,


If UCase(Intervalo) <> "N" Then
    If Intervalo <> False Then
        Range(Intervalo).EntireRow.Hidden = False
    Else
        Range("63:65").EntireRow.Hidden = False
    End If
End If

 

Assim a macro não vai exibir nenhuma linha quando o valor do benefício na coluna B for igual a N. Dessa forma você deve cadastrar com N os benefícios que não devem exibir nenhuma linha.

 

c) além de outros orientações, caso tenha omitido aqui.

 

Pois, não estou conseguindo fazer funcionar aqui direito.

 

 

bug.pdf

Link para o comentário
Compartilhar em outros sites

Midori, desculpe-me. Quando eu mandei, foi que percebi. 

 

Está funcionando direitinho mesmo! Ficou muito bom mesmo e bem profissional!

 

Mil desculpas.

 

Midori, para fechar por hoje:

 

DÚVIDA 1: sobre a instrução acrescentada ao Change, para exibir as linhas 63:65 para qualquer seleção que não tenha cadastro na planilha Benefício, SÓ PARA CONFIRMAR: quanto a isso, NÃO precisa fazer nenhum acréscimo à planilha Benefício, porque a própria condição cuida de apresentar as linhas 63 a 65. É isso mesmo?

 

DÚVIDA 2: Midori, pretendo bloquear algumas células do projeto com SENHA. Assim, mesmo que eu proteja algumas células das linhas ocultas, elas REEXIBIRÃO normalmente, ao escolher a ação/benefício?

 

DÚVIDA 3 : Podemos colocar a função Function BuscaIntervalo(Beneficio As String) As Variant junto ao evento Change, ou seja, na mesma sheets (Pensão por morte), no editor VBA?

 

Obrigado, Midori.

 

 

 

Link para o comentário
Compartilhar em outros sites

53 minutos atrás, Nilton Cézar disse:

DÚVIDA 1: sobre a instrução acrescentada ao Change, para exibir as linhas 63:65 para qualquer seleção que não tenha cadastro na planilha Benefício,

É isso mesmo, se não tiver cadastro na planilha Benefício a planilha vai exibir as linhas 63:65.

 

53 minutos atrás, Nilton Cézar disse:

pretendo bloquear algumas células do projeto com SENHA. Assim, mesmo que eu proteja algumas células das linhas ocultas, elas REEXIBIRÃO normalmente, ao escolher a ação/benefício?

Se bloquear terá que alterar o código para a macro desbloquear a planilha antes de exibir e bloquear depois.

 

53 minutos atrás, Nilton Cézar disse:

Podemos colocar a função Function BuscaIntervalo(Beneficio As String) As Variant junto ao evento Change, ou seja, na mesma sheets (Pensão por morte), no editor VBA?

Pode sim.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, Midori.

 

Passei o final de semana revendo as mensagens do tópico e quebrando cabeça montando as macros selecionadas, no projeto, e fazendo exaustivos testes.

 

➡️  Midori, por favor, se possível, gostaria de uma macro para FECHAR E SALVAR AUTOMATICAMENTE todo o projeto (com todas as guias).

 

Isso deixaria o projeto com cara de aplicativo.

 

_______________________________________________________________________

 

 

⚠️ Pois bem, estou com um PROBLEMINHA no ajuste dos textos pré-definidos às células. Vou explicar.

 

Quando o TEXTO escolhido é GRANDE, todo seu conteúdo NÃO fica visível na respectiva célula da tabela. Acho que você já pôde perceber no arquivo que te enviei anteriormente.

 

Já apliquei o recurso de Quebra de Texto Automática, na célula (clicando em Página Inicial > ícone Quebrar Texto Automaticamente), porém o texto não se ajusta na célula. Acredito que o formato tabela NÃO permite esse alinhamento automático do texto à célula.

 

Manualmente é possível fazer esse alinhamento arrastando a altura da linha correspondente para encontrar o melhor ajuste.

 

Contudo, confesso que não gostaria de deixar visível os números das linhas e as letras das colunas. Além disso, uma macro iria ser bem interessante para um usuário leigo fazer isso, bem como o projeto fica mais elegante.

 

➡️  Diante disso, Midori, teria uma macro capaz de deixar visível todo conteúdo nas células, ajustando automaticamente as respectivas linhas.

 

Nesse caso, seria uma macro vinculada apenas à tabela.

 

🤔  Se possível, Midori, creio que, melhor do que aplicar a uma linha individualmente, mais interessante seria fazer o ajuste automático de TODAS as linhas da tabela. 

 

Confesso que já estou cansado. Não vejo a hora de concluir esse projeto (acredito que você também não vê a hora de se livre de minhas importunações!). Já faz um tempinho que estou me dedicando a isso.

 

Mais uma vez agradeço sua infinita paciência, Midori.

 

Link para o comentário
Compartilhar em outros sites

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