Notifications
Clear all

Data com troca de dia por mês

8 Posts
3 Usuários
0 Reactions
2,650 Visualizações
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Bom dia,

Desenvolvi uma macro para analisar um ciclo de temperaturas em estufas, quando as mesmas passam os 80 ºC, onde devolvi a data e hora em que se manteve superior a este valor.
Após devolver a data e hora de inicio e fim do ciclo com temperatura superior a 80ºC, faz a diferença entre data e hora.
O que me está a acontecer apenas no último ciclo célula é que a colocar a data e hora aparece-me trocada o dia pelo mês, ou seja:
Data hora inicio: 31-10-2019 23:30
Data hora fim: 11-01-2019 05:45
Duração ciclo: ########

E este erro apenas acontece no último registo...
já verifiquei e não se verifica apenas em mudança do mês, mas também acontece em dias diferentes, em que troca o mês pelo dia...

abaixo imagem:
https://ibb.co/jf6KvMQ

Alguém pode ajudar como o VBA posso modificar para aparecer correctamente?
Alguma fórmula?

Pelo que consegui verificar, eu tenho um ficheiro que tem os dados no formato .csv que tem apenas uma coluna com os dados todos.
Quando utilizo o código abaixo para separar o texto em colunas, a data que inicialmente tenho:
12/11/2019 23:30 e 13/11/2019 05:30
fica-me posterirmente com este formato:
12-11-2019 23:30 e 13/11/2019 05:30
ou seja está a trocar os dias pelos meses na primeira data hora já desde aqui mantendo a formatação na segunda data hora..

Alguma sugestão de como trocar o código abaixo?

  Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=True, OtherChar:= _
        "|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

Obrigado desde já,
Pedro

 
Postado : 13/11/2019 5:43 am
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Sugestão:
Abra o arquivo ou copie alguns registros da coluna em outra planilha;
ative o gravador de macros.
depois selecione texto para colunas, assinale delimitado, e por ponto e virugla, proxima "pagina"
selecione, nessa pagina/formulario a coluna que deseja data (creio que no seu caso coluna B), nos radio button acima selecione data e "dma" no combo ao lado, depois em conluir. Em Array(2, 4) "informa" ao vba que o segundo Field (2,) (segunda coluna) os valores (,4) são data tipo data e dd/mm/yyyy)
Substitua a rotina gravada em sua macro

    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 4), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True
    Columns("B:B").ColumnWidth = 8.71
    Columns("B:B").EntireColumn.AutoFit
    Columns("A:A").EntireColumn.AutoFit

Reinaldo

 
Postado : 14/11/2019 11:23 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá,

Obrigado pela resposta.

Ao realizar a macro obtive o seguinte resultado:

Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 4), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
        (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
        Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
        33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
        Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
        46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), Array(51, 1), Array(52, 1), _
        Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array( _
        59, 1), Array(60, 1), Array(61, 1), Array(62, 1), Array(63, 1), Array(64, 1), Array(65, 1), _
        Array(66, 1), Array(67, 1), Array(68, 1), Array(69, 1), Array(70, 1), Array(71, 1), Array( _
        72, 1), Array(73, 1), Array(74, 1), Array(75, 1), Array(76, 1), Array(77, 1), Array(78, 1)) _
        , TrailingMinusNumbers:=True

Por estranho que parece a gravar a macro a data ficou no formato "dd-mm-aaaa", mas depois a compilar no código continuou a trocar o dia pelo mês!
Em vez de aparecer:11-12-2019 ficou 12-11-2019 e o dia 13/11/2019, manteve-se como 13-11-2019...

Estou a desesperar..

 
Postado : 14/11/2019 12:07 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Fica dificil qualquer ajuda sem o seu arquivo (pelo menos o .csv); visto que; em teoria; a proposta deveria ajustar a consversão.
Bem como a imagem disponibilizada há somente 12/11 e 13/11, assim aparentemente está correto.
Disponibilize seu .csv em algum site de compartilhamento tipo SendSpace, google drivre Mega... e informe aqui o link

Reinaldo

 
Postado : 14/11/2019 12:42 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

Pedro, tentei reproduzir aqui e de fato o excel não está reconhecendo a data corretamente, e isso normalmente resolvíamos com a formatação.

Mas vamos a algumas considerações :
Reinaldo, cheguei a digitar algumas linhas tentando reproduzir a questão, e veja o que obtive:
Fiz da forma que indicou, e na gravação da macro deu certinho, porém, limpei o resultado, formatação e tudo e rodei a macro novamente, e para minha surpresa o resultado foi da mesma forma que o Pedro expos, fiz varios testes regravei a macro e de fato a formatação do dia 13 não acompanha.

Vamos aguardar o envio do exemplo do Pedro para analisar melhor, meu tempo esta corrido aqui por causa do feriado, utilizei esses dados
1234567899;"13/11/2019 15:17:54";1;1;2;4;9
1234567899;"10/11/2019 15:17:54";1;1;2;4;6
1234567899;"11/11/2019 15:17:54";1;1;2;4;7
1234567899;"12/11/2019 15:17:54";1;1;2;4;8
1234567899;"13/11/2019 15:17:54";1;1;2;4;9
1234567899;"13/11/2019 15:17:54";1;1;2;4;1
1234567899;"14/11/2019 15:17:54";1;1;2;4;1
1234567899;"12/11/2019 15:17:54";1;1;2;4;12

As Macros gravadas alterando os tipos de datas foram essas:

Sub Macro3()
' Macro3 Macro
    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 4), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1)), TrailingMinusNumbers:=True
End Sub

Sub Macro4()
' Macro4 Macro
    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 3), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1)), TrailingMinusNumbers:=True
End Sub

[]s
Mauro Coutinho

 
Postado : 14/11/2019 12:56 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Talvez, eu não entendi direito; tambem não aprofundei testes para saber/ver se a hora incorporada afeta a conversão/importação
A inversão de dia/mes acorre tão somente quando os valores estiverem entre 1 e 12
Ex.: 01/11 pode ser entendido como 11/01
Para valores acima de 12;sempre será interpretado como dia, assim 11/12 (onze de dezembro) pode ser entendido 12/11(doze de novembro), mas 11/13 sempre será considerado dia 13 mes novembro.
Agora na conversão de datas via Texto para colunas:
Array(x,1) considera coluna como geral
Array(x,2) considera coluna exclusivamente Texto
Array(x,3) considera data formato MM/dd/aaaa
Array(x,4) considera data formato dd/mm/aaaa
Array(x,5) considera data formato aaaa/mm/dd
Array(x,6) considera data formato mm/aaaa/dd
Array(x,7) considera data formato dd/aaaa/mm
Array(x,8) considera data formato aaaa/dd/mm
Array(x,8) Desconsidera coluna - Não importa/converte
se a data recebida estiver no formato DD/MM/AAAA o array deve ser (X,4)
se a data recebida estiver no formato mm/dd/aaaa o array deve ser

Nova sugestão: marque a coluna como Texto (Array(x,3)) e depois da importação verifique manualmente, separando a hora da data

Reinaldo

 
Postado : 14/11/2019 1:47 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá,

coloco neste endereço o ficheiro .csv, do exemplo que me dá erro para que possam pf analisar.

https://www.sendspace.com/file/els1rw

Creio que não é por ter o código para o utilizador ter de selecionar o ficheiro .csv que esteja aí a origem do erro:

sCSVFullName = Application.GetOpenFilename("CSV Files (*.csv), *.csv", , _
      "Select a CSV file", , False)
     
      Dim wb As Workbook
  Workbooks.Open sCSVFullName
  Set wb = ActiveWorkbook
 
  Dim sWbkFullName As String, sFileRoot As String
  sFileRoot = Left$(sCSVFullName, InStrRev(sCSVFullName, ".") - 1)

Obrigado!

 
Postado : 14/11/2019 2:48 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Experimente:
Altere o trecho da rotina conforme abaixo

     'wb.SaveAs sWbkFullName, xlWorkbookDefault
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 2), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
            Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
            ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
            (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
            Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
            33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
            Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
            46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), Array(51, 1), Array(52, 1), _
            Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array( _
            59, 1), Array(60, 1), Array(61, 1), Array(62, 1), Array(63, 1), Array(64, 1), Array(65, 1), _
            Array(66, 1), Array(67, 1), Array(68, 1), Array(69, 1), Array(70, 1), Array(71, 1), Array( _
            72, 1), Array(73, 1), Array(74, 1), Array(75, 1), Array(76, 1), Array(77, 1), Array(78, 1)) _
            , TrailingMinusNumbers:=True
For x = 2 To (Cells(Rows.Count, 1).End(xlUp).Row)
    Cells(x, 2).Value = CDate(VBA.Left(Cells(x, 2).Value, 10)) * 1 + CDate(VBA.Right(Cells(x, 2), 8)) * 1
Next
    Columns("B:B").Select
    Selection.NumberFormat = "dd/mm/yyyy hh:mm:ss"
       Cells.Select

Reinaldo

 
Postado : 14/11/2019 10:26 pm