web-dev-qa-db-fra.com

Comment empêcher Excel d'utiliser les paramètres régionaux du système d'exploitation pour les modèles de date dans les formules

Selon cette question , j'ai le problème suivant:

Je veux utiliser une fonction Excel (pas la mise en forme de la cellule) comme TEXT (A1, {date_pattern})

Mais la personne qui a répondu à ma question précédente m'a dit que le modèle de date était modifié en fonction des paramètres régionaux de Windows.

Cependant, mon système d'exploitation (Windows 7) est en anglais et la suite Office également. En regardant dans mes paramètres régionaux, il montre même un modèle utilisant la notation anglaise (jj.MM.yyyy)

Region and Language

Je souhaite savoir s’il existe un moyen de désactiver un tel comportement dans Excel, ce qui signifie que je veux toujours utiliser les modèles anglais et jamais les modèles localisés, car je ne souhaite pas que le comportement de ma feuille Excel change en fonction de la localisation du lecteur.

Un cas simple serait de reformater un champ de date de manière informatique, comme ceci: "aaaammjjd_hhss", il est universellement reconnu et peut être facilement trié de haut en bas. Mais comme je suis dans la partie française de la Suisse, je devrais écrire "aaaammjj_hhss" et si j'envoyais cet Excel à un collègue zurichois, il ne pourrait pas voir la date exacte car il aurait la localisation suisse allemande "jjjjmmtt_hhss")

Nous avons été assez intelligents pour installer toutes les fenêtres et tous les bureaux en anglais, mais nous sommes toujours confrontés à un problème de ce type, car ce lien avec les paramètres régionaux du système d’exploitation.

Pour moi, la modification des paramètres Windows n'est pas une option car tous les autres programmes utilisent ces paramètres.

19
рüффп

Cette question est un peu ancienne, mais à ce jour, elle ne semble pas avoir de réponse. J'ai également vu des questions similaires sur plusieurs sites, mais je n'ai pas encore trouvé de réponse impliquant uniquement des fonctions Excel intégrées. Cependant, il est assez facile de résoudre ce problème avec VBA. Vous n'avez même pas besoin de savoir programmer, car la fonction requise est très simple.

Avec votre classeur ouvert, appuyez simplement sur Alt + F11 (pour ouvrir l’éditeur VBA) puis cliquez sur l’option de menu Insérer > Module Dans le nouveau module VBA, entrez les informations suivantes:

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

Cela consiste simplement à utiliser la propre fonction Format de VBA au lieu de la fonction TEXT d'Excel. C'est exactement ce que vous voulez.

Cette nouvelle fonction formatera n'importe quelle date (ou nombre) en fonction de la chaîne de format spécifiée. Il interprétera la chaîne de format en utilisant la notation standard ( en-US ), quels que soient les paramètres régionaux du système d'exploitation.

Pour utiliser cela dans votre classeur, tapez simplement =FMT(A1, "yyyymmdd_hhss") au lieu de =TEXT(A1, "yyyymmdd_hhss"). (Bien entendu, vous pouvez modifier la référence de cellule et la chaîne de format si nécessaire.)

En passant, vous pouvez nommer la fonction comme vous le souhaitez. J'ai choisi FMT parce que c'était court et parce que la fonction peut formater des nombres et des dates. Mais vous pouvez choisir quelque chose de plus descriptif si vous le souhaitez. N'oubliez pas d'utiliser le même nom dans votre feuille de calcul que dans le code VBA.

Notez que les chaînes de format VBA ne sont pas exactement les mêmes que les chaînes de format personnalisées d'Excel (par exemple, utilisez "n" au lieu de "m" pour les minutes), mais elles sont très similaires. Recherchez ici ou recherchez dans MSDN la "Fonction de formatage (Visual Basic pour Applications)". Faites défiler vers le bas pour voir les divers spécificateurs de format de date.

Méthode 2

Une autre approche qui utilise également VBA, mais qui pourrait en réalité être plus facile à maintenir, est la suivante:

  1. Appliquez le format de date souhaité à une cellule à l'aide de la boîte de dialogue normale Format de cellule. Cette cellule peut figurer sur une feuille masquée si vous préférez. Il n'est pas nécessaire qu'elle soit affichée à l'utilisateur final. Supposons que vous avez appliqué le format yyyymmdd\_hhss à la cellule $ A $ 1 (notez que le trait de soulignement doit être échappé comme indiqué).
  2. Ajoutez la fonction GetFormat (indiquée ci-dessous) à un module VBA de votre classeur.
  3. Entrez =GetFormat($A$1, TRUE) dans une autre cellule (par exemple $ B $ 1 )
  4. Cette fonction renverra la version localisée de la chaîne de format. Ainsi, même si vous avez initialement formaté $ A $ 1 avec yyyymmdd\_hhss, lorsque vous ouvrez le classeur sur un ordinateur à l'aide de la langue française (par exemple), la fonction affichera aaaammjj\_hhss.
  5. Maintenant, il vous suffit de référencer la deuxième cellule dans toutes vos fonctions TEXT. Par exemple: =TEXT(F22, $B$1).

Voici le code 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

Cela nous permet "d'inspecter" la cellule que vous avez initialement formatée ($ A $ 1) pour récupérer la chaîne de format localisée. Cette chaîne représentera le même format que vous avez appliqué, mais elle utilisera les lettres correctes pour que TEXT soit interprétée ("j" au lieu de "d" par exemple), de sorte que la valeur affichée des dates sera constante dans tous les paramètres régionaux. Si vous souhaitez utiliser un seul format de date pour l'ensemble de votre classeur, il vous suffira d'exécuter les étapes 1 à 4 une fois. Répétez ensuite l’étape 5 (fonction TEXT) dans toutes les cellules où vous l’utilisez actuellement. Toutefois, au lieu de coder en dur un format, vous référencez simplement la cellule contenant la chaîne de format localisée (). B $ 1 dans l'exemple d'instructions).

Notez que le deuxième argument de GetFormat indique à la fonction de renvoyer ou non la version localisée (qui dépend des paramètres régionaux) ou la version "standard" (toujours basée sur en-US).

Voici quelques captures d'écran qui pourraient rendre ceci plus clair.

en-US

  • Dans la figure, la colonne 1 répertorie plusieurs représentations d’une même date avec différents formats appliqués.
  • Notez que les lignes 2 et 3 utilisent les formats de date "par défaut du système" d'Excel. (Celles-ci sont signalées par un astérisque dans la boîte de dialogue Format et indiquent que le format de date par défaut de l'utilisateur doit être utilisé.) Notez également que la ligne 5 utilise un LCID entre crochets, ce qui force la langue anglaise pour les noms de mois et de jours ( différents LCID peuvent être utilisés pour spécifier d’autres langues).
  • La deuxième colonne indique le résultat de GetFormat(Cell, FALSE) pour chaque cellule de la colonne 1. (Rappelez-vous que FALSE pour le deuxième paramètre entraîne le renvoi par la fonction du format NON localisé ).
  • La troisième colonne indique ce que GetFormat(Cell, TRUE) renvoie pour chaque cellule de la colonne 2. (c'est-à-dire les formats localisés ).
  • La quatrième colonne affiche le résultat de la fonction TEXT en utilisant la valeur de date brute originale et le résultat localisé de GetFormat pour reproduire le format indiqué dans la colonne 1. Notez toutefois que NO le formatage numérique a été appliqué à cette colonne. Les valeurs résultent directement de la fonction TEXT.

Les résultats pour le cas anglais (États-Unis) ci-dessus ne sont pas très intéressants, mais vous pouvez les comparer aux résultats suivants obtenus en modifiant les paramètres régionaux de mon système d'exploitation en divers autres paramètres régionaux. Il est important de noter qu’en utilisant GetFormat en combinaison avec TEXT, nous pouvons conserver un résultat constant pour les formats numériques (ceux qui n’incluent pas les noms de jour ou de mois) dans tous les paramètres régionaux. Et en contraignant la langue à l'aide d'un LCID (comme dans la ligne 5), nous pouvons même conserver un format constant pour inclure également les noms de jour et de mois.

fr-CH

nb-NO

ru-RU

Cette méthode fonctionne pour la plupart des paramètres régionaux, mais il convient de noter que les scripts utilisés pour représenter les chiffres hindou-arabe ne sont PAS les mêmes dans tous les paramètres régionaux. Par conséquent, les paramètres régionaux tels que ceux de l'environnement local népalais (Inde) génèrent des formats de date qui "semblent" différents des dates en-US. Mais ceux-ci sont en fait dans le même "format" en termes de positions des nombres - ils utilisent simplement des symboles différents pour les nombres.

ne-IN

23
drwatsoncode

Pour les dates, vous pouvez définir un format qui oblige Excel à utiliser certains paramètres régionaux. Si vous définissez le format numérique de la cellule contenant votre date sur quelque chose comme

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

Excel affichera votre date aux États-Unis (hex 409)

Gotcha: La notation YMD est localisée et passe donc à JMT sur un système allemand par exemple. Vous devrez donc peut-être adapter la chaîne de format à votre situation, mais je m'attendrais à ce qu'elle se comporte comme les formules (traduction automatique) sur des systèmes utilisant un langage différent (comme vous semblez le savoir).

Voir ici pour plus de détails: https://stackoverflow.com/questions/894805/Excel-number-format-what-is-409

et ici pour une liste de locales: http://support.Microsoft.com/kb/221435

4
TheUser1024

Même si cette question est un peu ancienne, je suis tombé sur une autre solution (simple!) Et je poste ici par souci d’exhaustivité/de référence.

  • J'ai essayé la réponse de ricovox avec succès, mais je voulais une solution sans VBA.

  • Testé la solution de MarinD également. Mais, comme indiqué dans les commentaires, si vous devez gérer plusieurs formats spécifiques à un pays, cela peut devenir assez compliqué.

  • Et maintenant, voici ma solution: utiliser les fonctions natives Excel YEAR (), MONTH () et DATE (), enveloppées dans TEXT () pour ajouter des zéros au début. Avec la date en A1:

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

    me donne la date au format YYYY-MM-DD, que les paramètres régionaux en vigueur nécessitent YYYY-MM-DD ou AAAA-MM-JJ ou tout autre nom localisé pour l'année/le mois/la date.

    Excel traduit automatiquement ses formules natives.

3
istivan

Un moyen simple de résoudre le problème de format de date des paramètres régionaux dans Excel consiste à utiliser la fonction CHOOSE:

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

Dans ces exemples, vous obtiendrez le jour et le mois en lettres sans utiliser les formats régionaux tels que "Mmmm", "Dddd" ou "Jjjj".

1
Alexis PERROTTEY

Si votre date de référence est dans la cellule A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
1
MarinD

Un moyen très simple d'éviter tout désordre est de créer une liste des jours avec des dates connues et de l'utiliser dans votre fonction.

1
Renani

Je sais que, tard dans la soirée, mais en regardant cela moi-même, je viens de trouver une solution de travail sur ExcelBanter qui n'a pas besoin de VBA.

Pour ce faire, utilisez l'ancien système de macros Excel v4. Vous pouvez toujours y accéder via des plages nommées ou des feuilles de macro v4. Ce fut une expérience d'apprentissage pour moi aussi; une page sur Excel sur la grille et une sur le site de Ron de Bruin étaient de bonnes introductions. Ce dernier contient également un lien vers un classeur contenant la même solution.

Fondamentalement, l'ancienne fonction macro GET.WORKSPACE d'Excel v4 peut être utilisée pour obtenir des méta-informations sur un grand nombre d'éléments, y compris le format de date localisé utilisé. GET.WORKSPACE (37) renvoie un tableau de tous les caractères utilisés pour toutes sortes de séparateurs, etc., où l'index 19-20-21 contient la lettre utilisée pour le formatage de l'année, du mois et du jour. Donc, utiliser INDEX (GET.WORKSPACE (37), 19) renvoie "y" pour les paramètres de langue anglaise, "j" pour le néerlandais et "a" pour l’espagnol. Combinez cela avec un REPT pour générer le code de 4 lettres et vous avez terminé. Le problème est que les anciennes fonctions v4 (telles que GET.WORKSPACE) ne peuvent être que des feuilles de macros de style v4 et des plages nommées.

Ainsi:

  • créez une plage nommée et nommez-la, par exemple. "MonthFormat"
  • donnez-lui la formule =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • dans votre formule de texte, utilisez ce nom MonthFormat pour spécifier le format, comme =TEXT(A1, MonthFormat)
0
Carl Colijn

Il suffit de déposer une autre alternative imho élégante tirée de: Stackoverflow answer by @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
0
GWD

J'ai maintenant utilisé une logique similaire à la méthode 2 donnée avec les macros. Les macros fonctionnent, mais généralement, lorsque vous envoyez un fichier d'une organisation à une autre, les macros ne parviennent pas à échanger ou l'antivirus ne les laisse pas s'exécuter. Donc, j'ai simplement renommé ia cell en dateformat. Dans cette cellule, j'ai simplement saisi le texte jj/mm/aaaa. Ainsi, lorsque j'utilise la fonction de texte, j'utilise le nom de cellule pour le format, par exemple. = text (C1, dateformat) et cela semble fonctionner (précisément pour la Suisse, cela fonctionne).

À votre santé...

UNE.

0
user867292

Je ne peux pas croire que personne n'ait proposé les formats nommés comme solution.

Si vous formatez une date et entrez =TEXT(A1,"Short Date"), il utilisera automatiquement le format approprié en fonction du paramètre régional avec zéro problème entre les régions.

"Date longue" est également une entrée acceptable et fonctionnera de manière transparente dans toutes les régions. Il sera également reconverti en une date appropriée dans VBA avec cvdate, quelle que soit la version utilisée.

0
Chris Puckett