web-dev-qa-db-ja.com

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

この質問 によると、私は次の問題を抱えています:

TEXT(A1、{date_pattern})のような(セルのフォーマットではなく)いくつかのExcel関数を使用したい

しかし、私の前の質問に答えた人は、Windowsの地域設定に従って日付パターンが変化することに気付きました。

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

Region and Language

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

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

私たちはすべてのウィンドウとオフィスを英語でインストールするのに十分なほど巧妙でしたが、OSの地域設定へのこのリンクが原因で、依然としてこのような問題に直面しています。

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

22
рüффп

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

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

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

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

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

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

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

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

方法2

VBAを使用するが、実際には管理が簡単な別のアプローチは次のとおりです。

  1. 通常のセル形式ダイアログを使用して、希望の日付形式をセルに適用します。このセルは、必要に応じて非表示のシートに配置できます。エンドユーザーに表示する必要はありません。 _yyyymmdd\_hhss_の形式をセル$ A $ 1に適用したとします(下線は次のようにエスケープする必要があることに注意してください)。
  2. GetFormat関数(下に表示)をワークブックのVBAモジュールに追加します。
  3. 別のセルに=GetFormat($A$1, TRUE)と入力します(例:$ B $ 1
  4. その関数は、フォーマット文字列のlocalizedバージョンを返します。したがって、最初に_yyyymmdd\_hhss_を使用して$ A $ 1でフォーマットした場合でも、フランス語を使用するコンピュータでブックを開くと(たとえば) 、関数は_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関数)を繰り返しますが、フォーマットをハードコーディングする代わりに、ローカライズされたフォーマット文字列(を含むセルを参照するだけです。 )$ B $ 1の例の指示)。

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

これは、これをより明確にするかもしれないいくつかのスクリーンショットです。

en-US

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

上記の英語(米国)の場合の結果はそれほど興味深いものではありませんが、オペレーティングシステムの地域設定を他のさまざまなロケールに変更することによって得られた次の結果と比較できます。重要なことに、GetFormatTEXTと組み合わせて使用​​すると、すべてのロケールで数値形式(日または月の名前を含まないもの)の定数結果を保持できることに注意してください。 (5行目と同様に)LCIDを使用して言語を制限することにより、日と月の名前を含める場合でも、一定の形式を維持することもできます。

fr-CH

nb-NO

ru-RU

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

ne-IN

26
drwatsoncode

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

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

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

Gotcha:YMD表記はローカライズされているため、たとえばドイツ語のシステムではJMTになります。だからあなたはあなたの状況にフォーマット文字列を適応させなければならないかもしれませんが、私はそれが異なる言語を使用しているシステムの数式(自動翻訳)のように動作することを期待します(あなたが気付いているようです)。

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

ロケールのリストについては、ここに http://support.Microsoft.com/kb/221435

3
TheUser1024

この質問は少し古いですが、別の(簡単な!)解決策に出会い、完全性/参照のためにここに投稿しています。

  • 私はricovoxの答えをうまく試しましたが、VBAなしのソリューションを望んでいました。

  • MarinDのソリューションもテストしました。ただし、コメントで指摘されているように、複数の国固有のフォーマットに対応する必要がある場合は、非常に速く扱いにくくなる可能性があります。

  • そして今私の解決策に:TEXT()でラップされたExcelのネイティブYEAR()、MONTH()およびDATE()関数を使用して、前にゼロを埋めます。 A1の日付:

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

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

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

3
istivan

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

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

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

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

1
Renani

パーティーには遅刻しましたが、これを自分で調べたところ、VBAを必要としない ExcelBanter の実用的な解決策を見つけました。

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

基本的に、古い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)のような形式を指定します
0
Carl Colijn

から取られた別のimhoエレガントな代替品をドロップするだけです Stackoverflow answer by @Taosique

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

数式とマクロなしのソリューションの場合、セル(_Ctrl-1_)を_Number->Date_としてフォーマットします。

米国以外のロケールでリストされている最初の2つの形式タイプ(アスタリスクが前に付いています)は、ドキュメントが開かれた場所に応じて自動的にローカライズされ、間違いなくVBAにマップされますFormat() _"Short Date"_および_"Long Date"_、つまり、Windows設定のRegion Date Formatで設定されたものに。他の形式では、ローカライズされません(ヘルプテキストによると)。

したがって、固定の米国英語形式を使用する場合は、Locale->English (United States)を選択します。 [セルの書式設定]ダイアログボックスの_14-Mar-12_。

English (United States)ロケールには、ISO8601スタイルの日付形式_yyyy-mm-dd_があり、ロケール間で明確になるように設計されています。

0
user1254127

マクロで提供される方法2と同様のロジックを使用しました。マクロは機能しますが、通常、ある組織から別の組織にファイルを送信する場合、マクロは交換を介してファイルを作成しないか、アンチウイルスがそれらを実行させません。したがって、iaセルの名前を単にdateformatに変更しました。このセルには、dd/mm/yyyyというテキストを入力しました。したがって、テキスト関数を使用しているときは、フォーマットにセル名を使用しています。 = text(C1、dateformat)と動作しているようです(スイスでは正確です)。

乾杯...

A.

0
user867292

名前付きフォーマットをソリューションとして提供した人が誰もいないとは思えません。

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

「ロングデート」も許容されるエントリで、リージョン間でシームレスに機能します。また、使用されているバージョンに関係なく、cvdateを使用してVBAで適切な日付に変換されます。

0
Chris Puckett