Usuário com melhor resposta
Resultado da macro incoerente.

Pergunta
-
No Excel tenho a seguinte situação :
09/01/2015 00:04
9
1
2015
00:04:00
09/01/2015 00:05
9
1
2015
00:05:00
09/01/2015 00:05
9
1
2015
00:05:00
09/01/2015 00:06
9
1
2015
00:06:00
Na parte em azul temos a data e horas juntas. Ao lado temos mês, dia, ano e horas separadas. Foi usado Separador de Colunas passo a passo manualmente (Dados à Texto para Colunas à ...).
Então foi feita um macro seguindo passo a passo no item anterior. Abaixo o resultado após rodar a macro.
09/01/2015 00:04
1
9
2015
12:04:00
AM
09/01/2015 00:05
1
9
2015
12:05:00
AM
09/01/2015 00:05
1
9
2015
12:05:00
AM
09/01/2015 00:06
1
9
2015
12:06:00
AM
Observamos que a ordem do mês e dia alteraram e horas aparece no sistema americano.
Então para que rodemos um macro e que apresente o resultado do primeiro exemplo, qual(is) modificações devo fazer.
Segue abaixo o macro do segundo exemplo :
Sub Macro1()
'
' Macro1 Macro
''
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _
"/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
End Sub
Respostas
-
Olá!
Não sei quais modificações deveriam ser feitas no seu código, mas alternativamente você pode desenvolver outros métodos para realizar esta tarefa. Uma alternativa seria trabalhar com fórmulas na própria planilha com as funções DIA, MÊS, ANO e para a hora usar o valor da célula menos a parte inteira, por exemplo A1-INT(A1), com a célula formatada em horas. Com uma linha de fórmula desenvolvida bastaria arrastar para as demais e transformar em valores.
Ou então criar um outro método por código, como por exemplo:
Sub Data_Hora() Dim rCell As Excel.Range Application.ScreenUpdating = False Range("A1").Select Range(Selection, Selection.End(xlDown)).Select For Each rCell In Selection rCell.Activate ActiveCell.Offset(0, 1).FormulaR1C1 = Day(rCell.Value) ActiveCell.Offset(0, 2).FormulaR1C1 = Month(rCell.Value) ActiveCell.Offset(0, 3).FormulaR1C1 = Year(rCell.Value) ActiveCell.Offset(0, 4).FormulaR1C1 = rCell.Value - Int(rCell.Value) ActiveCell.Offset(0, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM" Next rCell Application.ScreenUpdating = True End Sub
Abraços!
Rafael Kamimura - http://excelmaniacos.com
- Sugerido como Resposta Hugo The Best segunda-feira, 14 de setembro de 2015 16:22
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quinta-feira, 5 de novembro de 2015 15:31
Todas as Respostas
-
Olá!
Não sei quais modificações deveriam ser feitas no seu código, mas alternativamente você pode desenvolver outros métodos para realizar esta tarefa. Uma alternativa seria trabalhar com fórmulas na própria planilha com as funções DIA, MÊS, ANO e para a hora usar o valor da célula menos a parte inteira, por exemplo A1-INT(A1), com a célula formatada em horas. Com uma linha de fórmula desenvolvida bastaria arrastar para as demais e transformar em valores.
Ou então criar um outro método por código, como por exemplo:
Sub Data_Hora() Dim rCell As Excel.Range Application.ScreenUpdating = False Range("A1").Select Range(Selection, Selection.End(xlDown)).Select For Each rCell In Selection rCell.Activate ActiveCell.Offset(0, 1).FormulaR1C1 = Day(rCell.Value) ActiveCell.Offset(0, 2).FormulaR1C1 = Month(rCell.Value) ActiveCell.Offset(0, 3).FormulaR1C1 = Year(rCell.Value) ActiveCell.Offset(0, 4).FormulaR1C1 = rCell.Value - Int(rCell.Value) ActiveCell.Offset(0, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM" Next rCell Application.ScreenUpdating = True End Sub
Abraços!
Rafael Kamimura - http://excelmaniacos.com
- Sugerido como Resposta Hugo The Best segunda-feira, 14 de setembro de 2015 16:22
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quinta-feira, 5 de novembro de 2015 15:31
-
Recomendo a solução do Rafael, ela vai evitar o problema que o VBA tem com datas. O VBA está considerando o formato mm/dd/aaaa ou dd/mm/aaaa dependendo do valor da data. Experimente alterar para um valor maior que doze o valor do mês, e verás que a lógica troca.
Thank you,
F. Schubert
System Administrator
MCP | Microsoft Certified Professional
MCTS 70-640 | Microsoft Certified Technology Specialist: Windows Server 2008 Active Directory, Configuration
MCTS 70-642 | Microsoft Certified Technology Specialist: Windows Server 2008 Network Infrastructure, Configuration
MCTS 70-643 | Microsoft Certified Technology Specialist: Windows Server 2008 Applications Infrastructure, Configuring
MCTS 70-680 | Microsoft Certified Technology Specialist: Windows 7, Configuration -
No sub acima (Data_Hora), o comando do dia apresenta como resultado o mes e o do mes o do dia.
12/08/2015 15:57 12/08/2015 17:05 12/10/2015 06:11 12/13/2015 21:08 12/13/2015 21:08 No exemplo acima, quando chega no dia 12/13/2015 as coisas se invertem.
No comando do dia aparece como dia e do mes como mes e não separa mais as horas e acusa erro.