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

questionAnswers(6)

yourAnswerToTheQuestion