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

21

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

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

Mais la personne qui a répondu à ma question précédente m'a fait constater que le modèle de date change 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 en utilisant la notation anglaise (dd.MM.yyyy)

Région et langue

Je veux savoir s'il existe un moyen de désactiver un tel comportement à partir d'Excel, ce qui signifie que je veux toujours utiliser les modèles anglais et jamais les modèles localisés car je ne veux 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 centrée sur l'ordinateur comme ceci: "aaaammjj_hhss" ceci est reconnu universellement et peut être trié de haut en bas facilement. Mais comme je suis dans la partie française de la Suisse, je devrais écrire "aaaammjj_hhss" et si j'envoie cet Excel à un collègue à Zurich, il ne pourrait pas voir la date correcte car il a obtenu la localisation suisse-allemande (son excel s'attendrait à ce que "jjjjmmtt_hhss")

Nous avons été assez intelligents pour installer toutes les fenêtres et le bureau en anglais, mais nous rencontrons toujours des problèmes comme celui-ci, car ce lien vers 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.

рüффп
la source
4
Je ne peux pas croire que cela ait même été résolu sur Excel. Avec ce comportement, le résultat du document dépend totalement de l'ordinateur ouvrant le fichier, ce qui modifie le contenu du fichier en fonction de l'ordinateur. Je suis tombé sur ce problème lors de l'ouverture d'un fichier utilisant à l'origine des virgules (,) pour les valeurs décimales dans un ordinateur utilisant des points (.) Et les formules ont donné des résultats incorrects ...
AxeEffect

Réponses:

26

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 un certain nombre de 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 comment programmer pour ce faire, car la fonction requise est si simple.

Avec votre classeur ouvert, appuyez simplement sur Alt + F11 (pour ouvrir l'éditeur VBA) puis cliquez sur l'élément de menu Insérer > Module Dans le nouveau module VBA, entrez ce qui suit:

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

Ce que cela fait, c'est simplement utiliser la propre Formatfonction de VBA au lieu de la TEXTfonction d'Excel . C'est exactement ce que vous voulez.

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

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

Au fait, vous pouvez nommer la fonction comme vous le souhaitez. J'ai choisi FMTparce 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é d'Excel (par exemple, utilisez "n" au lieu de "m" pendant quelques minutes), mais elles sont très similaires. Regardez ici pour plus de détails ou recherchez MSDN pour «Fonction de formatage (Visual Basic pour Applications)». Faites défiler vers le bas pour voir les différents spécificateurs de format de date.

Méthode 2

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

  1. Appliquez le format de date souhaité à une cellule à l'aide de la boîte de dialogue Format de cellule normale. Cette cellule peut être sur une feuille masquée si vous préférez - elle n'a pas besoin d'être affichée pour 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 GetFormatfonction (illustrée ci-dessous) à un module VBA dans 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 en utilisant la langue française (par exemple), la fonction s'affiche aaaammjj\_hhss.
  5. Maintenant, référencez simplement la deuxième cellule dans toutes vos TEXTfonctions. 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 formatage localisée. Cette chaîne représentera le même format que vous avez appliqué, mais elle utilisera les lettres correctes pour TEXT à interpréter ("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, vous ne devrez effectuer les étapes 1 à 4 qu'une seule fois. Répétez ensuite l'étape 5 (la fonction TEXTE) dans toutes les cellules où vous l'utilisez actuellement, mais au lieu de coder en dur un format, vous feriez simplement référence à la cellule qui contient la chaîne de format localisée ( $ B $ 1 dans les instructions d'exemple) .

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

Voici quelques captures d'écran qui pourraient rendre cela 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 "système par défaut" d'Excel. (Ceux-ci sont indiqués par un astérisque de début dans la boîte de dialogue Format et ils 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 utilisée pour les noms de mois et de jour à être l'anglais ( différents LCID peuvent être utilisés pour spécifier d'autres langues).
  • La deuxième colonne affiche le résultat de GetFormat(Cell, FALSE)pour chaque cellule de la colonne 1. (Rappelez-vous que FALSEpour le deuxième paramètre, la fonction renvoie les formats NON localisés ).
  • La troisième colonne montre ce qui GetFormat(Cell, TRUE)retourne 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 TEXTE en utilisant la valeur de date brute d'origine et le résultat localisé de GetFormatpour recréer le format indiqué dans la colonne 1. Notez toutefois qu'aucune mise en forme numérique n'a été appliquée à cette colonne. Les valeurs sont un résultat direct de la fonction TEXT.

Les résultats ci-dessus pour le cas anglais (États-Unis) ne sont pas très intéressants, mais vous pouvez les comparer avec les résultats suivants qui ont été obtenus en changeant 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 GetFormaten combinaison avec, TEXTnous 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 en incluant é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-arabes ne sont PAS les mêmes dans tous les paramètres régionaux. Par conséquent, les paramètres régionaux tels que ceux des paramètres régionaux népalais (Inde) entraîneront 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

drwatsoncode
la source
1
Merci beaucoup pour votre réponse (même en retard) - La méthode 1 est la meilleure pour moi et assez simple pour tous mes cas. Réponse très bonne et complète.
рüффп
Pourriez-vous expliquer comment insérer le 28.11.2015 en utilisant la première méthode? Où et que dois-je écrire ???????
Ilan
3

Pour les dates, vous pouvez réellement définir un format qui oblige Excel à utiliser un certain environnement local. 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 dans un environnement local américain (hex 409)

Gotcha: La notation YMD est localisée et se transforme donc en 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 une langue différente (comme vous semblez le savoir).

Voir ici pour plus de détails: /programming/894805/excel-number-format-what-is-409

et ici pour une liste des locales: http://support.microsoft.com/kb/221435

TheUser1024
la source
2
Mais cela ne répond pas à ma question. Je veux pouvoir écrire jj / mm / aaaa dans ma feuille Excel même le système d'exploitation veut "jj / mm / aaaa". J'ai essayé de changer mes paramètres régionaux de système d'exploitation et la sortie change, puis Excel ne s'adapte pas en fonction des paramètres régionaux de l'utilisateur. Si j'écris "jj.mm.aaaa" (comme en français) et que je change ma locale pour être US, l'Excel affiche: "jj.03.aaaa" qui n'est pas adapté.
2014 à 8h41
3

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é / référence.

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

  • Testé également la solution de MarinD. Mais, comme indiqué dans les commentaires, si vous avez besoin de prendre en charge plusieurs formats spécifiques à un pays, cela peut devenir assez difficile à gérer.

  • Et maintenant à ma solution: utiliser les fonctions natives Excel YEAR (), MONTH () et DATE (), enveloppées dans TEXT () pour remplir les zéros en face. Avec la date en A1:

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

    me donne la date au YYYY-MM-DDformat, indépendamment du fait que les paramètres régionaux actuels nécessitent YYYY-MM-DDou AAAA-MM-JJou tout autre nom localisé pour l'année / mois / date.

    Excel traduit automatiquement ses formules natives.

istivan
la source
1

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

Renani
la source
4
Pouvez-vous développer votre réponse pour inclure un exemple?
Burgi
1

Un moyen simple de résoudre le problème du format de date des paramètres régionaux d'Excel consiste à utiliser la CHOOSEfonction:

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 locaux comme "Mmmm" ou "Dddd" ou "Jjjj".

Alexis PERROTTEY
la source
C'est simple tant que vous gérez une langue (le français dans votre cas) mais si vous devez gérer plusieurs langues, votre formule deviendra beaucoup trop grande.
рüффп
Je gère un seul langage. Le but de l'utilisation de CHOISIR est précisément de produire une feuille Excel à un langage qui fonctionnera sur toute autre version locale d'Excel.
Alexis PERROTTEY
Le gros échec de la fonction Excel TEXT est que le format de date dépend de vos paramètres régionaux Windows actuels dans les paramètres régionaux. Exemple = = TEXT (TODAY (); "YYYY-MM-DD") pour US = TEXT (TODAY (); "AAAA-MM-JJ") pour FR Il n'est donc pas possible de créer une feuille Excel universelle à l'aide de TEXT. Utilisez plutôt CHOISIR.
Alexis PERROTTEY
À la fin, une solution avec une autre fonction avec des valeurs codées en dur n'aide pas vraiment plus que le codage en dur des modèles de date. Personnellement, j'irais avec VBA et la réponse acceptée. Merci quand même de partager votre expérience.
рüффп
1

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"))
MarinD
la source
C'est une bonne solution si vous n'avez besoin de gérer qu'un seul format supplémentaire ... Je suis sûr de toute façon mes collègues de Zurich ou de tout autre pays qui n'est ni anglais ni français, cela ne fonctionnera toujours pas. Si vous devez créer if(if(if...tous les formats dans le monde, ce serait très difficile à gérer.
2015
C'est vrai, mais je n'ai rien trouvé de mieux sans passer par une macro VBA. Je ne comprends pas pourquoi Microsoft traduit les fonctions et leurs propriétés (ce qui est encore pire parce qu'ils ne les traduisent pas automatiquement lorsque vous l'ouvrez avec une autre langue, comme dans notre numéro ici). Aucun langage de programmation n'a jamais fait ça. Un peu d'anglais aurait suffi
MarinD
0

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 passeront pas par l'échange ou l'antivirus ne les laissera pas s'exécuter. J'ai donc simplement renommé ia cell en format de date. Dans cette cellule, j'ai simplement saisi le texte jj / mm / aaaa. Donc, lorsque j'utilise la fonction texte, j'utilise le nom de la cellule pour le format, par exemple = texte (C1, format de date) et cela semble fonctionner (précisément pour la Suisse, cela fonctionne).

À votre santé...

UNE.

user867292
la source
1
Vous dites que cela fonctionne en Suisse, mais est-ce «français (Suisse)», «allemand (Suisse)» ou est-ce anglais? Si c'est l'anglais, cela ne contribue pas vraiment à cette discussion. Si ce n'est pas l'anglais, pouvez-vous expliquer pourquoi =TEXT(C1,dateformat)fonctionnerait (avec la dateformatcellule contenant dd/mm/yyyy) quand =TEXT(C1, "dd/mm/yyyy")ne fonctionne pas? (Ou cela fonctionne-t-il?)
G-Man dit `` Réintègre Monica '' le
0

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

Si vous formatez une date et que vous la saisissez, =TEXT(A1,"Short Date")elle utilisera automatiquement le format approprié en fonction du paramètre régional sans aucun problème entre les régions.

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

Chris Puckett
la source
Dans Excel 2016, il conservera le formatage régional qui lui a été attribué. Si vous essayez de comparer des dates avec différents formats régionaux, la comparaison échouera. C'est tellement mauvais que c'est probablement un bug.
Scuba Steve
0

Je laisse tomber une autre alternative élégante à mon humble avis tirée de: Réponse de Stackoverflow par @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
la source
Cela pourrait ne pas fonctionner. Je ne connais pas toutes les langues mais tant que le mot du mois ne commence pas par "m" dans certaines langues, cela ne fonctionnera probablement pas du tout (ce qui rendra une #VALUEerreur). Même si le mot commence par "m", il y a plus que 2 options ici. L'Allemagne, la Pologne et la Hongrie ont chacune des codes de mise en forme différents pour n'en nommer que quelques-uns.
Ister
Je suppose que le développeur sait dans quel paramètre de langue il développe (par exemple ici le système anglais) et dans lequel il veut que sa formule fonctionne / la traduise. Cela ne devrait pas être un gros problème d'étendre le CI à la langue qui l'intéresse.
GWD
Eh bien, j'ai énuméré ces pays spécifiques parce que j'avais déjà un cas où je devais m'adapter à toutes ces langues en même temps. Il existe également une limite de FI intégrés, mais cela est également facile à contourner. Je suis d'accord que l'idée est bonne en général et que son principal avantage est qu'aucun VBA n'est nécessaire.
Ister
0

Je sais, en retard à la fête, mais en examinant cela moi-même, je viens de trouver une solution de travail sur ExcelBanter qui n'a pas besoin de VBA.

La voie à suivre consiste à utiliser l'ancien système de macros Excel v4. Il est toujours accessible via des plages nommées ou des feuilles de macro v4. Ce fut aussi une expérience d'apprentissage pour moi; une page sur Excel hors grille et une sur le site de Ron de Bruin ont été de belles introductions. Ce dernier a également un lien vers un classeur contenant la même solution.

Fondamentalement, l'ancienne fonction de macro Excel v4 GET.WORKSPACE peut être utilisée pour obtenir des méta-informations sur beaucoup de choses, 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. Ainsi, l'utilisation d'INDEX (GET.WORKSPACE (37), 19) renvoie "y" dans les paramètres de langue anglaise, "j" dans le néerlandais et "a" dans l'espagnol. Combinez cela avec un REPT pour générer le code à 4 lettres et vous avez terminé. Le problème est cependant que les anciennes fonctions v4 (comme GET.WORKSPACE) ne peuvent être utilisées que par les feuilles de macro de style v4 et les plages nommées.

Donc:

  • 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 Texte, utilisez ce nom MonthFormat pour spécifier le format, comme =TEXT(A1, MonthFormat)
Carl Colijn
la source