Verhindern, dass Excel die regionalen Einstellungen des Betriebssystems für Datumsmuster in Formeln verwendet

21

Nach dieser Frage habe ich folgendes Problem:

Ich möchte eine Excel-Funktion (nicht die Zellformatierung) wie TEXT (A1, {date_pattern}) verwenden

Die Person, die meine vorherige Frage beantwortet hat, hat jedoch festgestellt, dass sich das Datumsmuster gemäß den regionalen Windows-Einstellungen ändert.

Mein Betriebssystem (Windows 7) ist jedoch in Englisch und die Office-Suite auch. In meinen Ländereinstellungen wird sogar ein Muster in englischer Notation angezeigt (TT.MM.JJJJ).

Region und Sprache

Ich möchte wissen, ob es eine Möglichkeit gibt, ein solches Verhalten in Excel zu deaktivieren. Dies bedeutet, dass ich immer die englischen und niemals die lokalisierten Muster verwenden möchte, da sich das Verhalten meiner Excel-Tabelle nicht entsprechend der Lokalisierung des Readers ändern soll.

Ein einfacher Fall wäre die Neuformatierung eines Datumsfelds auf eine rechnerzentrierte Weise wie folgt: "yyyymmdd_hhss" Dies wird allgemein anerkannt und kann leicht nach oben und unten sortiert werden. Da ich mich aber im französischen Teil der Schweiz befinde, sollte ich "aaaammjj_hhss" schreiben und wenn ich dieses Excel an einen Kollegen in Zürich sende, kann er das richtige Datum nicht sehen, da er die schweizerdeutsche Lokalisierung hat (sein Excel würde es erwarten) "jjjjmmtt_hhss")

Wir waren schlau genug, um alle Windows- und Office-Programme auf Englisch zu installieren, aber wir haben immer noch Probleme, weil diese Verbindung zu den regionalen Einstellungen des Betriebssystems besteht.

Für mich ist das Ändern der Windows-Einstellungen keine Option, da alle anderen Programme diese Einstellungen verwenden.

рüффп
quelle
4
Ich kann nicht glauben, dass dies sogar in Excel behoben wurde. Bei diesem Verhalten hängt das Ergebnis des Dokuments vollständig vom Computer ab, der die Datei öffnet, sodass sich der Inhalt der Datei je nach Computer ändert. Ich bin auf dieses Problem
gestoßen,

Antworten:

26

Diese Frage ist ein bisschen alt, aber bis heute scheint sie keine Antwort zu haben. Ich habe auch ähnliche Fragen auf einer Reihe von Websites gesehen, aber noch keine Antwort gefunden, die nur integrierte Excel-Funktionen betrifft. Mit VBA ist dies jedoch recht einfach zu lösen. Sie müssen nicht einmal programmieren können, um dies zu tun, da die erforderliche Funktion so einfach ist.

Drücken Sie bei geöffneter Arbeitsmappe einfach Alt + F11 (um den VBA-Editor zu öffnen). Klicken Sie dann auf den Menüpunkt Einfügen > Modul . Geben Sie im neuen VBA-Modul Folgendes ein:

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

Dazu wird einfach die VBA-eigene FormatFunktion anstelle der Excel- TEXTFunktion verwendet. Genau das wollen Sie.

Diese neue Funktion formatiert jedes Datum (oder jede Zahl) gemäß der von Ihnen angegebenen Formatzeichenfolge. Die Formatzeichenfolge wird unter Verwendung der Standardnotation ( en-US ) interpretiert , unabhängig von den regionalen Einstellungen des Betriebssystems.

Um dies in Ihrer Arbeitsmappe zu verwenden, geben Sie einfach =FMT(A1, "yyyymmdd_hhss")statt =TEXT(A1, "yyyymmdd_hhss"). (Natürlich können Sie den Zellbezug und die Formatzeichenfolge nach Bedarf ändern.)

Sie können die Funktion übrigens beliebig benennen. Ich habe gewählt, FMTweil es kurz war und weil die Funktion sowohl Zahlen als auch Datumsangaben formatieren kann. Aber Sie können etwas aussagekräftigeres wählen, wenn Sie möchten. Denken Sie daran, in Ihrem Arbeitsblatt denselben Namen wie im VBA-Code zu verwenden.

Beachten Sie, dass die VBA-Formatzeichenfolgen nicht genau mit den benutzerdefinierten Formatzeichenfolgen von Excel identisch sind (verwenden Sie beispielsweise "n" anstelle von "m" für Minuten), sie sind jedoch sehr ähnlich. Suchen Sie hier nach Details oder suchen Sie in MSDN nach "Formatfunktion (Visual Basic für Applikationen)". Scrollen Sie nach unten, um die verschiedenen Datumsformatbezeichner anzuzeigen.

Methode 2

Ein weiterer Ansatz, der ebenfalls VBA verwendet, jedoch möglicherweise einfacher zu warten ist, ist der folgende:

  1. Wenden Sie das gewünschte Datumsformat im normalen Dialogfeld "Zellenformat" auf eine Zelle an. Diese Zelle kann sich auf Wunsch auf einem ausgeblendeten Blatt befinden. Sie muss dem Endbenutzer nicht angezeigt werden. Angenommen, Sie haben das Format yyyymmdd\_hhssauf Zelle $ A $ 1 angewendet (beachten Sie, dass der Unterstrich wie gezeigt maskiert werden muss).
  2. Fügen Sie die GetFormatFunktion (siehe unten) einem VBA-Modul in Ihrer Arbeitsmappe hinzu.
  3. Geben Sie =GetFormat($A$1, TRUE)in einer anderen Zelle (zB $ B $ 1 )
  4. Diese Funktion gibt die lokalisierte Version der Formatzeichenfolge zurück. Also auch wenn Sie ursprünglich formatiert $ A $ 1 mit yyyymmdd\_hhss, wenn Sie die Arbeitsmappe auf einem Computer öffnen Sie die Französisch Sprache (zum Beispiel) verwenden, wird die Funktion zeigen aaaammjj\_hhss.
  5. Verweisen Sie nun einfach auf die zweite Zelle in all Ihren TEXTFunktionen. Zum Beispiel: =TEXT(F22, $B$1).

Hier ist der VBA-Code:

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

Auf diese Weise können wir die ursprünglich formatierte Zelle ($ A $ 1) "untersuchen", um die lokalisierte Formatzeichenfolge abzurufen. Diese Zeichenfolge stellt dasselbe Format dar, das Sie angewendet haben, verwendet jedoch für die Interpretation die richtigen Buchstaben für TEXT (z. B. "j" anstelle von "d"), sodass der angezeigte Wert der Datumsangaben in allen Ländereinstellungen konstant bleibt. Wenn Sie nur ein Datumsformat für Ihre gesamte Arbeitsmappe verwenden möchten, müssen Sie die Schritte 1 bis 4 nur einmal ausführen. Wiederholen Sie dann Schritt 5 (die TEXT-Funktion) in allen Zellen, in denen Sie sie aktuell verwenden. Statt jedoch ein Format fest zu codieren, verweisen Sie einfach auf die Zelle, die die lokalisierte Formatzeichenfolge enthält ( $ B $ 1 in den Beispielanweisungen). .

Beachten Sie, dass das zweite Argument GetFormatder Funktion angibt, ob die lokalisierte Version (abhängig von den regionalen Einstellungen) oder die "Standard" -Version (die immer auf en-US basiert) zurückgegeben werden soll.

Hier sind einige Screenshots, die dies möglicherweise deutlicher machen.

en-US

  • In der Abbildung sind in Spalte 1 mehrere Darstellungen eines einzelnen Datums mit unterschiedlichen Formaten aufgeführt.
  • Beachten Sie, dass in den Zeilen 2 und 3 das Datumsformat "Systemstandard" von Excel verwendet wird. (Diese werden durch ein vorangestelltes Sternchen im Formatierungsdialogfeld angezeigt und geben an, dass das Standard-Datumsformat des Benutzers verwendet werden soll.) Beachten Sie außerdem, dass in Zeile 5 eine in Klammern stehende LCID verwendet wird. Es können verschiedene LCIDs verwendet werden, um andere Sprachen anzugeben.
  • In der zweiten Spalte wird das Ergebnis GetFormat(Cell, FALSE)für jede Zelle in Spalte 1 angezeigt. (Beachten Sie, dass FALSEfür den zweiten Parameter die Funktion die nicht lokalisierten Formate zurückgibt .)
  • Die dritte Spalte zeigt, was GetFormat(Cell, TRUE)für jede Zelle in Spalte 2 zurückgegeben wird (dh die lokalisierten Formate).
  • Die vierte Spalte zeigt das Ergebnis der TEXT-Funktion unter Verwendung des ursprünglichen Rohdatenwerts und des lokalisierten Ergebnisses von GetFormat, um das in Spalte 1 gezeigte Format wiederherzustellen. Beachten Sie jedoch, dass auf diese Spalte KEINE Zahlenformatierung angewendet wurde. Die Werte sind ein direktes Ergebnis der TEXT-Funktion.

Die Ergebnisse für den obigen englischen (US-) Fall sind nicht sehr interessant, aber Sie können sie mit den folgenden Ergebnissen vergleichen, die durch Ändern der Ländereinstellungen meines Betriebssystems in verschiedene andere Ländereinstellungen erzielt wurden. Beachten Sie, dass wir GetFormatin Kombination mit TEXTein konstantes Ergebnis für numerische Formate (die keine Tag- oder Monatsnamen enthalten) in allen Ländereinstellungen beibehalten können. Und indem wir die Sprache mithilfe einer LCID einschränken (wie in Zeile 5), können wir sogar ein konstantes Format beibehalten, wenn wir auch Tag- und Monatsnamen einbeziehen.

fr-CH

nb-NO

ru-RU

Diese Methode funktioniert für die meisten Gebietsschemas, es sollte jedoch beachtet werden, dass die zur Darstellung der hindu-arabischen Ziffern verwendeten Skripte NICHT in allen Gebietsschemas gleich sind. Daher führen regionale Einstellungen wie die des Gebietsschemas Nepali (Indien) zu Datumsformaten, die sich von den Datumsangaben in den USA "unterscheiden". Aber diese haben tatsächlich dasselbe "Format" in Bezug auf die Positionen der Zahlen - sie verwenden nur unterschiedliche Symbole für die Zahlen.

ne-IN

drwatsoncode
quelle
1
Vielen Dank für Ihre Antwort (auch zu spät) - Methode 1 ist für mich die beste und für alle meine Fälle einfach genug. Sehr gute und vollständige Antwort.
рüффп
Könnten Sie bitte erklären, wie ich den 28.11.2015 mit der ersten Methode einfügen kann? Wo und was soll ich schreiben ???????
Ilan
3

Für Datumsangaben können Sie tatsächlich ein Format definieren, bei dem Excel ein bestimmtes Gebietsschema verwendet. Wenn Sie das Zahlenformat der Zelle, in der sich Ihr Datum befindet, auf so etwas wie einstellen

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

Excel zeigt Ihr Datum in einem US-Gebietsschema an (hex 409)

Gotcha: Die YMD-Notation ist lokalisiert und wendet sich daher beispielsweise auf einem deutschen System an JMT. Sie müssen möglicherweise den Format-String an Ihre Situation anpassen, aber ich würde erwarten, dass er sich wie die Formeln (Autotranslate) auf Systemen verhält, die eine andere Sprache verwenden (wie Sie anscheinend wissen).

Weitere Informationen finden Sie hier: /programming/894805/excel-number-format-what-is-409

Eine Liste der Ländereinstellungen finden Sie hier: http://support.microsoft.com/kb/221435

TheUser1024
quelle
2
Aber es beantwortet meine Frage nicht. Ich möchte in der Lage sein, TT / MM / JJJJ in meine Excel-Tabelle zu schreiben, auch wenn das Betriebssystem "JJ / MM / AAAA" wünscht. Ich habe versucht, das Gebietsschema meines Betriebssystems zu ändern, und die Ausgabe ändert sich. Excel passt sich dann nicht dem Gebietsschema des Benutzers an. Wenn ich "jj.mm.aaaa" schreibe (wie in Französisch) und mein Gebietsschema auf US ändere, zeigt das Excel: "jj.03.aaaa", was nicht angepasst ist.
рüффп
3

Obwohl diese Frage etwas alt ist, bin ich auf eine andere (einfache!) Lösung gestoßen und poste hier der Vollständigkeit halber.

  • Ich habe die Antwort von Ricovox erfolgreich versucht, wollte aber eine Lösung ohne VBA.

  • Getestete MarinD-Lösung. Wie in den Kommentaren erwähnt, kann es jedoch recht schnell unhandlich werden, wenn Sie mehr als ein länderspezifisches Format berücksichtigen müssen.

  • Und nun zu meiner Lösung: Verwenden der nativen Excel-Funktionen YEAR (), MONTH () und DATE (), die in TEXT () eingeschlossen sind, um die vorangestellten Nullen aufzufüllen. Mit dem Datum in A1:

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

    gibt mir das Datum im YYYY-MM-DDFormat, unabhängig davon , ob das aktuelle Gebietsschema erfordert YYYY-MM-DDoder AAAA-MM-JJfür Jahr / Monat / Tag oder andere lokalisierten Namen.

    Excel übersetzt seine nativen Formeln automatisch.

istivan
quelle
1

Eine sehr einfache Möglichkeit, das ganze Durcheinander zu vermeiden, besteht darin, eine Liste von Tagen mit bekannten Daten zu erstellen und diese Liste in Ihrer Funktion zu verwenden.

Renani
quelle
4
Können Sie Ihre Antwort um ein Beispiel erweitern?
Burgi
1

Eine einfache Möglichkeit, das Problem mit dem Datumsformat des Excel-Gebietsschemas zu lösen, ist die Verwendung der folgenden CHOOSEFunktion:

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

In diesen Beispielen werden Tag und Monat in Buchstaben ohne Verwendung von Gebietsschemaformaten wie "Mmmm" oder "Dddd" oder "Jjjj" angezeigt.

Alexis PERROTTEY
quelle
Einfach, solange Sie eine Sprache verwalten (in Ihrem Fall Französisch), aber wenn Sie mehrere Sprachen verwalten müssen, wird Ihre Formel viel zu groß.
рüффп
Ich verwalte nur eine Sprache. Der Sinn der Verwendung von CHOOSE besteht darin, ein einsprachiges Excel-Arbeitsblatt zu erstellen, das auf jeder anderen Gebietsschemaversion von Excel funktioniert.
Alexis PERROTTEY
Der große Fehler der Excel TEXT-Funktion besteht darin, dass das Datumsformat von Ihrem aktuellen Windows-Gebietsschema in den Ländereinstellungen abhängt. Beispiel = = TEXT (HEUTE (); "JJJJ-MM-TT") für US = TEXT (HEUTE (); "AAAA-MM-JJ") für FR Es ist also nicht möglich, eine universelle Excel-Tabelle mit TEXT zu erstellen. Verwenden Sie stattdessen CHOOSE.
Alexis PERROTTEY
Am Ende hilft eine Lösung mit einer anderen Funktion mit fest codierten Werten nicht wirklich mehr, als die Datumsmuster fest zu codieren. Persönlich würde ich mit VBA und der akzeptierten Antwort gehen. Trotzdem danke, dass du deine Erfahrungen geteilt hast.
рüффп
1

Wenn sich Ihr Bezugsdatum in Zelle A1 befindet:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
quelle
Das ist ein guter Workaround, wenn Sie nur ein zusätzliches Format verwalten müssen ... Ich bin mir sicher, dass meine Kollegen aus Zürich oder einem anderen Land, das weder Englisch noch Französisch ist, dies immer noch nicht funktionieren wird. Wenn Sie if(if(if...für jedes einzelne Format auf der ganzen Welt erstellen müssen, ist die Verwaltung sehr schwierig.
рüффп
Das stimmt, aber ich könnte nichts Besseres finden, ohne ein VBA-Makro durchzugehen. Ich verstehe nicht, warum Microsoft die Funktionen und ihre Eigenschaften übersetzt (was noch schlimmer ist, weil sie nicht automatisch übersetzt werden, wenn Sie sie in einer anderen Sprache öffnen, wie in unserer Ausgabe hier). Das hat noch nie eine Programmiersprache gemacht. Nur Englisch wäre genug gewesen
MarinD
0

Ich habe jetzt eine ähnliche Logik wie die Methode 2 verwendet, die mit den Makros angegeben wurde. Die Makros funktionieren, aber normalerweise schaffen es die Makros nicht, wenn Sie eine Datei von einer Organisation an eine andere senden, oder das Antivirus lässt sie nicht laufen. Also habe ich ia cell einfach in dateformat umbenannt. In diese Zelle habe ich einfach den Text TT / MM / JJJJ eingegeben. Wenn ich die Textfunktion verwende, verwende ich den Zellnamen für das Format, zB = Text (C1, Datumsformat) und es scheint zu funktionieren (genau für die Schweiz funktioniert es).

Prost...

EIN.

user867292
quelle
1
Sie sagen, das funktioniert in der Schweiz, aber ist es "Französisch (Schweiz)", "Deutsch (Schweiz)" oder ist es Englisch? Wenn es Englisch ist, trägt dies nicht wirklich zu dieser Diskussion bei. Wenn es nicht Englisch ist, können Sie erklären, warum =TEXT(C1,dateformat)(mit der dateformatZelle enthaltend dd/mm/yyyy) =TEXT(C1, "dd/mm/yyyy")funktionieren würde , wenn nicht funktioniert? (Oder funktioniert es?)
G-Man sagt, dass Monica am
0

Ich kann nicht glauben, dass niemand die genannten Formate als Lösung angeboten hat.

Wenn Sie ein Datum formatieren und eingeben =TEXT(A1,"Short Date"), wird automatisch das richtige Format basierend auf der regionalen Einstellung verwendet, wobei zwischen den Regionen keine Probleme auftreten.

"Long Date" ist auch ein akzeptabler Eintrag und funktioniert nahtlos in allen Regionen. Es wird auch unabhängig von der verwendeten Version mit cvdate wieder in ein geeignetes Datum in VBA konvertiert.  

Chris Puckett
quelle
In Excel 2016 behält es die regionale Formatierung bei, die ihm zugewiesen wurde. Wenn Sie versuchen, Daten mit verschiedenen regionalen Formaten zu vergleichen, schlägt der Vergleich fehl. Das ist so schlimm, dass es wahrscheinlich ein Fehler ist.
Scuba Steve
0

Lassen Sie sich einfach eine andere imho elegante Alternative entlocken : Stackoverflow answer by @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
quelle
Es könnte nicht funktionieren. Ich kenne nicht alle Sprachen, aber solange das Wort für Monat in einigen Sprachen nicht mit "m" beginnt, funktioniert dies wahrscheinlich überhaupt nicht (Rendern eines #VALUEFehlers). Auch wenn das Wort mit "m" beginnt, gibt es hier mehr als nur zwei Möglichkeiten. Deutschland, Polen und Ungarn haben jeweils unterschiedliche Formatierungscodes, um nur einige zu nennen.
Ister
Ich gehe davon aus, dass der Entwickler weiß, in welcher Spracheinstellung er sich befindet (z. B. hier im englischen System) und in welche seine Formel übersetzt werden soll. Sollte keine große Sache sein, die IF für jede Sprache zu verlängern, an der er / sie interessiert ist.
GWD
Nun, ich habe diese spezifischen Länder aufgelistet, weil ich bereits einen Fall hatte, in dem ich mich gleichzeitig an all diese Sprachen anpassen musste. Es gibt auch ein Limit für eingebettete IFs, dies ist jedoch auch leicht zu umgehen. Ich stimme zu, dass die Idee im Allgemeinen gut ist und ihr Hauptvorteil darin besteht, dass kein VBA benötigt wird.
Ister
0

Ich weiß, spät zur Party, aber als ich das selbst untersuchte, fand ich gerade eine funktionierende Lösung in ExcelBanter, die kein VBA benötigt.

Der Weg ist, das alte Excel v4-Makrosystem zu verwenden. Sie können weiterhin über benannte Bereiche oder v4-Makroblätter darauf zugreifen. Es war auch für mich eine Lernerfahrung; Eine Excel- Seite und eine Seite auf Ron de Bruins Website waren nette Einführungen. Letzteres enthält auch einen Link zu einer Arbeitsmappe mit derselben Lösung.

Grundsätzlich kann die alte Excel v4-Makrofunktion GET.WORKSPACE verwendet werden, um Metainformationen zu vielen Dingen abzurufen, einschließlich des verwendeten lokalisierten Datumsformats. GET.WORKSPACE (37) gibt ein Array aller Zeichen zurück, die für alle Arten von Trennzeichen usw. verwendet werden, wobei der Index 19-20-21 den Buchstaben enthält, der für die Formatierung von Jahr, Monat und Tag verwendet wird. Wenn Sie also INDEX (GET.WORKSPACE (37), 19) verwenden, werden bei den Spracheinstellungen für Englisch "y", für Niederländisch "j" und für Spanisch "a" zurückgegeben. Kombinieren Sie das mit einem REPT, um den 4-Buchstaben-Code zu generieren und fertig. Das Problem ist jedoch, dass die alten v4-Funktionen (wie GET.WORKSPACE) nur von v4-Makroblättern und benannten Bereichen verwendet werden können.

Somit:

  • erstelle einen benannten Bereich und benenne ihn zB "MonthFormat"
  • gib es die Formel =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • Verwenden Sie in Ihrer Textformel diesen MonthFormat-Namen, um das Format anzugeben, z =TEXT(A1, MonthFormat)
Carl Colijn
quelle