it-swarm.com.de

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

Laut dieser Frage habe ich folgendes Problem:

Ich möchte eine Excel-Funktion (nicht die Zellenformatierung) 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 and Language

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 computerzentrierte Art und Weise wie folgt: "yyyymmdd_hhss" Dies wird allgemein erkannt 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 erwarten) "jjjjmmtt_hhss")

Wir waren schlau genug, um alle Windows- und Office-Programme auf Englisch zu installieren, aber wir haben immer noch Probleme damit, weil dieser Link zu den regionalen Einstellungen des Betriebssystems führt.

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

19
рüффп

Diese Frage ist ein bisschen alt, aber bisher 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 (zum Öffnen des VBA-Editors). 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 Funktion Format anstelle der Funktion TEXT von Excel 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") anstelle von =TEXT(A1, "yyyymmdd_hhss") ein. (Natürlich können Sie den Zellbezug und die Formatzeichenfolge nach Bedarf ändern.)

Sie können die Funktion übrigens beliebig benennen. Ich habe FMT gewählt, weil 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 "Format Function (Visual Basic für Applikationen)". Scrollen Sie nach unten, um die verschiedenen Datumsformatbezeichner anzuzeigen.

Methode 2

Ein weiterer Ansatz, der ebenfalls VBA verwendet, aber 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\_hhss auf Zelle $ A $ 1 angewendet (beachten Sie, dass der Unterstrich wie gezeigt maskiert werden muss).
  2. Fügen Sie die Funktion GetFormat (siehe unten) einem VBA-Modul in Ihrer Arbeitsmappe hinzu.
  3. Geben Sie =GetFormat($A$1, TRUE) in eine andere Zelle ein (z. B. $ B $ 1 )
  4. Diese Funktion gibt die lokalisierte Version der Formatzeichenfolge zurück. Auch wenn Sie ursprünglich $ A $ 1 mit yyyymmdd\_hhss formatiert haben, zeigt die Funktion aaaammjj\_hhss an, wenn Sie die Arbeitsmappe auf einem Computer (beispielsweise in französischer Sprache) öffnen.
  5. Verweisen Sie nun einfach auf die zweite Zelle in allen TEXT-Funktionen. 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 der Beispielanleitung).

Beachten Sie, dass das zweite Argument für GetFormat der Funktion mitteilt, 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 sind im Dialogfeld "Format" durch ein vorangestelltes Sternchen gekennzeichnet 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, mit der die Sprache für Monats- und Tagesnamen auf Englisch festgelegt wird. Es können verschiedene LCIDs verwendet werden, um andere Sprachen anzugeben.
  • Die zweite Spalte zeigt das Ergebnis von GetFormat(Cell, FALSE) für jede Zelle in Spalte 1. (Denken Sie daran, dass FALSE für den zweiten Parameter bewirkt, dass die Funktion die NICHT lokalisierten Formate zurückgibt.).
  • Die dritte Spalte zeigt, welche GetFormat(Cell, TRUE) für jede Zelle in Spalte 2 zurückgibt (d. H. 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 NO Zahlenformatierung wurde auf diese Spalte angewendet. 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. Wichtig ist, dass wir durch die Verwendung von GetFormat in Kombination mit TEXT in der Lage sind, ein konstantes Ergebnis für numerische Formate (diejenigen, die keine Tag- oder Monatsnamen enthalten) in allen Ländereinstellungen beizubehalten. 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". Diese haben jedoch tatsächlich dasselbe "Format" in Bezug auf die Positionen der Zahlen - sie verwenden lediglich unterschiedliche Symbole für die Zahlen.

ne-IN

23
drwatsoncode

Für Datumsangaben können Sie 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: https://stackoverflow.com/questions/894805/Excel-number-format-what-is-409

und hier eine Liste der Ländereinstellungen: http://support.Microsoft.com/kb/221435

4
TheUser1024

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

  • Ich habe Ricovoxs Antwort erfolgreich ausprobiert, 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 Nullen vor den Zeilen 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-DD-Format, unabhängig davon, ob für das aktuelle Gebietsschema YYYY-MM-DD oder AAAA-MM-JJ oder andere lokalisierte Namen für Jahr/Monat/Datum erforderlich sind.

    Excel übersetzt seine nativen Formeln automatisch.

3
istivan

Eine einfache Möglichkeit, das Problem mit dem Datumsformat des Excel-Gebietsschemas zu lösen, ist die Verwendung der Funktion 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")

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

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

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.

1
Renani

Ich weiß, spät zur Party, aber als ich das selbst untersuchte, fand ich gerade eine funktionierende Lösung für 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 Seite auf Excel außerhalb des Rasters und eine 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 die Spracheinstellungen für Englisch mit "y", für Niederländisch mit "j" und für Spanisch mit "a" gekennzeichnet. 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:

  • erstellen Sie einen benannten Bereich und benennen Sie ihn z. "MonthFormat"
  • gib die Formel =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • verwenden Sie in Ihrer Textformel diesen MonthFormat-Namen, um das Format anzugeben, z. B. =TEXT(A1, MonthFormat)
0
Carl Colijn

Einfach eine weitere imho elegante Alternative aus Stackoverflow Antwort von @Taosique

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

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 Zellennamen für das Format, z. = Text (C1, Datumsformat) und es scheint zu funktionieren (genau für die Schweiz funktioniert es).

Prost...

EIN.

0
user867292

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

Wenn Sie ein Datum formatieren und =TEXT(A1,"Short Date") eingeben, 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 über Regionen hinweg. Es wird auch in VBA mit cvdate unabhängig von der verwendeten Version wieder in ein korrektes Datum konvertiert.

0
Chris Puckett