Como impedir que o Excel use as configurações regionais do SO para padrões de data em fórmulas

21

De acordo com esta pergunta , tenho o seguinte problema:

Quero usar alguma função do Excel (não a formatação da célula) como TEXT (A1, {date_pattern})

Mas a pessoa que respondeu à minha pergunta anterior me fez descobrir que o padrão de data muda de acordo com as Configurações Regionais do Windows.

No entanto, meu sistema operacional (Windows 7) também está em inglês e o pacote Office. Ao examinar minhas configurações regionais, ele mostra até um padrão usando a notação em inglês (dd.MM.aaaa)

Região e idioma

Quero saber se existe alguma maneira de desativar esse comportamento no Excel, o que significa que quero sempre usar os padrões em inglês e nunca os localizados, porque não quero que o comportamento da minha planilha do Excel mude de acordo com a localização do leitor.

Um caso simples seria reformatar algum campo de data para uma maneira centrada no computador como esta: "aaaammdd_hhss", isso é reconhecido universalmente e pode ser ordenado de cima para baixo facilmente. Mas como eu estou na parte francesa da Suíça, eu deveria escrever "aaaammjj_hhss" e se eu enviar este Excel para um colega em Zurique, ele não conseguiria ver a data correta quando obtivesse a localização suíço-alemã (seu excel esperaria "jjjjmmtt_hhss")

Éramos espertos o suficiente para instalar todas as janelas e escritórios em inglês, mas ainda enfrentamos problemas como esse porque esse link para as configurações regionais do sistema operacional.

Para mim, alterar as configurações do Windows não é uma opção, porque todos os outros programas estão usando essas configurações.

рüффп
fonte
4
Não acredito que isso tenha sido abordado no Excel. Com esse comportamento, o resultado do documento depende totalmente do computador que está abrindo o arquivo, alterando o conteúdo do arquivo, dependendo do computador. Me deparei com este problema ao abrir um arquivo originalmente usando vírgulas (,) para valores decimais em um computador usando pontos e fórmulas deu resultados incorretos ... (.)
AxeEffect

Respostas:

26

Esta pergunta é um pouco antiga, mas até o momento não parece ter uma resposta. Também vi perguntas semelhantes em vários sites, mas ainda não encontrei nenhuma resposta que envolva apenas funções internas do Excel. No entanto, é muito fácil resolver isso com o VBA. Você nem precisa saber como programar para fazer isso, porque a função necessária é muito simples.

Com a pasta de trabalho aberta, basta pressionar Alt + F11 (para abrir o editor VBA). Em seguida, clique no item de menu Inserir > Módulo No novo módulo VBA, digite o seguinte:

Public Function FMT$(ByVal Value, ByVal strFormat)
    FMT = VBA.Format$(Value, strFormat)
End Function

O que isso faz é simplesmente usar a própria Formatfunção do VBA em vez da função do Excel TEXT. É exatamente isso que você deseja.

Essa nova função formatará qualquer data (ou número) de acordo com a string de formato especificada. Ele interpretará a sequência de formatação usando a notação padrão ( en-US ), independentemente das configurações regionais do sistema operacional.

Para usar isso em sua pasta de trabalho, basta digitar em =FMT(A1, "yyyymmdd_hhss")vez de =TEXT(A1, "yyyymmdd_hhss"). (É claro que você pode alterar a referência da célula e formatar a string, conforme necessário.)

A propósito, você pode nomear a função como desejar. Eu escolhi FMTporque era curto e porque a função pode formatar números e datas. Mas você pode escolher algo mais descritivo, se quiser. Lembre-se de usar o mesmo nome na planilha e no código VBA.

Observe que as seqüências de caracteres do formato VBA não são exatamente iguais às seqüências de caracteres personalizadas do Excel (por exemplo, use "n" em vez de "m" por minutos), mas são muito semelhantes. Clique aqui para obter detalhes ou procure no MSDN "Função Format (Visual Basic for Applications)". Role para baixo para ver os vários especificadores de formato de data.

Método 2

Outra abordagem que também usa VBA, mas pode ser mais fácil de manter, é a seguinte:

  1. Aplique o formato de data desejado a uma célula, usando a caixa de diálogo Formato normal da célula. Essa célula pode estar em uma planilha oculta, se você preferir - não precisa ser exibida para o usuário final. Vamos supor que você aplicou o formato yyyymmdd\_hhssà célula $ A $ 1 (observe que o sublinhado deve ser escapado, como mostrado).
  2. Adicione a GetFormatfunção (mostrada abaixo) a um módulo VBA na sua pasta de trabalho.
  3. Entrar =GetFormat($A$1, TRUE)em outra célula (por exemplo, $ B $ 1 )
  4. Essa função retornará a versão localizada da string de formato. Assim, mesmo que você originalmente formatado $ A $ 1 com yyyymmdd\_hhss, quando você abre a pasta de trabalho em um computador usando o idioma francês (por exemplo), a função irá mostrar aaaammjj\_hhss.
  5. Agora basta referenciar a segunda célula em todas as suas TEXTfunções. Por exemplo: =TEXT(F22, $B$1).

Aqui está o código VBA:

Public Function GetFormat$(Cell As Range, Optional ByVal UseLocal As Boolean)
    If UseLocal Then
        GetFormat = Cell.NumberFormatLocal
    Else
        GetFormat = Cell.NumberFormat
    End If
End Function

Isso nos permite "inspecionar" a célula que você formatou originalmente ($ A $ 1) para recuperar a string de formato localizada. Essa sequência representará o mesmo formato que você aplicou, mas usará as letras corretas para o TEXT interpretar ("j" em vez de "d" por exemplo), para que o valor exibido das datas seja constante em todos os locais. Se você quiser usar apenas um formato de data para toda a pasta de trabalho, precisará executar as etapas 1 a 4 apenas uma vez. Em seguida, repita a etapa 5 (a função TEXT) em todas as células em que você a usa atualmente, mas em vez de codificar um formato, basta referenciar a célula que contém a cadeia de formato localizada ( $ B $ 1 nas instruções de exemplo) .

Observe que o segundo argumento para GetFormatinforma à função se deve ou não retornar a versão localizada (que depende das configurações regionais) ou a versão "padrão" (que é sempre baseada em en-US).

Aqui estão algumas capturas de tela que podem deixar isso mais claro.

en-US

  • Na figura, a coluna 1 lista várias representações de uma única data com diferentes formatos aplicados.
  • Observe que as linhas 2 e 3 usam os formatos de data "padrão do sistema" do Excel. (Eles são indicados por um asterisco à esquerda na caixa de diálogo Formatar e indicam que o formato de data padrão do usuário deve ser usado.) Observe também que a linha 5 usa um LCID entre colchetes, que força o idioma usado para os nomes dos meses e dias para o inglês ( LCIDs diferentes podem ser usados ​​para especificar outros idiomas).
  • A segunda coluna mostra o resultado de GetFormat(Cell, FALSE)cada célula na coluna 1. (Lembre-se de que FALSEo segundo parâmetro faz com que a função retorne os formatos NÃO localizados ).
  • A terceira coluna mostra o que GetFormat(Cell, TRUE)retorna para cada célula na coluna 2. (ou seja, os formatos localizados ).
  • A quarta coluna mostra o resultado da função TEXT usando o valor original da data bruta e o resultado localizadoGetFormat para reproduzir novamente o formato mostrado na coluna 1. Observe, no entanto, que a formatação do número NO foi aplicada a esta coluna. Os valores são um resultado direto da função TEXT.

Os resultados para o caso em inglês (EUA) acima não são muito interessantes, mas você pode compará-los com os seguintes resultados que foram obtidos alterando as configurações regionais do meu sistema operacional para vários outros locais. É importante ressaltar que, ao usarmos GetFormatem conjunto com, TEXTpodemos manter um resultado constante para formatos numéricos (aqueles que não incluem nomes de dia ou mês) em todos os locais. E, restringindo o idioma usando um LCID (como na linha 5), ​​podemos manter um formato constante ao incluir também nomes de dia e mês.

fr-CH

nb-NO

ru-RU

Este método funciona para a maioria das localidades, no entanto, deve-se observar que os scripts usados ​​para representar os algarismos hindu-árabe NÃO são os mesmos em todas as localidades. Portanto, configurações regionais como as da localidade nepalesa (Índia) resultarão em formatos de data que "parecem" diferentes das datas nos EUA. Mas eles realmente estão no mesmo "formato" em termos de posições dos números - eles apenas usam símbolos diferentes para os números.

ne-IN

drwatsoncode
fonte
11
Muito obrigado pela sua resposta (até tarde) - O método 1 é o melhor para mim e simples o suficiente para todos os meus casos. Resposta muito boa e completa.
рüффп
Você poderia explicar como posso inserir 28.11.2015 usando o primeiro método? Onde e o que devo escrever ???????
Ilan
3

Para datas, você pode realmente definir um formato que faça o Excel usar um determinado local. Se você definir o formato numérico da célula que contém sua data para algo como

[$-409]m/d/yy h:mm AM/PM;@

O Excel exibirá sua data em um código de idioma dos EUA (hex 409)

Gotcha: A notação YMD é localizada e, portanto, passa para JMT em um sistema alemão, por exemplo. Talvez você precise adaptar a string de formato à sua situação, mas eu esperaria que ela se comportasse como as fórmulas (autotranslate) em sistemas usando um idioma diferente (como você parece estar ciente).

Consulte aqui para obter mais detalhes: /programming/894805/excel-number-format-what-is-409

e aqui para obter uma lista de locais: http://support.microsoft.com/kb/221435

TheUser1024
fonte
2
Mas isso não responde à minha pergunta. Quero poder escrever dd / mm / aaaa na minha planilha do Excel, mesmo o sistema operacional quer "jj / mm / aaaa". Tentei alterar o código do idioma do SO e a saída está mudando; o Excel não se adapta de acordo com a localidade do usuário. Se eu escrever "jj.mm.aaaa" (como em francês) e alterar meu local para EUA, o Excel mostrará: "jj.03.aaaa" que não está adaptado.
24414
3

Embora essa pergunta seja um pouco antiga, me deparei com outra solução (simples!) E estou postando aqui por uma questão de exaustividade / referência.

  • Tentei a resposta da ricovox com sucesso, mas queria uma solução sem o VBA.

  • Também testou a solução do MarinD. Mas, como apontado nos comentários, se você precisar atender a mais de um formato específico de país, ele poderá ficar pesado rapidamente.

  • E agora a minha solução: usando as funções nativas YEAR (), MONTH () e DATE () do Excel, agrupadas em TEXT () para preencher os zeros na frente. Com a data em A1:

    =TEXT(YEAR(A1),"0000")&"-"&TEXT(MONTH(A1),"00")&"-"&TEXT(DAY(A1),"00")

    dá-me a data no YYYY-MM-DDformato, independentemente se o idioma corrente requer YYYY-MM-DDou AAAA-MM-JJou quaisquer outros nomes localizados ano / mês / data.

    O Excel converte suas fórmulas nativas automaticamente.

istivan
fonte
1

Uma maneira muito simples de evitar toda a bagunça é criar uma lista de dias de datas conhecidas e usar a lista em sua função.

Renani
fonte
4
Você pode expandir sua resposta para incluir um exemplo?
Burgi
1

Uma maneira simples de resolver o problema do formato de data da localidade do Excel é usar a CHOOSEfunção:

CHOOSE(WEEKDAY(TODAY());"Dimanche";"Lundi";"Mardi";"Mercredi";"Jeudi";"Vendredi";"Samedi")

CHOOSE(MONTH(TODAY());"Janvier";"Fevrier";"Mars";"Avril";"Mai";"Juin";"Juillet";"Août";"Septembre";"Octobre";"Novembre";"Décembre")

Nestes exemplos, você receberá o dia e o mês em letras sem usar formatos de localidade como "Mmmm" ou "Dddd" ou "Jjjj".

Alexis PERROTTEY
fonte
Simples, desde que você esteja gerenciando um idioma (francês no seu caso), mas se precisar gerenciar várias angústias, sua fórmula se tornará muito grande.
рüффп
Eu gerencio apenas um idioma. O objetivo do uso de CHOOSE é precisamente produzir uma planilha do Excel de um idioma que funcione em qualquer outra versão local do Excel.
Alexis PERROTTEY
A grande falha da função TEXTO do Excel é que o formato da data depende da localidade atual do Windows nas Configurações regionais. Exemplo = = TEXT (TODAY (); "AAAA-MM-DD") para US = TEXT (TODAY (); "AAAA-MM-JJ") para FR Portanto, não é possível criar uma planilha universal do Excel usando TEXT. Use ESCOLHER em seu lugar.
Alexis PERROTTEY
No final, uma solução com outra função com valores codificados não está ajudando muito mais do que codificar os padrões de data. Pessoalmente, eu iria com o VBA e a resposta aceita. De qualquer forma, obrigado por compartilhar sua experiência.
рüффп
1

Se a sua data de referência estiver na célula A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
fonte
Essa é uma boa solução alternativa, se você precisar gerenciar apenas um formato extra ... Tenho certeza de que meus colegas de Zurique ou de qualquer outro país que não seja inglês nem francês, isso ainda não funcionará. Se você precisa criar if(if(if...para todos os formatos em todo o mundo, seria muito difícil de gerenciar.
рüффп
É isso mesmo, mas não consegui encontrar nada melhor sem passar por uma macro VBA. Não entendo por que a Microsoft traduz as funções e suas propriedades (o que é ainda pior porque elas não são traduzidas automaticamente quando você a abre em outro idioma, como no nosso problema aqui). Nenhuma linguagem de programação já fez isso. Apenas Inglês teria sido suficiente
Marind
0

Eu agora usei uma lógica semelhante ao método 2 fornecido com as macros. As macros funcionam, mas geralmente quando você envia um arquivo de uma organização para outra, as macros não passam pela troca ou o antivírus não as deixa executar. Então, simplesmente renomei uma célula como formato de data. Nesta célula, simplesmente digitei o texto dd / mm / aaaa. Então, quando estou usando a função de texto, estou usando o nome da célula para o formato, por exemplo, = texto (C1, formato da data) e ele parece estar funcionando (exatamente para a Suíça funciona).

Felicidades...

UMA.

user867292
fonte
11
Você diz que isso funciona na Suíça, mas é "francês (Suíça)", "alemão (Suíça)" ou é inglês? Se for em inglês, isso realmente não contribui com nada para essa discussão. Se não é inglês, você pode explicar por =TEXT(C1,dateformat)que funcionaria (com a dateformatcélula que contém dd/mm/yyyy) quando =TEXT(C1, "dd/mm/yyyy")não funciona? (Ou funciona?)
G-Man diz 'Reinstate Monica'
0

Não acredito que ninguém tenha oferecido os formatos nomeados como solução.

Se você formatar uma data e inseri- =TEXT(A1,"Short Date")la, ela usará automaticamente o formato adequado, com base na configuração regional, sem zero problemas entre as regiões.

"Data Longa" também é uma entrada aceitável e funcionará perfeitamente entre regiões. Ele também será convertido novamente para uma data adequada no VBA com cvdate, independentemente da versão usada.  

Chris Puckett
fonte
No Excel 2016, ele manterá a formatação regional atribuída a ele. Se você estiver tentando comparar datas com diferentes formatos regionais, a comparação falhará. Isso é tão ruim que provavelmente é um bug.
Steve Scuba Steve
0

Apenas soltando outra alternativa elegante, tirada de: Stackoverflow answer by @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
fonte
Pode não funcionar. Não conheço todos os idiomas, mas, desde que a palavra mês não comece com "m" em alguns idiomas, provavelmente isso não funcionará (com #VALUEerro). Mesmo que a palavra comece com "m", existem mais de apenas duas opções aqui. Alemanha, Polônia e Hungria têm códigos de formatação diferentes para citar apenas alguns.
Ister
Suponho que o desenvolvedor sabe em qual idioma ele está desenvolvendo (por exemplo, aqui o sistema em inglês) e para qual deseja que sua fórmula funcione / para a qual seja traduzida. Não deve ser grande coisa estender o FI para qualquer idioma em que ele / ela esteja interessado. #
GWD 5/03/19
Bem, listei esses países específicos porque já tive um caso em que tive que me adaptar a todos esses idiomas ao mesmo tempo. Há também um limite de FIs incorporados, no entanto, isso também é fácil de contornar. Concordo que a ideia é boa em geral e sua principal vantagem não é o VBA necessário.
Ister
0

Eu sei, atrasado para a festa, mas analisando isso sozinho, acabei de encontrar uma solução funcional no ExcelBanter que não precisa do VBA.

O caminho a seguir é usar o antigo sistema de macro do Excel v4. Ele ainda pode ser acessado por intervalos nomeados ou folhas de macro v4. Foi uma experiência de aprendizado para mim também; uma página no Excel fora da grade e uma no site de Ron de Bruin foram boas apresentações. O último também possui um link para uma pasta de trabalho com a mesma solução.

Basicamente, a antiga função de macro do Excel v4 GET.WORKSPACE pode ser usada para obter meta informações sobre muitas coisas, incluindo o formato de data localizado em uso. GET.WORKSPACE (37) retorna uma matriz de todos os caracteres usados ​​para todos os tipos de separadores, etc., onde o índice 19-20-21 mantém a letra usada para a formatação de ano, mês e dia. Portanto, o uso de INDEX (GET.WORKSPACE (37), 19) retorna "y" nas configurações do idioma inglês, "j" no holandês e "a" no espanhol. Combine isso com um REPT para gerar o código de 4 letras e pronto. O problema é que as funções antigas da v4 (como GET.WORKSPACE) podem ser usadas apenas por folhas de macro no estilo v4 e intervalos nomeados.

Portanto:

  • crie um intervalo nomeado e nomeie-o, por exemplo, "MonthFormat"
  • dê a fórmula =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • na sua fórmula de texto, use este nome MonthFormat para especificar o formato, como =TEXT(A1, MonthFormat)
Carl Colijn
fonte