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)
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.
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.
Une autre approche qui utilise également VBA, mais qui pourrait en réalité être plus facile à maintenir, est la suivante:
yyyymmdd\_hhss
à la cellule $ A $ 1 (notez que le trait de soulignement doit être échappé comme indiqué).GetFormat
(indiquée ci-dessous) à un module VBA de votre classeur.=GetFormat($A$1, TRUE)
dans une autre cellule (par exemple $ B $ 1 )yyyymmdd\_hhss
, lorsque vous ouvrez le classeur sur un ordinateur à l'aide de la langue française (par exemple), la fonction affichera aaaammjj\_hhss
.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.
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é ).GetFormat(Cell, TRUE)
renvoie pour chaque cellule de la colonne 2. (c'est-à-dire les formats localisés ).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.
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.
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
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.
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".
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"))
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.
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:
=REPT(INDEX(GET.WORKSPACE(37),19),4)
=TEXT(A1, MonthFormat)
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])
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.
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.