この質問は少し古いですが、これまでのところ答えがないようです。多くのサイトで同様の質問を見たことがありますが、組み込みの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も使用しますが、実際には保守が簡単な別のアプローチは次のとおりです。
- 通常の「セル形式」ダイアログを使用して、希望する日付形式をセルに適用します。このセルは、必要に応じて非表示のシートに配置できます。エンドユーザーに表示する必要はありません。
yyyymmdd\_hhss
セル$ A $ 1にフォーマットを適用したと仮定します(下線は表示のようにエスケープする必要があることに注意してください)。
GetFormat
ワークブックのVBAモジュールに関数(以下に表示)を追加します。
=GetFormat($A$1, TRUE)
別のセルに入る(例:$ B $ 1)
- その関数は、フォーマット文字列のローカライズされたバージョンを返します。したがって、最初に$ A $ 1をフォーマットした場合でも、
yyyymmdd\_hhss
たとえばフランス語を使用してコンピューターでワークブックを開くと、関数が表示されaaaammjj\_hhss
ます。
- すべての
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に基づく)を返すかどうかを関数に指示することに注意してください。
これをより明確にするためのスクリーンショットを次に示します。
- この図の列1には、さまざまな形式が適用された単一の日付のいくつかの表現がリストされています。
- 行2と3はExcelの「システムデフォルト」日付形式を使用することに注意してください。(これらは、書式設定ダイアログの先頭のアスタリスクで示され、ユーザーのデフォルトの日付書式を使用する必要があることを示しています。)また、行5は角括弧で囲まれたLCIDを使用します。異なるLCIDを使用して他の言語を指定できます)。
- 2番目の列は、
GetFormat(Cell, FALSE)
列1の各セルの結果を示しています(FALSE
2番目のパラメーターでは、関数がローカライズされていない形式を返すことに注意してください)。
- 3列目は何を示しています
GetFormat(Cell, TRUE)
、列2の各セルに対してが返されるます(ローカライズされた形式)。
- 4列目は、元の未加工の日付値とローカライズされた値を使用したTEXT関数の結果を示しています結果と
GetFormat
、列1に示す形式を再現結果を示しています。ただし、この列には数値の書式設定は適用されません。値は、TEXT関数の直接の結果です。
上記の英語(米国)の場合の結果はあまり興味深いものではありませんが、オペレーティングシステムの地域設定を他のさまざまなロケールに変更することで得られた次の結果と比較できます。使用していることを重要なのは、ノートGetFormat
組み合わせにしてTEXT
、我々はすべてのロケール全体の数値書式(日または月の名前が含まれていないもの)のために一定の結果を保持することができます。また、行5のようにLCIDを使用して言語を制限することにより、曜日名と月名も含める場合に一定の形式を保持することもできます。
この方法はほとんどのロケールで機能しますが、ヒンドゥーアラビア数字を表すために使用されるスクリプトはすべてのロケールで同じではないことに注意してください。したがって、ネパール(インド)ロケールのような地域の設定では、日付形式がen-USの日付とは異なるように見えます。しかし、これらは実際には数字の位置に関して同じ「フォーマット」にあります。数字に異なる記号を使用するだけです。