Cómo evitar que Excel use la configuración regional del sistema operativo para patrones de fecha en fórmulas

21

De acuerdo con esta pregunta , tengo el siguiente problema:

Quiero usar alguna función de Excel (no el formato de celda) como TEXTO (A1, {date_pattern})

Pero la persona que respondió mi pregunta anterior me hizo descubrir que el patrón de fecha cambia de acuerdo con la Configuración regional de Windows.

Sin embargo, mi sistema operativo (Windows 7) está en inglés y la suite de Office también. Al mirar en mi configuración regional, muestra incluso un patrón con notación en inglés (dd.MM.aaaa)

Región e idioma

Quiero saber si hay alguna forma de deshabilitar dicho comportamiento de Excel, lo que significa que siempre quiero usar los patrones en inglés y nunca los localizados porque no quiero que el comportamiento de mi hoja de Excel cambie de acuerdo con la localización del lector.

Un caso simple sería volver a formatear algún campo de fecha en una computadora centrada de esta manera: "aaaammdd_hhss", esto se reconoce universalmente y se puede ordenar de arriba a abajo fácilmente. Pero como estoy en la parte francesa de Suiza, debería escribir "aaaammjj_hhss" y si le envío este Excel a un colega en Zürich, no podría ver la fecha correcta ya que obtuvo la localización suizo-alemana (su excelencia esperaría "jjjjmmtt_hhss")

Fuimos lo suficientemente inteligentes como para instalar todas las ventanas y la oficina en inglés, pero aún nos enfrentamos a un problema como este debido a este enlace a la configuración regional del sistema operativo.

Para mí, cambiar la configuración de Windows no es una opción porque todos los demás programas están usando esta configuración.

рüффп
fuente
44
No puedo creer que esto haya sido abordado en Excel. Con este comportamiento, el resultado del documento depende totalmente de que la computadora abra el archivo, lo que hace que el contenido del archivo cambie según la computadora. Me encontré con este problema al abrir un archivo originalmente usando comas (,) para valores decimales en un ordenador utilizando puntos y fórmulas dio resultados incorrectos ... (.)
AxeEffect

Respuestas:

26

Esta pregunta es un poco vieja, pero hasta la fecha no parece tener una respuesta. También he visto preguntas similares en varios sitios, pero aún no he encontrado ninguna respuesta que involucre solo funciones integradas de Excel. Sin embargo, es bastante fácil resolver esto con VBA. Ni siquiera tiene que saber programar para hacer esto, porque la función requerida es muy simple.

Con su libro abierto, simplemente presione Alt + F11 (para abrir el editor VBA) Luego haga clic en el elemento de menú Insertar > Módulo En el nuevo módulo VBA, ingrese lo siguiente:

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

Lo que esto hace es simplemente usar la propia Formatfunción de VBA en lugar de la TEXTfunción de Excel . Esto es exactamente lo que quieres.

Esta nueva función formateará cualquier fecha (o número) de acuerdo con la cadena de formato que especifique. Interpretará la cadena de formato utilizando la notación estándar ( en-EE . UU. ), Independientemente de la configuración regional del sistema operativo.

Para usar esto en su libro de trabajo, simplemente escriba en =FMT(A1, "yyyymmdd_hhss")lugar de =TEXT(A1, "yyyymmdd_hhss"). (Por supuesto, puede cambiar la referencia de celda y la cadena de formato según sea necesario).

Por cierto, puedes nombrar la función como quieras. Elegí FMTporque era breve y porque la función puede formatear números y fechas. Pero puede elegir algo más descriptivo si lo desea. Solo recuerde usar el mismo nombre en su hoja de trabajo que en el código VBA.

Tenga en cuenta que las cadenas de formato VBA no son exactamente las mismas que las cadenas de formato personalizadas de Excel (por ejemplo, use "n" en lugar de "m" durante minutos), pero son muy similares. Mire aquí para más detalles, o busque MSDN para "Función de formato (Visual Basic para aplicaciones)" Desplácese hacia abajo para ver los distintos especificadores de formato de fecha.

Método 2

Otro enfoque que también usa VBA, pero que en realidad podría ser más fácil de mantener, es el siguiente:

  1. Aplique el formato de fecha deseado a una celda, usando el diálogo normal de Formato de celda. Esta celda puede estar en una hoja oculta si lo prefiere; no es necesario que se muestre al usuario final. Supongamos que aplicó el formato yyyymmdd\_hhssa la celda $ A $ 1 (tenga en cuenta que el guión bajo debe escaparse como se muestra).
  2. Agregue la GetFormatfunción (que se muestra a continuación) a un módulo VBA en su libro de trabajo.
  3. Ingrese =GetFormat($A$1, TRUE)en otra celda (por ejemplo, $ B $ 1 )
  4. Esa función devolverá la versión localizada de la cadena de formato. Entonces, aunque originalmente formateó $ A $ 1 con yyyymmdd\_hhss, cuando abre el libro en una computadora que usa el idioma francés (por ejemplo), la función se mostrará aaaammjj\_hhss.
  5. Ahora simplemente haga referencia a la segunda celda en todas sus TEXTfunciones. Por ejemplo: =TEXT(F22, $B$1).

Aquí está el 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

Esto nos permite "inspeccionar" la celda que formateó originalmente ($ A $ 1) para recuperar la cadena de formato localizada. Esa cadena representará el mismo formato que aplicó, pero usará las letras correctas para que TEXT interprete ("j" en lugar de "d", por ejemplo), por lo que el valor mostrado de las fechas será constante en todas las configuraciones regionales. Si desea utilizar solo un formato de fecha para todo su libro de trabajo, solo necesitaría realizar los pasos 1-4 una vez. Luego repita el paso 5 (la función TEXTO) en todas las celdas donde lo usa actualmente, pero en lugar de codificar un formato, simplemente haría referencia a la celda que contiene la cadena de formato localizada ( $ B $ 1 en las instrucciones de ejemplo) .

Tenga en cuenta que el segundo argumento GetFormatle dice a la función si devolver o no la versión localizada (que depende de la configuración regional) o la versión "estándar" (que siempre se basa en en-US).

Aquí hay algunas capturas de pantalla que podrían aclarar esto.

en-US

  • En la figura, la Columna 1 enumera varias representaciones de una sola fecha con diferentes formatos aplicados.
  • Tenga en cuenta que las filas 2 y 3 usan los formatos de fecha "predeterminados del sistema" de Excel. (Estos se indican con un asterisco inicial en el Diálogo de formato e indican que se debe usar el formato de fecha predeterminado del usuario). También tenga en cuenta que la fila 5 usa un LCID entre corchetes, que obliga a que el idioma utilizado para los nombres de mes y día sea inglés ( Se pueden usar diferentes LCID para especificar otros idiomas).
  • La segunda columna muestra el resultado de GetFormat(Cell, FALSE)cada celda en la columna 1. (Recuerde que FALSEpara el segundo parámetro hace que la función devuelva los formatos NO localizados ).
  • La tercera columna muestra qué GetFormat(Cell, TRUE)retorna para cada celda en la columna 2. (es decir, los formatos localizados ).
  • La cuarta columna muestra el resultado de la función TEXTO utilizando el valor de fecha original sin procesar y el resultado localizado de GetFormatvolver a producir el formato que se muestra en la columna 1. Sin embargo, tenga en cuenta que NO se aplicó formato de número a esta columna. Los valores son un resultado directo de la función TEXTO.

Los resultados para el caso anterior en inglés (EE. UU.) No son muy interesantes, pero puede compararlos con los siguientes resultados que se obtuvieron al cambiar la Configuración regional de mi sistema operativo a otras configuraciones regionales. Es importante destacar que al usarlo GetFormaten combinación con TEXTpodemos retener un resultado constante para formatos numéricos (aquellos que no incluyen nombres de día o mes) en todas las configuraciones regionales. Y al restringir el idioma utilizando un LCID (como en la fila 5), ​​incluso podemos mantener un formato constante cuando se incluyen también los nombres de día y mes.

fr-CH

nb-NO

ru-RU

Este método funciona para la mayoría de las configuraciones regionales, sin embargo, debe tenerse en cuenta que los scripts utilizados para representar los números hindúes-árabes NO son los mismos en todas las configuraciones regionales. Por lo tanto, las configuraciones regionales como las de la configuración regional de Nepal (India) darán como resultado formatos de fecha que "se ven" diferentes a las fechas en EE. UU. Pero estos en realidad están en el mismo "formato" en términos de las posiciones de los números: solo usan símbolos diferentes para los números.

ne-IN

drwatsoncode
fuente
1
Muchas gracias por su respuesta (incluso tarde): el Método 1 es el mejor para mí y lo suficientemente simple para todos mis casos. Muy buena y completa respuesta.
Febrero
¿Podría explicar cómo puedo insertar el 28.11.2015 usando el primer método? ¿Dónde y qué debo escribir ???????
Ilan
3

Para las fechas, puede definir un formato que haga que Excel use una determinada configuración regional. Si establece el formato de número de la celda que contiene su fecha en algo como

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

Excel mostrará su fecha en una ubicación de EE. UU. (Hex 409)

Gotcha: la notación YMD está localizada y, por lo tanto, se convierte en JMT en un sistema alemán, por ejemplo. Por lo tanto, es posible que deba adaptar la cadena de formato a su situación, pero esperaría que se comportara como las fórmulas (autotranslate) en sistemas que usan un idioma diferente (como parece estar al tanto).

Consulte aquí para obtener más detalles: /programming/894805/excel-number-format-what-is-409

y aquí para obtener una lista de configuraciones regionales: http://support.microsoft.com/kb/221435

TheUser1024
fuente
2
Pero no responde mi pregunta. Quiero poder escribir dd / mm / aaaa en mi hoja de Excel, incluso el sistema operativo quiere "jj / mm / aaaa". Traté de cambiar la configuración regional de mi sistema operativo y la salida está cambiando, luego Excel no se adapta según la configuración regional del usuario. Si escribo "jj.mm.aaaa" (como en francés) y cambio mi configuración regional para que sea EE. UU., Excel muestra: "jj.03.aaaa", que no está adaptado.
рüффп
3

Aunque esta pregunta es un poco vieja, me encontré con otra solución (¡simple!) Y estoy publicando aquí en aras de la exhaustividad / referencia.

  • Intenté la respuesta de ricovox con éxito, pero quería una solución sin VBA.

  • También probamos la solución de MarinD. Pero, como se señaló en los comentarios, si necesita atender a más de un formato específico de país, puede ser difícil de manejar bastante rápido.

  • Y ahora a mi solución: usar las funciones nativas de Excel AÑO (), MES () y FECHA (), envueltas en TEXTO () para rellenar los ceros al frente. Con la fecha en A1:

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

    me da la fecha en YYYY-MM-DDel formato, independientemente si la localización actual requiere YYYY-MM-DDo AAAA-MM-JJo cualesquiera otros nombres localizados para el año / mes / día.

    Excel traduce sus fórmulas nativas automáticamente.

istivan
fuente
1

Una manera muy simple de evitar todo el desorden es crear una lista de días de fechas conocidas y usar la lista en su función.

Renani
fuente
44
¿Puedes ampliar tu respuesta para incluir un ejemplo?
Burgi
1

Una forma sencilla de resolver el problema del formato de fecha de configuración regional de Excel es usar la CHOOSEfunción:

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")

En estos ejemplos, obtendrá el Día y el Mes en letras sin usar formatos locales como "Mmmm" o "Dddd" o "Jjjj".

Alexis PERROTTEY
fuente
Es simple, siempre y cuando esté manejando un idioma (francés en su caso) pero si tiene que manejar múltiples idiomas, su fórmula se volverá demasiado grande.
Febrero
Solo manejo un idioma. El objetivo del uso de CHOOSE es precisamente producir una hoja Excel de un solo idioma que funcione en cualquier otra versión de Excel.
Alexis PERROTTEY
La gran falla de la función TEXTO de Excel es que el formato de fecha depende de su configuración regional actual de Windows en la Configuración regional. Ejemplo = = TEXTO (TODAY (); "AAAA-MM-DD") para EE. UU. = TEXTO (TODAY (); "AAAA-MM-JJ") para FR Por lo tanto, no es posible crear una hoja de Excel universal usando TEXTO. Use ELEGIR en su lugar.
Alexis PERROTTEY
Al final, una solución con otra función con valores codificados realmente no está ayudando más que codificar los patrones de fecha. Personalmente iría con VBA y la respuesta aceptada. Gracias de todos modos por compartir tu experiencia.
Febrero
1

Si su fecha de referencia está en la celda A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
fuente
Esa es una buena solución si necesita administrar solo un formato adicional ... Estoy seguro de todos modos, mis colegas de Zurich o de cualquier otro país que no sea inglés ni francés, todavía no funcionará. Si tiene que hacer if(if(if...para cada formato en todo el mundo, sería muy difícil de administrar.
Febrero
Así es, pero no pude encontrar nada mejor sin pasar por una macro VBA. No entiendo por qué Microsoft traduce las funciones y sus propiedades (lo que es aún peor porque no las traducen automáticamente cuando lo abre con otro idioma, como en nuestro problema aquí). Ningún lenguaje de programación hizo eso nunca. Solo el inglés hubiera sido suficiente
MarinD
0

Ahora he usado una lógica similar al Método 2 dado con las Macros. Las macros funcionan, pero generalmente cuando envía un archivo de una organización a otra, las macros no se realizarán a través del intercambio o el antivirus no las dejará ejecutar. Así que simplemente he renombrado ia cell como dateformat. En esta celda simplemente ingresé el texto dd / mm / aaaa. Entonces, cuando estoy usando la función de texto, estoy usando el nombre de la celda para el formato, por ejemplo, = texto (C1, formato de fecha) y parece estar funcionando (precisamente para Suiza funciona).

Salud...

A.

usuario867292
fuente
1
Dices que esto funciona en Suiza, pero ¿es "francés (Suiza)", "alemán (Suiza)" o inglés? Si es inglés, esto realmente no contribuye en nada a esta discusión. Si no es inglés, ¿puede explicar por =TEXT(C1,dateformat)qué funcionaría (con la dateformatcelda que contiene dd/mm/yyyy) cuando =TEXT(C1, "dd/mm/yyyy")no funciona? (¿O funciona?)
G-Man dice 'Reinstate Monica' el
0

No puedo creer que nadie haya ofrecido los formatos nombrados como solución.

Si formatea una fecha e ingresa =TEXT(A1,"Short Date"), usará automáticamente el formato adecuado según la configuración regional con cero problemas entre regiones.

"Fecha larga" también es una entrada aceptable y funcionará sin problemas en todas las regiones. También se convertirá de nuevo a una fecha adecuada en VBA con cvdate independientemente de la versión utilizada.  

Chris Puckett
fuente
En Excel 2016, mantendrá el formato regional que se le haya asignado. Si está tratando de comparar fechas con diferentes formatos regionales, la comparación fallará. Esto es tan malo que probablemente sea un error.
Scuba Steve
0

Simplemente lanzando otra alternativa elegante tomada de: Respuesta de Stackoverflow por @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
fuente
Puede que no funcione. No conozco todos los idiomas, pero mientras la palabra para mes no comience con "m" en algunos de los idiomas, esto probablemente no funcionará en absoluto (genera un #VALUEerror). Incluso si la palabra comienza con "m", hay más de 2 opciones aquí. Alemania, Polonia y Hungría tienen códigos de formato diferentes, por nombrar solo algunos.
Ister
Supongo que el desarrollador sabe en qué configuración de idioma está desarrollando (por ejemplo, aquí el sistema de inglés) y en qué quiere que su fórmula funcione / para traducirla. No debería ser un gran problema extender el IF para cualquier idioma que le interese.
GWD
Bueno, he enumerado esos países específicos porque ya tuve un caso en el que tuve que adaptarme a todos esos idiomas al mismo tiempo. También hay un límite de IFs integrados, sin embargo, esto también es fácil de esquivar. Estoy de acuerdo en que la idea es buena en general y su principal ventaja es que no se necesita VBA.
Ister
0

Lo sé, tarde a la fiesta, pero al investigar esto, encontré una solución que funciona en ExcelBanter que no necesita VBA.

El camino a seguir es usar el antiguo sistema macro Excel v4. Todavía se puede acceder a través de rangos con nombre o hojas de macro v4. También fue una experiencia de aprendizaje para mí; una página en Excel fuera de la cuadrícula y una en el sitio de Ron de Bruin fueron buenas presentaciones. Este último también tiene un enlace a un libro de trabajo con la misma solución.

Básicamente, la antigua función macro de Excel v4 GET.WORKSPACE se puede usar para obtener metainformación sobre muchas cosas, incluido el formato de fecha localizado en uso. GET.WORKSPACE (37) devuelve una matriz de todos los caracteres utilizados para todo tipo de separadores, etc., donde el índice 19-20-21 contiene la letra utilizada para el formato de año, mes y día. Entonces, usar INDEX (GET.WORKSPACE (37), 19) devuelve "y" en la configuración del idioma inglés, "j" en holandés y "a" en español. Combina eso con un REPT para generar el código de 4 letras y listo. Sin embargo, el problema es que las funciones antiguas de v4 (como GET.WORKSPACE) solo pueden ser utilizadas por las hojas de macros de estilo v4 y los rangos con nombre.

Así:

  • cree un rango con nombre y asígnele un nombre, por ejemplo, "MonthFormat"
  • dale la formula =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • en su fórmula de texto, use este nombre de MonthFormat para especificar el formato, como =TEXT(A1, MonthFormat)
Carl Colijn
fuente