Ir ao conteúdo
  • Cadastre-se
JOAO BATISTA DEJANO

Excel manipular partes da celula do excel pelo vba

Posts recomendados

Ola Pessoal!

Eu sei que isso para vocês será brincadeira, mas para mim ta sendo o fim do mundo.

Fiz uma macro para manipular partes de uma celula do excel usando o vba assim:

 

Sub nascimento()
firstcel = Left(Range("D4"), 2)
midcel = Mid(Range("D4"), 3, 2)
finalcel = Right(Range("D4"), 4)
celula = firstcel & "/" & midcel & "/" & finalcel
Range("D4") = celula

End sub

 

Quando eu digito 15032019 na celula D4 deveria aparecer na mesma o seguinte: 15/03/2019

No entanto aparece: 15////2019

Ja fiz usando essas quatro variaveis,  ja fiz sem as variaveis e o resultado é o mesmo.

Só consegui fazer aparecer 15/3/2019 mudando a midcel assim: midcel=Mid(Range("D4"),4,1)

Estou executando essa macro automaticamente quando altero a celula D4.

Alguem pode me da uma luz a respeito.

Agradecimentos antecipados

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem Pessoal!

Acabei de descobrir que isso é porque eu estou usando a mesma celula, tanto para pegar os dados como para retorna-los.

Se eu mudar o destino final, colocar a variavel celula em outro celula, como a D5 por ex. funciona. Mas eu queria colocar na D4 mesmo.

Vou tentando aqui.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite @JOAO BATISTA DEJANO

 

Experimente copiar o código abaixo e colar no módulo da planilha:

 

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    ' Função para entrar Datas sem usar "/"
    ' Por: JLM - José Luiz Martins em 28/08/2003
    Dim DateStr As String
    On Error GoTo EndMacro
    If Intersect(Target, Range("D4")) Is Nothing Then Exit Sub
    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
    
    Application.EnableEvents = False
    With Target
        If .HasFormula = False Then
            Select Case Len(.Formula)
                Case 4
                    DateStr = Left(.Formula, 1) & "/" & _
                    Mid(.Formula, 2, 1) & "/" & Right(.Formula, 2)
                Case 5
                    DateStr = Left(.Formula, 1) & "/" & _
                        Mid(.Formula, 2, 2) & "/" & Right(.Formula, 2)
                Case 6
                    DateStr = Left(.Formula, 2) & "/" & _
                        Mid(.Formula, 3, 2) & "/" & Right(.Formula, 2)
                Case 7
                    DateStr = Left(.Formula, 1) & "/" & _
                        Mid(.Formula, 2, 2) & "/" & Right(.Formula, 4)
                Case 8
                    DateStr = Left(.Formula, 2) & "/" & _
                        Mid(.Formula, 3, 2) & "/" & Right(.Formula, 4)
                Case Else
                    Err.Raise 0
            End Select
            .Formula = DateValue(DateStr)
        End If
    End With
    Application.EnableEvents = True
    Exit Sub
EndMacro:
    MsgBox "Você não entrou com uma data válida."
    Range(Target.Address).ClearContents
    Application.EnableEvents = True
End Sub

Se foi útil, clique em Curtir.

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal!!

Grande Patropi!! Obrigado pela ajuda.

Infelizmente amigo, essa macro não quis funcionar comigo. Acredito que eu tenha cometido algum erro. Sou muito principiante ainda. Eu não consegui ver onde ela direciona o resultado para a celula "D4". Não dá erro, mas não acontece nada também. Mas peguei uma ideia dela e funcionou. Ficou bem simples assim:

 

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target = "" Then Exit Sub
  If Len(Target) = 10 Then Exit Sub
   If Not Intersect(Target, Range("A3:J18")) Is Nothing Then

    Dim firstcel, midcel, finalcel, celula

     Select Case Target.Address
       Case "$I$3": Call data
        Case "$D$4": Call nascimento
          Case "$I$4": Call requerimento
            Case "$D$7": Call emprego_entrada
               Case "$G$7": Call emprego_saida
             Case "$E$9": Call especial_inicio
          Case "$G$9": Call especial_fim

       End Select
    End If
  End Sub

 

______________________________________________________________________________________________________

 

Sub nascimento()
     firstcel = Left(Range("D4"), 2)
           midcel = Mid(Range("D4"), 3, 2)
                   finalcel = Right(Range("D4"), 4)
         celula = firstcel & "/" & midcel & "/" & finalcel
     Range("D4") = celula
End Sub

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Eu penso que o programa fica fazendo um loop em cima da celula alvo (target). Assim e limitei o tamanho dela em 10 caracteres.

Agora vou continuar estudando a macro para colocar as verificações de erro que aparece com  a digitação.

Aceito sugestões

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 horas atrás, JOAO BATISTA DEJANO disse:

Acabei de descobrir que isso é porque eu estou usando a mesma celula, tanto para pegar os dados como para retorna-los.

Se eu mudar o destino final, colocar a variavel celula em outro celula, como a D5 por ex. funciona.

Não exatamente. O seu código "nascimento" funciona corretamente em D4 também. A desconfiguração do formato data (15////2019) provavelmente está ocorrendo posteriormente porque existe um código WS_Change que talvez esteja processando aquela célula mais de uma vez. Você só informou sobre a existência do código WS_Change no post #4.😕

Apesar de funcionar, o seu código "nascimento" insere um texto com aparência de data. Para converter o resultado em data acrescente uma cópia da linha abaixo.

[D4].TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, 4)

 

Segue um código que faz a conversão de um número existente em D4 (ddmmaaaa) em uma data real (dd/mm/aaaa).

Sub nascimento()
 [D4] = DateValue(Format([D4], "00\/00\/0000"))
End Sub

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Pessoal!!!

E aí grande mestre OsvaldoMP!!

Essa informação que você postou foi de grande valia. Já fiz vários testes com problemas que eu tive anterior  e me solucionou bem os problemas. Inclusive, deixaria a macro mais simples. Aprendi bastante. Mas uma coisa  que eu queria saber é como eu faço para mudar de formato americano para português brasileiro simples. Se houver, é claro. Ou seja: dd/mm/yyyy ao invés de mm/dd/yyyy. Ja verifiquei na net, tem, mais é um tanto quanto grande.

Agradecimentos antecipados!

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, JOAO BATISTA DEJANO disse:

... como eu faço para mudar de formato americano para português brasileiro ... dd/mm/yyyy ao invés de mm/dd/yyyy.

 

O comando que passei no post #5 resulta em dd/mm/aaaa. Se no seu caso o resultado é diferente então disponibilize uma amostra do seu arquivo Excel com TODOS os códigos existentes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Pessoal!!!

Saudações Mestrãos!!!

É o seguinte:

Nesse caso eu testei com o excel em branco. Abri o programa e só utilizei a célula D4 e G4 para depois eu fazer um datadif, para ver se ele calculava. Bem, eu consegui descobri o que estava errado. Se você formatar a célula como texto, ele da o resultado: mm/dd/yyyy. Se você formatar como geral ele da o resultado dd/mm/yyyy  que é o que eu quero. Se você formatar a célula como numero ele dá o resultado serial.  Mas para mim já valeu. Vou montar o resto da Macro dessa forma que economiza bastante comando. Quando eu salvar as entradas de dados inseridos e transporta-los para outra parte da planilha, eu formato as células como desejado. Vou postando aqui os erros e acertos.

Obrigado por equanto.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Pessoal!!!

Gente, me socorre aqui para eu tentar entender isso:

Eu fiz a seguinte rotina no vba:

 

    If Left((Range(Target.Address)), 2) > 31 Or Mid((Range(Target.Address)), 3, 1) <> "/" Then GoTo Erromsg
    If Mid((Range(Target.Address)), 4, 2) > 12 Or Mid((Range(Target.Address)), 4, 2) < 1 Then GoTo Erromsg
    If Mid((Range(Target.Address)), 6, 1) <> "/" Then GoTo Erromsg
   ' If Format(Range(Target), 0) < 14611 Then GoTo Erromsg
   ' If Format(Range(Target), 0) > Format(Range("J3"), 0) Then GoTo Erromsg
    
 
    Range("D20") = Format(Range("D4"), 0)
    
    Range("J20") = Format(Range("J3"), 0)

 

Nela eu verifico  se o terceiro e o 6 digito são iguais a barras (/). Se não for eu vou para mensagem de erro.

Tambem verifico se os dois primeiros caracteres é maior que 31 e os 4º e 5º é maior que 12.

Isso tudo funciona perfeitamente.

As duas linhas seguintes eu estava comparando datas, então tentei transforma-las em serial. Para eu saber se o formato funcionava eu coloquei as outras duas linhas que faz isso sem o if. Assim nessas células ( D20 e J20) aparece a data em serial. E funciona certinho. Mas se eu usar as duas linhas  de comparação das datas, alem delas não funcionar as outras que transforma em serial também não. Eu até ache que fosse por erro e o programa estava saltando para o Erromsg. Mas para checar isso eu coloquei no lugar da barra uma letra e assim ele deu a mensagem de erro  de digitação. "voce não digitou uma data valida"

Também transferir as duas linhas para a rotina de erromsg para ver se ai ala mudava a celula D20 ou J20 e nada. Alguem sabe para onde o programa está indo.

Agradecimentos antecipados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Junte-se à conversa

Você pode postar agora e cadastrar-se depois. Se você tem uma conta, faça o login para postar.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restore formatting

  Só é possível ter até 75 emoticons.

×   O link foi automaticamente convertido para mostrar o conteúdo.   Clique aqui para mostrá-lo como link comum

×   Seu texto anterior foi restaurado.   Limpar o editor

×   You cannot paste images directly. Upload or insert images from URL.






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!