Excelで数式の日付パターンにOS地域設定を使用しないようにする方法


21

この質問によると、次の問題があります。

TEXT(A1、{date_pattern})のようなExcel関数(セルの書式設定ではない)を使用したい

しかし、以前の質問に答えた人は、Windows地域設定に従って日付パターンが変わることを発見しました。

ただし、私のOS(Windows 7)は英語であり、Officeスイートも同様です。私の地域設定を見ると、英語表記(dd.MM.yyyy)を使用したパターンも表示されます。

地域と言語

Excelからこのような動作を無効にする方法があるかどうかを知りたいです。つまり、読者のローカライズに応じてExcelシートの動作を変更したくないため、常に英語のパターンを使用し、ローカライズしたパターンは使用しないことを意味します。

簡単なケースは、日付フィールドを次のようなコンピューター中心の方法に再フォーマットすることです。「yyyymmdd_hhss」これは普遍的に認識され、簡単に上下に並べ替えることができます。しかし、私はスイスのフランスの部分にいるので、「aaaammjj_hhss」と書く必要があります。このExcelをチューリッヒの同僚に送信すると、スイスのドイツ語のローカライズを取得したときに適切な日付を見ることができません「jjjjmmtt_hhss」)

私たちはすべてのウィンドウとオフィスを英語でインストールするのに十分賢明でしたが、OS地域設定へのリンクがあるため、このような問題にまだ直面しています。

私にとっては、他のすべてのプログラムがこの設定を使用しているため、Windows設定の変更はオプションではありません。


4
これがExcelで対処されたとは信じられません。この動作により、ドキュメントの結果はファイルを開くコンピューターに完全に依存し、コンピューターによってファイルの内容が変わります。(。)...もともとドットを使用してコンピュータの小数点値のためのカンマ(、)を使用してファイルを開くときに、私はこの問題に出くわしたと数式が間違った結果を与えた
AxeEffect

回答:


26

この質問は少し古いですが、これまでのところ答えがないようです。多くのサイトで同様の質問を見たことがありますが、組み込みのExcel関数のみに関係する回答はまだ見つかりませんでした。ただし、VBAでこれを解決するのは非常に簡単です。必要な機能は非常に単純なので、これを行うためのプログラミング方法を知る必要さえありません。

ワークブックを開いた状態で、Alt + F11を押して(VBAエディターを開く)、メニュー項目[ 挿入 ] > [ モジュール ]をクリックします。 新しいVBAモジュールで、次のように入力します。

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

これはFormat、ExcelのTEXT関数の代わりにVBA独自の関数を使用するだけです。これはまさにあなたが望むものです。

この新しい関数は、指定したフォーマット文字列に従って日付(または数値)をフォーマットします。オペレーティングシステムの地域設定に関係なく、標準(en-US)表記を使用してフォーマット文字列を解釈します。

これをワークブックで使用するには、の=FMT(A1, "yyyymmdd_hhss")代わりに単に入力します=TEXT(A1, "yyyymmdd_hhss")。(もちろん、必要に応じてセル参照と書式文字列を変更できます。)

ちなみに、関数には好きな名前を付けることができます。私が選んだのはFMT、それが短く、関数が数値と日付の両方をフォーマットできるからです。ただし、必要に応じて、より説明的なものを選択できます。VBAコードと同じ名前をワークシートで使用することを忘れないでください。

VBA形式の文字列はExcelのカスタム形式の文字列とまったく同じではないことに注意してください(たとえば、分に「m」の代わりに「n」を使用します)が、よく似ています。見て、ここで詳細については、または"Format関数(Visual Basic for Applicationsで)"のためのMSDNを検索します。一番下までスクロールして、さまざまな日付形式指定子を確認します。

方法2

VBAも使用しますが、実際には保守が簡単な別のアプローチは次のとおりです。

  1. 通常の「セル形式」ダイアログを使用して、希望する日付形式をセルに適用します。このセルは、必要に応じて非表示のシートに配置できます。エンドユーザーに表示する必要はありません。yyyymmdd\_hhssセル$ A $ 1にフォーマットを適用したと仮定します(下線は表示のようにエスケープする必要があることに注意してください)。
  2. GetFormatワークブックのVBAモジュールに関数(以下に表示)を追加します。
  3. =GetFormat($A$1, TRUE)別のセルに入る(例:$ B $ 1
  4. その関数は、フォーマット文字列のローカライズされたバージョンを返します。したがって、最初に$ A $ 1をフォーマットした場合でも、yyyymmdd\_hhssたとえばフランス語を使用してコンピューターでワークブックを開くと、関数が表示されaaaammjj\_hhssます。
  5. すべてのTEXT関数で2番目のセルを参照するだけです。例:=TEXT(F22, $B$1)

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

これにより、最初にフォーマットしたセル($ A $ 1)を「検査」して、ローカライズされたフォーマット文字列を取得できます。その文字列は、適用したものと同じ形式を表しますが、TEXTの正しい文字を使用して解釈するため(たとえば、「d」ではなく「j」)、日付の表示値はすべてのロケールで一定です。ブック全体で1つの日付形式のみを使用する場合は、手順1〜4を1回実行するだけで済みます。次に、現在使用しているすべてのセルで手順5(TEXT関数)を繰り返しますが、フォーマットをハードコーディングする代わりに、ローカライズされたformat-stringを含むセルを参照するだけです(例の説明では$ B $ 1) 。

への2番目の引数GetFormatは、ローカライズバージョン(地域の設定に依存)または「標準」バージョン(常にen-USに基づく)を返すかどうかを関数に指示することに注意してください。

これをより明確にするためのスクリーンショットを次に示します。

en-US

  • この図の列1には、さまざまな形式が適用された単一の日付のいくつかの表現がリストされています。
  • 行2と3はExcelの「システムデフォルト」日付形式を使用することに注意してください。(これらは、書式設定ダイアログの先頭のアスタリスクで示され、ユーザーのデフォルトの日付書式を使用する必要があることを示しています。)また、行5は角括弧で囲まれたLCIDを使用します。異なるLCIDを使用して他の言語を指定できます)。
  • 2番目の列は、GetFormat(Cell, FALSE)列1の各セルの結果を示しています(FALSE2番目のパラメーターでは、関数がローカライズされていない形式を返すことに注意してください)。
  • 3列目は何を示しています GetFormat(Cell, TRUE)、列2の各セルに対してが返されるます(ローカライズされた形式)。
  • 4列目は、元の未加工の日付値とローカライズされた値を使用したTEXT関数の結果を示しています結果とGetFormat、列1に示す形式を再現結果を示しています。ただし、この列には数値の書式設定は適用されません。値は、TEXT関数の直接の結果です。

上記の英語(米国)の場合の結果はあまり興味深いものではありませんが、オペレーティングシステムの地域設定を他のさまざまなロケールに変更することで得られた次の結果と比較できます。使用していることを重要なのは、ノートGetFormat組み合わせにしてTEXT、我々はすべてのロケール全体の数値書式(日または月の名前が含まれていないもの)のために一定の結果を保持することができます。また、行5のようにLCIDを使用して言語を制限することにより、曜日名と月名も含める場合に一定の形式を保持することもできます。

fr-CH

nb-NO

るーる

この方法はほとんどのロケールで機能しますが、ヒンドゥーアラビア数字を表すために使用されるスクリプトはすべてのロケールで同じではないことに注意してください。したがって、ネパール(インド)ロケールのような地域の設定では、日付形式がen-USの日付とは異なるように見えます。しかし、これらは実際には数字の位置に関して同じ「フォーマット」にあります。数字に異なる記号を使用するだけです。

ねん


1
答えてくれてありがとう(遅くても)-方法1は私にとって最高であり、私のすべての場合に十分に簡単です。非常に良い完全な答え。
рüффп

最初の方法を使用して28.11.2015を挿入する方法を説明していただけますか?どこに何を書くべきですか???????
イラン

3

日付については、Excelで特定のロケールを使用する形式を実際に定義できます。日付を含むセルの数値形式を次のように設定した場合

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

Excelは、日付を米国ロケール(16進数409)で表示します

落とし穴:YMD表記はローカライズされているため、たとえばドイツのシステムではJMTになります。したがって、フォーマット文字列を状況に合わせて調整する必要があるかもしれませんが、別の言語を使用しているシステムでは、(認識しているように)式のように動作することを期待します。

詳細については、こちらをご覧ください:https : //stackoverflow.com/questions/894805/excel-number-format-what-is-409

ロケールのリストについてはこちらをご覧くださいhttp : //support.microsoft.com/kb/221435


2
しかし、それは私の質問には答えません。OSが "jj / mm / aaaa"を必要としている場合でも、Excelシートにdd / mm / yyyyを書きたいのですが。OSのロケールを変更しようとすると、出力が変更され、Excelがユーザーのロケールに応じて適応しません。「フランス語で」「jj.mm.aaaa」と記述し、ロケールを米国に変更すると、Excelには「jj.03.aaaa」と表示されますが、これは適合していません。
рüффп

3

この質問は少し古いですが、別の(簡単な!)ソリューションに出会い、完全性/参照のためにここに投稿しています。

  • ricovoxの答えを試してみましたが、VBAを使用しないソリューションが必要でした。

  • MarinDのソリューションもテストしました。しかし、コメントで指摘されているように、複数の国固有の形式に対応する必要がある場合、非常に手間がかかります。

  • そして今私のソリューションに:ExcelのネイティブYEAR()、MONTH()、およびDATE()関数を使用して、TEXT()でラップして、先頭にゼロを埋め込みます。A1の日付:

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

    YYYY-MM-DD現在のロケールが年/月/日のその他のローカライズされた名前を必要とするYYYY-MM-DDかどうかに関係なく、形式で日付を提供しますAAAA-MM-JJ

    Excelは、ネイティブの数式を自動的に変換します。


1

混乱を避けるための非常に簡単な方法は、既知の日付の日のリストを作成し、関数でリストを使用することです。


4
答えを広げて例を含めることはできますか?
ブルギ

1

Excelロケールの日付形式の問題を解決する簡単な方法は、次の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")

これらの例では、「Mmmm」、「Dddd」、または「Jjjj」などのロケール形式を使用せずに、文字で日と月を取得します。


1つの言語(あなたの場合はフランス語)を管理している限りシンプルですが、複数の言語を管理する必要がある場合、式は非常に大きくなります。
рüффп

私が管理している言語は1つだけです。CHOOSEを使用するポイントは、他のロケールバージョンのExcelで動作する1つの言語のExcelシートを正確に作成することです。
アレクシス・ペロッティ

Excel TEXT関数の大きな失敗は、日付形式が地域設定の現在のWindowsロケールに依存することです。例= USの場合== TEXT(TODAY(); "YYYY-MM-DD")= FRの場合= TEXT(TODAY(); "AAAA-MM-JJ")したがって、TEXTを使用してユニバーサルExcelシートを作成することはできません。代わりにCHOOSEを使用してください。
アレクシス・ペロッティ

最後に、ハードコーディングされた値を持つ別の関数を使用したソリューションは、日付パターンをハードコーディングする以上の助けにはなりません。個人的に私はVBAと受け入れられた答えに行きます。とにかくあなたの経験を共有してくれてありがとう。
рüффп

1

参照日がセルA1にある場合:

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

余分な形式を1つだけ管理する必要がある場合、これは良い回避策です。チューリッヒや、英語でもフランス語でもない他の国からの同僚は、とにかく動作しません。if(if(if...世界中のすべての単一のフォーマットを作成する必要がある場合、管理するのは非常に困難です。
рüффп

そのとおりですが、VBAマクロを介さずにこれ以上良いものを見つけることはできませんでした。Microsoftが関数とそのプロパティを翻訳する理由がわかりません(ここでの問題のように、別の言語で開くと自動的に翻訳されないため、さらに悪いことです)。これを行ったプログラミング言語はありません。ちょうど英語で十分だったでしょう
MarinD

0

マクロで指定された方法2と同様のロジックを使用しました。マクロは機能しますが、通常、ある組織から別の組織にファイルを送信する場合、マクロは交換によってファイルを作成しないか、ウイルス対策プログラムによって実行されません。そのため、ia cellの名前をdateformatに変更しました。このセルにテキストdd / mm / yyyyを入力しました。したがって、テキスト関数を使用しているときは、= text(C1、dateformat)などの形式のセル名を使用していますが、機能しているようです(スイスの場合は精度が高い)。

乾杯...

A.


1
これはスイスで機能すると言いますが、「フランス語(スイス)」、「ドイツ語(スイス)」、それとも英語ですか?英語の場合、これはこの議論に実際には何も貢献しません。英語でない場合=TEXT(C1,dateformat)は、(dateformatセルを含むセルでdd/mm/yyyy)なぜ=TEXT(C1, "dd/mm/yyyy")機能しないのか説明できますか?(またはそれは機能しますか?)
G-Manは「Reinstate Monica」と言います

0

名前の付いた形式をソリューションとして提供している人は誰もいなかったと思います。

日付をフォーマットして入力=TEXT(A1,"Short Date")すると、地域設定に基づいて適切な形式が自動的に使用され、地域間の問題はゼロになります。

「Long Date」も受け入れ可能なエントリであり、地域を超えてシームレスに機能します。また、使用するバージョンに関係なく、cvdateを使用してVBAで適切な日付に変換します。  


Excel 2016では、割り当てられた地域の書式設定はすべて保持されます。異なる地域形式で日付を比較しようとすると、比較は失敗します。これは非常に悪いので、おそらくバグです。
スキューバスティーブ

0

から別の私見エレガントな代替品をドロップするだけです:@TaosiqueによるStackoverflowの回答

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

うまくいかないかもしれません。すべての言語を知っているわけではありませんが、一部の言語で月の単語が「m」で始まっていない限り、おそらくまったく機能しません(#VALUEエラーを表示します)。単語が「m」で始まる場合でも、ここには2つ以上のオプションがあります。ドイツ、ポーランド、ハンガリーでは、それぞれ異なるフォーマットコードを使用しています。
アイスター

開発者は、自分が開発している言語設定(たとえば、ここでは英語のシステム)を知っており、自分の数式をどの言語設定に変換するかを理解していると思います。興味のある言語のIFを拡張しても大した問題ではないはずです
。– GWD

まあ、私はそれらの特定の国をリストしました。なぜなら、私はすでにそれらすべての言語に同時に適応しなければならなかった場合があったからです。組み込みIFの制限もありますが、これは簡単に回避できます。私はこの考え方が一般的に優れており、その主な利点がVBAを必要としないことに同意します。
アイスター

0

パーティーに遅れたのは知っていますが、自分で調べてみたところ、VBAを必要としないExcelBanter有効なソリューションを見つけました。

方法は、古いExcel v4マクロシステムを使用することです。名前付き範囲またはv4マクロシートから引き続きアクセスできます。それは私にとっても学びの経験でした。グリッドから外れたExcelのページとRon de Bruinのサイトのページは素晴らしい紹介です。後者には、同じソリューションを含むワークブックへのリンクもあります。

基本的に、古いExcel v4マクロ関数GET.WORKSPACEを使用して、使用されているローカライズされた日付形式など、多くのことに関するメタ情報を取得できます。GET.WORKSPACE(37)は、あらゆる種類の区切り文字などに使用されるすべての文字の配列を返します。インデックス19-20-21は、年、月、および日の書式設定に使用される文字を保持します。そのため、INDEX(GET.WORKSPACE(37)、19)を使用すると、英語の設定で「y」、オランダ語で「j」、スペイン語で「a」が返されます。それとREPTを組み合わせて4文字のコードを生成すれば完了です。ただし、古いv4関数(GET.WORKSPACEなど)は、v4スタイルのマクロシートと名前付き範囲でのみ使用できます。

したがって:

  • 名前付き範囲を作成し、たとえば「MonthFormat」という名前を付けます
  • それに式を与える =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • テキスト式で、このMonthFormat名を使用して、次のような形式を指定します =TEXT(A1, MonthFormat)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.