Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
#40071
Boa tarde, colegas.

Preciso de ajuda em duas tarefas.

Tenho um código que insere o ano da data de hoje em uma célula (intervalo nomeado) e o mês em outro intervalo.

Na primeira necessidade o mês está sendo inserido no formato numérico (1, 2, 3....) e preciso que retorne na forma de texto (Janeiro, Fevereiro, ...) com a primeira letra maiúscula.
Coloquei formatação personalizada (MMMM) mas retorna com a primeira letra minúscula.

Minha segunda necessidade (acho que a partir de um evento change) é que a partir do intervalo com a data de referência (está apontada na tabela) os intervalos com ano de referência e mês de referência sejam alterados.

Como faço isso?

Segue planilha anexa. Obrigado a quem puder colaborar.
Você não está autorizado a ver ou baixar esse anexo.
#40074
Veja se é isso.
Você não está autorizado a ver ou baixar esse anexo.
#40075
Adicionei um condição para verificar se o que foi digitado é uma data.
Você não está autorizado a ver ou baixar esse anexo.
#40078
Exatamente, babdallas... sempre me ajudando.

Adaptei aqui para minha planilha e funcionou perfeitamente para minha necessidade.
Código: Selecionar todos
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim TabelaConsulta As ListObject
        
    Set TabelaConsulta = wshAtivDiarias.ListObjects("TB_ConsultaAtivCadastrada")
    
    If Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then
        With wshPlanAuxiliar
            .Range("Ano_Referencia").Value2 = VBA.Year(Target.Value2)
            .Range("Mes_Referencia").Value2 = Application.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))
        End With
        
    End If
End Sub
Mas para mim esse código é novidade... eu ainda não havia aplicado aqui...

Pode fazer um breve comentário na leitura desses 2 trechos:
Código: Selecionar todos
If Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then
Código: Selecionar todos
Application.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))
Para meu aprendizado/entendimento?

Mais uma vez obrigado.
#40079
Estranho...

Quando não acrescentei a sua condição para verificar se é uma data funcionou... mas quando coloquei a condição não funcionou.

Nem para quando coloco uma data tipo 14/04 e ele completa 14/04/2019 e nem para quando coloco a data completa , por exemplo 17/06/1999.
#40080
Veja agora.
Você não está autorizado a ver ou baixar esse anexo.
#40081
Código: Selecionar todos
If Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value) Then
Este trecho acima primeiro verifica se a célula alterada (Target) a Coluna Data da Tabela tem interseção, ou seja, se a célula alterada faz parte da coluna Tabela. Se não for da coluna Data, esta interseção retornará nothing. Por isso, verifico se não (usando o Not) é nothing.
A outra verificação é se o que foi alterado é data. Não funcionou da outra vez porque usei a propriedade Value2 ao invés de Value do Target. O Value2 pega o número serial da data, tirando ele do formato data, o que dá errado o teste se é data (usando VBA.IsDate ==> Função da biblioteca do VBA). POr isso no último arquivo que enviei alterei para a propriedade Value dentro do teste da data.
Código: Selecionar todos
Application.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))
O trecho acima usa a função Pri.Maiúscula do Excel (Proper em Inglês) e a função Format da biblioteca do VBA. A Função Pri.Maiúscula é responsável por deixar a primeira letra após um espaço em braço na sua forma maiúscula.
A função Format do VBA formata a data para o nome do mês (formato mmmm). É semelhante à função TEXTO do Excel.
SandroLima escreveu:Exatamente, babdallas... sempre me ajudando.

Adaptei aqui para minha planilha e funcionou perfeitamente para minha necessidade.
Código: Selecionar todos
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim TabelaConsulta As ListObject
        
    Set TabelaConsulta = wshAtivDiarias.ListObjects("TB_ConsultaAtivCadastrada")
    
    If Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then
        With wshPlanAuxiliar
            .Range("Ano_Referencia").Value2 = VBA.Year(Target.Value2)
            .Range("Mes_Referencia").Value2 = Application.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))
        End With
        
    End If
End Sub
Mas para mim esse código é novidade... eu ainda não havia aplicado aqui...

Pode fazer um breve comentário na leitura desses 2 trechos:
Código: Selecionar todos
If Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then
Código: Selecionar todos
Application.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))
Para meu aprendizado/entendimento?

Mais uma vez obrigado.
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord