Notifications
Clear all

Erro em Macro para substituir de caracteres

6 Posts
2 Usuários
0 Reactions
2,148 Visualizações
(@pedrohlo)
Posts: 14
Eminent Member
Topic starter
 

Bom dia a todos.
Estou com um problema que me bati para achar uma solução no VBA. Porém gostaria de saber se há alguma solução mais simples dentro do próprio VBA.

PROBLEMA

Todos os relatórios que extraio do SAP para o Excel, as datas são exibidas com "." ao invés de "/" (ex.: 09.04.2014). Os relatórios são muito grandes, 50 mil linhas aproximadamente.

SOLUÇÃO 01 – Erro

Criei uma macro para simplesmente substituir "." por "/" [Selection.Replace What:=".", Replacement:="/"], porém algumas datas ficam no formato mm/dd/aaaa e outras no formato dd/mm/aaaa. Neste caso, não consigo aplicar uma formatação de data americana para corrigir, pois cada data ficou em um padrão diferente.

Porém se eu substituir "." por "/" sem a Macro, com a função crtl+U manualmente, as datas ficam todas corretas e em um padrão. Mas eu preciso que seja feita a função na macro para automatizar todas as outras mudanças que preciso do relatório.

SOLUÇÃO 02 - Erro

Procurei outras alternativas de substituição para ver se as datas ficavam em um único padrão.
Consegui com a Função "SUBSTITUIR", então inseri uma coluna em branco ao lado da coluna de datas, inseri a função e fiz a macro repetir até a última célula.

Porém as células não foram reconhecidas como data, teria que pressionar F2 em todas elas para serem atualizadas e serem reconhecidas como data pelo excel. O relatório passa de 50 mil linhas, sendo inviável fazer manualmente.

SOLUÇÃO 03 – Erro

Para atualizar as células, eu poderia simplesmente substituir “/” pela própria “/”. Seu eu fizer manualmente, ela funciona. Mas se fizer essa substituição na MACRO [Selection.Replace What:=".", Replacement:="/"] não funciona, incrível!!!

SOLUÇÃO 04

Então coloquei uma macro para atualizar todas as células desta coluna. Ela basicamente faz o que seria apertarmos F2+Enter, para atualizar todas as células da coluna.

PERGUNTA

- Esta macro que utilizei, é a única solução? Existe alguma macro mais simples para eu substituir os caracteres, com exceção tradicional da “Selection.Replace What:=".", Replacement:="/"”?

A macro, apenas com esta parte de data para uma única coluna, ficou conforme abaixo.

Não sei exatamente utilizar as funções do VBA com “dim”, por isso visualizei vários tópicos e juntei macros que vi para fazer a macro abaixo. Ela funciona, porém é um pouco demorada, conforme a quantidade de linhas.

Anexo segue um modelo do relatório que eu tiro no SAP.

MACRO CRIADA
- Coluna “F” com as datas
- Inserir uma coluna em branco a direita da coluna “F”
- Aplicar a formula de substituir na coluna em branco (“G”) e aplicar até a última célula
- Colar valores para retirar as fórmulas e formatar como data
- Colar as novas datas na coluna “F”
- Atualizar todas as células da coluna “F” para que o excel reconheça os novos valores como data


    Columns("G:G").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Dim Source1 As Worksheet
Dim Cell As Range
Set Source1 = Sheets("ZFI029")
For Each Cell In Source1.Columns("F").Cells.SpecialCells(xlCellTypeConstants)
    Cell.Offset(0, 1).Select
    ActiveCell.Value = "=SUBSTITUTE(RC[-1],""."",""/"")"
Next Cell

    Columns("G:G").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Selection.NumberFormat = "m/d/yyyy"
    Columns("F:F").Select
    Selection.Delete Shift:=xlToLeft
    
    Range("F1").Select
    
    Dim lastRow As Long, X As Long, col As Long

    col = Selection.Column
    lastRow = Cells(Cells.Rows.Count, col).End(xlUp).Row

    For X = 1 To lastRow
    Cells(X, col).Select
    mFormula = ActiveCell.FormulaLocal
    ActiveCell.FormulaLocal = mFormula
    Next

 
Postado : 09/04/2014 10:04 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Já tentou substituir
dessa forma

Sub teste_11251()
Dim Rng As Range

Set Rng = Range("G2:G90000")

With Rng
.NumberFormat = "dd/mm/yyyy"
.Value = .Value
End With

End Sub
 
Postado : 09/04/2014 10:17 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 


Tentou com a função DateSerial (Year, Month, Day), buscando as referências com Mid(string, start, length) ?

 
Postado : 09/04/2014 10:25 am
(@pedrohlo)
Posts: 14
Eminent Member
Topic starter
 

Alexandre, Boa tarde.

Infelizmente não funcionou.
Ela também não substitui os "." por "/", utilizei ela para formatar as datas depois de substituidas, para que o excel reconheça os valores como datas.
Mas metade das células da coluna G ficaram sem serem formatadas, da linha 9mil a 19mil. (obs.: alterei para aplicar até a linha 50 mil)

Estou tentando anexar a planilha mas não consigo anexar nada no forum, anexo o arquivo e quando carrego apaga toda minha mensagem e o arquivo não carrega.

Edson, Boa tarde.

Como utilizo esta função na coluna f?

 
Postado : 09/04/2014 10:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Normalmente a melhor maneira é corrigir os dados na importação dos dados, porem como diz--> " ...extraio do SAP para o Excel...", não dá para saber como e feita a aquisição dos dados.
Então creio que a melhor maneira de "corrigir" é utilizando a função nativa do Excel -->Texto para Colunas .
Selecione a coluna a ser "tratada" (uma coluna por vez), vá no menu superior --Dados e depois -- Texto para colunas -- -->clique em avançasduas vezes-- nessa terceira tela selecione o radio button "Data" e no combo ao lado o tipo de data adequado ao dado recebido(DMA -Dia Mes Ano; MDA- Ano Dia mes etcc...), clique concluir.

 
Postado : 09/04/2014 11:37 am
(@pedrohlo)
Posts: 14
Eminent Member
Topic starter
 

Reinaldo, Boa tarde.

Muito Obrigado pela ajuda. Era mais simples do que pensei. Utilizava esta opção de dados para outras coisas, principalmente para importar arquivos txt.
Desta maneira somente coloco na macro este comando e não preciso fazer milhões de coisas para o excel reconhecer as datas.
Ficou perfeito.

Edson,
Acho que era isso que você queria me dizer né? Obrigado pela ajuda também.

Abs,
Pedro.

 
Postado : 09/04/2014 12:07 pm