さまざまな人がさまざまな方法でデータを入力します。セルに情報を入力すると、Excelは入力している情報の種類を把握しようとします。 08242008などの数値を入力すると、Excelは数値を入力していると見なし、それに応じて処理します。入力した数値が実際に日付であり、区切り文字がない場合はどうなりますか? Excelは入力内容を理解できますか?

残念ながら、Excelはできません。どうして?あなたはこれが日付であるべきだという指示を与えていないからです。 (数値ではなく区切り文字のExcelキー。)ユーザーまたはデータ入力担当者が入力の習慣を変更して区切り文字も入力できない場合は、入力した情報を実際の日付値に変換するための何らかの回避策が必要になります。 。

最初に考えたのは、カスタム形式を使用して情報を表示できるということかもしれません。次のカスタム形式を検討してください:

##"/"##"/"####

この形式では、番号08152008が2008年8月15日として表示されます。唯一の問題は、数値の表示のみを変更することです。日付を実際のExcelの日付として使用する場合、Excelが日付として認識する値に変換していないため、変更できません。

入力された値の形式が非常に一貫していて、数値ではなくテキストとして入力された場合は、日付に変換する簡単な方法があります。非常に一貫しているということは、入力が常に月に2桁、日に2桁、年に4桁を使用していることを意味します。さらに、値を含むセルはテキストとしてフォーマットする必要があります。この場合、次の手順に従うことができます:

。日付の列を選択します。

。日付のすぐ右側の列に何もないことを確認してください。

。 [データ]メニューから[テキストから列へ]を選択します。 (Excel 2007では、リボンの[データ]タブから[テキストを列に変換]を選択します。)Excelは、テキストを列に変換ウィザードを表示します。 (図1を参照)

。 [固定幅]オプションを選択し、[次へ]をクリックします。

。もう一度[次へ]をクリックします。

。 「列データ形式」領域で、「日付」を選択します。

。 [宛先]ボックスで範囲を選択し、ワークシートで、手順1で選択した最初の値のすぐ右側のセルをクリックします。

。 [完了]をクリックします。

すべてがうまくいけば、Excelはテキスト値を日付として解析しているはずです。元の列を削除できます。これが機能しなかった場合は、元の値がテキストとしてフォーマットされていないか、すべての日付の入力に8桁が使用されていないことを意味します。

別の可能な解決策は、数式を使用して、入力された値を実際の日付に変換することです。以下はそのような式の1つです:

=DATE(RIGHT(A1,4),LEFT(A1,IF(LEN(A1) = 8,2,1)),LEFT(RIGHT(A1,6),2))

この式は、入力された日付(区切り文字のない日付)を想定しています

セルA1にあります。数式は、7桁または8桁の日付で機能します。

カスタム関数が必要な場合は、渡されたデータを調べて日付/時刻形式に変換し、結果を返すVBAで作成できます。次の関数は、この点で非常に用途が広いです。アメリカとヨーロッパの両方の日付形式で機能します:

Function DateTime(dblDateTime As Double, _   Optional bAmerican As Boolean = True)

'Converts Date and time "number" without 'delimiters into an excel serialdate (which 'can then be formatted with the Excel 'date/time formats)



'If optional argument is TRUE (or missing), 'function assumes value is of form:

'   [m]mddyyyy.hhmm  (leading "0" not required)



'If optional argument is FALSE, function 'assumes value is of form:

'   [d]dmmyyyy.hhmm  (leading "0" not required)



Dim iYear As Integer     Dim iMonth As Integer     Dim iDay As Integer     Dim iHour As Integer     Dim iMin As Integer

iYear = Int((dblDateTime / 10000 - _       Int(dblDateTime / 10000)) * 10000)

iDay = Int((dblDateTime / 1000000 - _       Int(dblDateTime / 1000000)) * 100)

iMonth = Int((dblDateTime / 1000000))

iHour = Int((dblDateTime - Int(dblDateTime)) * 100)

iMin = Int((dblDateTime  100 - _       Int(dblDateTime  100)) * 100 + 0.5)



If bAmerican Then         DateTime = DateSerial(iYear, iMonth, iDay)

Else         DateTime = DateSerial(iYear, iDay, iMonth)

End If

DateTime = DateTime + (iHour + iMin / 60) / 24 End Function

このマクロ関数は、区切り文字なしで日付を入力するときに通常発生するように、渡されるデータが数値であることを前提としています。 (ヒントの冒頭にあるこれに関するロジックに戻って参照してください。)

お分かりのように、いくつかの回避策がありますが、日付を入力するときに区切り文字を入力するほど簡単なものはありません。これを行うために自分自身またはデータ入力担当者をトレーニングすることが難しい場合は、入力セルにいくつかのデータ検証ルールを設定することを検討してください。これらのルールは、特定の形式(区切り文字付きの日付など)を使用して情報を入力していることを確認し、入力していない場合は停止することができます。 (データ検証ルールの作成方法は、_ExcelTips._の他の問題で説明されています)

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(2039)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。