s vezes, @NumberFormat retorna o valor errado com datas e horas
Parece que toda semana mais ou menos alguém posta uma pergunta sobre datas que estão sendo convertidas (corrompidas?) Para o formato americano. Como muitos outros, tentei ajudar, mas o problema é ilusório. Agora me pergunto se descobri a causa.
Estou trabalhando em um aplicativo no qual preciso extrair dados de uma planilha do Excel e produzi-los como cadeias formatadas para corresponder ao valor que o usuário do Excel pode ver. Portanto, se o valor for "1" formatado para exibir "1,00", desejo que a string seja "1,00".
Consigo esse efeito testando o valor da célula como um número, data ou hora. Se for, recupero o formato numérico e o uso para formatar o valor da célula para:
With .Cells(Row, Column)
Output string = Format(.Value, .NumberFormat)
End With
Na maioria dos casos, isso me dá exatamente a saída necessária. No entanto, às vezes recebo datas e horários americanos em que a fonte é formatada como data ou hora do Reino Unido.
pós muitas experiências com o Excel 2003 e o Excel 2007, descobri a causa. (Não tenho acesso ao Excel 2010, mas, a partir das perguntas que deduzo, ele tem o mesmo problema.) Essa pergunta visa, em parte, revelar esse problema ao mundo porque não consigo descobrir nada na internet para indicar que mais alguém o tenha notado. . (Sem dúvida, alguém responderá que pesquisou “xyz” no Google e obteve a resposta imediatamente.) No entanto, o principal objetivo desta pergunta é buscar sugestões para obter o resultado necessário em todas as situaçõe
Normalmente, insiro datas como, por exemplo, "23mar12". O Excel reconhece isso como uma data e o formata como "23 de março de 12". Eu posso selecionarFormat Cells
e insira ou selecione um formato personalizado ou selecione um dos formatos de data para que eu possa ter qualquer formato que possa querer incluir nomes em inglês por dias e meses.
No entanto, em um caso, o formato selecionado não é o formato gravado: O formato personalizado "dd / mm / aaaa" é gravado como formato de data "* 14/03/2001". Obviamente, isso não é um problema até mais adiant
Criei uma coluna de datas e horas e formatei cada uma com um formato personalizado ou padrão diferente. Eu escrevi uma macro para extrair o NumberFormat para cada uma dessas datas e horas e escrevê-lo como uma string em uma coluna adjacente. Também formatei o valor usando o formato numérico e escrevi essa string em uma terceira colun
Em vários casos, o formato selecionado e registrado pelo Excel não era o formato retornado por NumberFormat:
Excel format NumberFormat
Date: * 14/03/2001 m/d/yyyy
Date: * 14 March 2001 [$-F800]dddd, mmmm dd, yyyy
Date: 14/03/2001 dd/mm/yyyy;@
Date: 14/03/01 dd/mm/yy;@
Date: 14/3/01 d/m/yy;@
Date: 14.3.01 d.m.yy;@
Date: 2001-03-14 yyyy-mm-dd;@
Date: 14 March 2001 (1) [$-809]dd mmmm yyyy;@
Date: 14 March 2001 (2) [$-809]d mmmm yyyy;@
Custom: hh:mm:ss h:mm:ss
Time: * 13:30:55 [$-F400]h:mm:ss AM/PM
Time: 13:30:55 (1) hh:mm:ss;@
Time: 13:30:55 (2) h:mm:ss;@
Time: 01:30:55 PM [$-409]hh:mm:ss AM/PM;@
Time: 1:30:55 PM [$-409]h:mm:ss AM/PM;@
Os valores (1) e (2) na coluna formato Excel foram adicionados por mim para indicar que existem dois formatos aparentemente idênticos. Como pode ser visto na coluna NumberFormat, em cada caso a segunda versão suprime um zero inicia
A maioria das alterações não tem efeito importante. "[$ -F800]" e assim por diante são aparentemente valores fictícios sem efeito. Aparentemente, você pode substituir “F800” por um código de país da Microsoft para que os nomes de dias e meses sejam traduzidos para o idioma desse país.
No entanto, os três formatos padrão que a Microsoft marca com um asterisco são alterados inaceitavelmente. As datas são alteradas de little endian para middle endian; o horário é alterado de 24 para 12 horas e o dia da semana foi adicionado a "* 14 de março de 2001".
O asterisco com relação às datas, referencia o comentário: “Exceto pelos itens que possuem um asterisco ) na lista Tipo (guia Número, caixa de diálogo Formatar Células), os formatos de data aplicados não alteram as ordens de datas com o sistema operacional. ”O asterisco em relação ao horário faz referência ao comentário:“ Exceto para itens que possuem um asterisco ) na lista Tipo (guia Número, caixa de diálogo Formatar células), os formatos de hora aplicados não alternam as ordens de tempo com o sistema operacional. ”
Se for necessário, posso avisar meus usuários que os formatos padrão de data e hora podem não dar o resultado desejado. No entanto, se eles desejam o formato popular “dd / mm / aaaa”, eles não podem tê-lo. "Dd-mm-aaaa", por exemplo, está OK, mas o formato personalizado "dd / mm / aaaa" se torna o formato de data "* 14/03/2001" se torna "m / d / aaaa".
Retornando ao meu ponto de abertura: esse tratamento estranho de um formato de data específico é o motivo pelo qual muitas pessoas afirmam que suas datas às vezes estão sendo convertidas para o formato americano e é por isso que o problema é tão esquivo? Encontrei esse tipo de problema em outro lugar de um grupo de programadores da Microsoft sem saber o que outro grupo está fazendo. É por isso que algumas funções sempre funcionam e outras às vezes não? Alguns programadores da Microsoft sabem onde procurar o formato correto e outros não?
Mais importante, para mim, alguém pode sugerir:
Como obtenho o formato verdadeiro de data ou hora?Alguma outra maneira de determinar o formato de exibição escolhido pelo usuário para uma data ou hora?BTT 1: Lembro-me que há trinta anos atrás me disseram que os militares americanos não usam o formato mês / dia / ano; apenas civis americanos usam esse formato. Alguém pode me dizer se isso é verdade?
BTW 2: O problema semelhante é com as cores do Excel. O Excel mantém suas cores como "ggbbrr", enquanto todo mundo as mantém como "rrggbb". Os programadores da interoperabilidade .Net Excel não foram informados e não reverteram o número de cores do Excel antes de usá-lo para controlar a tel