Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por SandroLima 12 Jan 2019 às 20:42
Membro 5 Estrelas
Mensagens: 532
Reputação: 7
#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.
Apenas usuários registrados podem ver ou baixar anexos.
Por babdallas 12 Jan 2019 às 22:03
Membro 5 Estrelas
Mensagens: 1652
Reputação: 735
#40074
Veja se é isso.
Apenas usuários registrados podem ver ou baixar anexos.
Por babdallas 12 Jan 2019 às 22:06
Membro 5 Estrelas
Mensagens: 1652
Reputação: 735
#40075
Adicionei um condição para verificar se o que foi digitado é uma data.
Apenas usuários registrados podem ver ou baixar anexos.
Por SandroLima 12 Jan 2019 às 22:37
Membro 5 Estrelas
Mensagens: 532
Reputação: 7
#40078
Exatamente, babdallas... sempre me ajudando.

Adaptei aqui para minha planilha e funcionou perfeitamente para minha necessidade.
Código: Selecionar todosPrivate 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 todosIf Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then

Código: Selecionar todosApplication.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))


Para meu aprendizado/entendimento?

Mais uma vez obrigado.
Por SandroLima 12 Jan 2019 às 23:04
Membro 5 Estrelas
Mensagens: 532
Reputação: 7
#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.
Por babdallas 12 Jan 2019 às 23:20
Membro 5 Estrelas
Mensagens: 1652
Reputação: 735
#40080
Veja agora.
Apenas usuários registrados podem ver ou baixar anexos.
Por babdallas 12 Jan 2019 às 23:32
Membro 5 Estrelas
Mensagens: 1652
Reputação: 735
#40081
Código: Selecionar todosIf 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 todosApplication.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 todosPrivate 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 todosIf Not Application.Intersect(Target, TabelaConsulta.ListColumns("Data").DataBodyRange) Is Nothing And VBA.IsDate(Target.Value2) Then

Código: Selecionar todosApplication.WorksheetFunction.Proper(VBA.Format(Target.Value2, "mmmm"))


Para meu aprendizado/entendimento?

Mais uma vez obrigado.