Jump to content

Recommended Posts

Posted (edited)

Bom dia!

há quem se disponha a ajudar um autodidacta maçarico?

o problema é o seguinte:

Estou a tentar fazer com que uma linha no Excel, que tem um incremento de datas que representa o dia 29/fev/aa, fique oculta, a ideia é a seguinte a célula estaria oculta enquanto o ano não mudar para bissexto , e quando fosse bissexto voltaria a ficar visível.

Já tentei de variadas formas mas a minha dificuldade, ou aselhice veio ao de cima, e fez com que eu não consiga resolver este problema, estou convicto que a grande maioria dos utilizadores deste fórum o resolvem com certa facilidade.

Desde já um grande OBRIGADO a QUEM se der ao trabalho de me ajudar.

Edited by José luis leal
Posted

José luis leal,

Bom Dia!

Como você não dá muitos detalhes da sua planilha, vou fazer suposições, pois em programação, os mínimos detalhes são importantíssimos:

1 - Supondo que a linha que você quer ocultar seja a linha

2 - Supondo que seu ficheiro se chama Teste.xlsm

3 - Supondo que a Guia onde você tem essa linha 5 que quer ocultar se chame Folha1

4 - Supondo que o cabeçalho dos seus dados começa na linha 1

5 - Supondo que as linhas restantes começa na linha 2

6 - Supondo que os dados começam na coluna A

7 - Supondo que os dados vão até a coluna G

8 - Supondo que os dados vão até a linha 10

9 - Supondo que a data de 29/02/aa esteja na célula B5

Assim, a primeira coisa que você precisa fazer é utilizar uma função que lhe diga se o ano da célula onde está a data de 29/02/aa é um ano Bissexto. Você passa esse ano para a função e ela lhe devolverá TRUE se ano for Bissexto e FALSE se o ano não for Bissexto. Eu utilizo uma função como esta:

Public Function Bissexto(intAno As Integer) As Boolean

  '====================================================================================
   'FUNÇÃO DESENVOLVIDA POR WAGNER MOREL EM 08/06/2014 QUE FAZ A VERIFICAÇÃO SE UM ANO _
   É BISSEXTO OU NÃO
   '====================================================================================

   'Inicializa a função como Falsa
   Bissexto = False

   'Pega o ano passado e verifica se o resto da divisão dele por 4 é igual a Zero
   If intAno Mod 4 = 0 Then
    'Caso positivo, verifica se o resto da divisão desse ano por 100 também é igual a Zero
    If intAno Mod 100 = 0 Then
	    'Caso positivo,verifica se o resto da divisão desse ano por 400 também é igual a Zero
	    If intAno Mod 400 = 0 Then
		    'Caso positivo é porque o ano é um ano Bissexto. atribui verdadeiro à função
		    Bissexto = True
	    End If
    Else 'Se a divisão do ano por 100 não for igual a zero, o ano também é Bissexto.
		  Bissexto = True
    End If
   End If
End Function

Depois, na sua planilha, você pode ter um módulo que chame a função Bissexto para testar os anos que você quiser e Ocultar as linhas correspondentes que tiverem anos Bissextos, como esse código abaixo:

Sub OcultarLinhas()
   'Cria variável contadora do tipo Long que armazenará as iterações do laço FOR
   Dim i As Long

   'Cria variável do tipo Long que armazenará o número da ùltima linha com dados da planilha
   Dim UltimaLinha As Long

   'Desabilita as atualizações de tela do Excel
   Application.ScreenUpdating = False

   'Armazena na variável o número da última linha com dados pela coluna A
   UltimaLinha = Sheets("Folha1").Cells(Cells.Rows.Count, 1).End(xlUp).Row

   'Inicia o laço para percorrer todas as linhas da planilha
   For i = 2 To UltimaLinha
    'Passa o ano contido em cada uma célula da coluna B e verifica se esse ano é Bissexto ou não
    If Bissexto(CInt(Year(Range("B" & i).Value))) = True Then
	    'Se o ano for Bissexto, seleciona a linha correspondente
	    Rows(i & ":" & i).Select
	    'Oculta a linha correspondente
	    Selection.EntireRow.Hidden = True
    End If
   Next

   'Seleciona a célula A1
   Range("A1").Select

   'Volta a habilitar as atualizações de tela do Excel
   Application.ScreenUpdating = True

   'Exibe mensagemde Sucesso da ocultação de linhas que tenham ano Bissexto
   MsgBox "Linhas com Ano Bissexto fora Ocultadas!", vbDefaultButton1, "OCULTAR LINHAS"
End Sub

Esse foi um pequeno exemplo que fiz em razão da ausência de dados mais concretos e reais seus. Todavia, acredito que você possa fazer as necessárias adatpações. Veja que no exemplo, estou ocultandom apenas a linha 5 que [e a única que tem uma data de um ano Bissexto. Você pode alterar as datas e fazer vários testes. Para voltar a exibir novamente as linhas, basta selecioná-las, clicar com o botão direito do mouse em cima da seleção e escolher Reexibir no menu suspenso que surge.

Para melhor entendimento, faça o Download do exemplo no link abaixo:

http://www.sendspace.com/file/lx6c9p

Espero que seja isso e que tenha lhe ajudado!

Posted (edited)

Boa tarde!

Wagner Morel,

Muito Obrigado pela sua resposta,

Funciona na perfeição, mas, tenho mais uma questão, será possível atribuir, a macro a uma célula, em vez do botão?

Célula essa que será onde eu irei colocar o ano. e sempre que essa célula for editada corre a macro.

Edited by José luis leal
Posted

Sim José Luís! É possível.

Imaginemos que você colocará o ano na célula B3 da Folha1. Então, basta que você coloque o seguinte código no evento WorkSheet_Change da Folha1, no caso do mesmo exemplo que lhe enviei.

Private Sub Worksheet_Change(ByVal Target As Range)

   'Desabilita os eventos automáticos da Folha
   Application.EnableEvents = False

   'Cria variável contadora do tipo Long que armazenará as iterações do laço FOR
   Dim i As Long

   'Cria variável do tipo Long que armazenará o número da ùltima linha com dados da planilha
   Dim UltimaLinha As Long

   'Desabilita as atualizações de tela do Excel
   Application.ScreenUpdating = False

   'Verifica se a célula ativa modificada (a que recebeu dado) é a célula do ano (B3)
   If Target.Address = "$B$3" Then

	 'Armazena na variável o número da última linha com dados pela coluna A
	 UltimaLinha = Sheets("Folha1").Cells(Cells.Rows.Count, 1).End(xlUp).Row

	 'Inicia o laço para percorrer todas as linhas da planilha
	 For i = 2 To UltimaLinha
			 'Passa o ano contido em cada uma célula da coluna B e verifica se esse ano é Bissexto ou não
			 If Bissexto(CInt(Year(Range("B" & i).Value))) = True Then
					 'Se o ano for Bissexto, seleciona a linha correspondente
					 Rows(i & ":" & i).Select
					 'Oculta a linha correspondente
					 Selection.EntireRow.Hidden = True
			 End If
	 Next

	 'Seleciona a célula A1
	 Range("A1").Select

	 Application.EnableEvents = True

	 'Volta a habilitar as atualizações de tela do Excel
	 Application.ScreenUpdating = True

	 'Exibe mensagemde Sucesso da ocultação de linhas que tenham ano Bissexto
	 MsgBox "Linhas com Ano Bissexto foram Ocultas!", vbDefaultButton1, "OCULTAR LINHAS"
   End If
End Sub

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.