2012-03-23 18 views
3

毎週、または誰かが日付がアメリカの形式に変換されている(壊れていますか?他の多くの人々と同様に、私は助けようとしましたが、問題は分かりません。私は今原因を発見したのだろうかと思う。.NumberFormatが時々誤った日付と時刻を返します

私は、Excelワークシートからデータを抽出し、Excelユーザーが見ることができる値に一致するようにフォーマットされた文字列として出力する必要があるアプリケーションに取り組んでいます。したがって、値が "1"と表示されるようにフォーマットされている場合は、文字列を "1.00"にします。

セルの値を数値、日付、または時間でテストすることで、この効果が得られます。もしそうであれば、私は番号の形式を取得し、そのセルの値をフォーマットするためにそれを使用します。ほとんどのケースで

With .Cells(Row, Column) 
    Output string = Format(.Value, .NumberFormat) 
End With 

これは私が必要と正確に出力を提供します。しかし、ソースが英国の日付または時刻としてフォーマットされているアメリカの日付と時刻が取得されることがあります。

Excel 2003とExcel 2007で多くの実験を行った結果、原因を発見しました。 (私はExcel 2010にアクセスすることはできませんが、私はそれが同じ問題を抱えていると推測する質問から)この問題は、インターネット上で何も発見できないことを誰かが気付いたので、この問題を世界に明らかにすることを意図しています。 (疑いなく、誰かが "xyz"をグーグル・グーグルに返信し、即座に答えを得たということは間違いありません)。しかし、この質問の主な目的は、あらゆる状況で必要な結果を得るための提案を求めることです。

通常、「23mar12」のように日付を入力します。 Excelはこれを日付と認識し、それを "23-Mar-12"とフォーマットします。私はFormat Cellsを選択し、カスタムフォーマットを入力または選択するか、日付フォーマットの1つを選択することができます。

ただし、私が選択するフォーマットは記録されたフォーマットではありません。カスタムフォーマット "dd/mm/yyyy"は、日付フォーマット "* 14/03/2001"として記録されます。これは明らかに問題がない限り、さらに下に行くまではありません。

私は日時の列を作成し、それぞれ異なるカスタムまたは標準形式でそれぞれの書式を設定しました。私はこれらの日付と時刻のそれぞれについてNumberFormatを抽出し、それを隣接する列に文字列として書き込むマクロを書きました。私はまた数値フォーマットを使用して値をフォーマットし、その文字列を第3列に書きました。

多くの場合Excelで選択されたと記録されたフォーマットは、のNumberFormatによって返される形式ではありませんでした:

Excel format   NumberFormat 
Date: * 14/03/2001  m/d/yyyy 
Date: * 14 March 2001 [$-F800]dddd, mmmm dd, yyyy 
Date: 14/03/2001  dd/mm/yyyy;@ 
Date: 14/03/01   dd/mm/yy;@ 
Date: 14/3/01   d/m/yy;@ 
Date: 14.3.01   d.m.yy;@ 
Date: 2001-03-14  yyyy-mm-dd;@ 
Date: 14 March 2001 (1) [$-809]dd mmmm yyyy;@ 
Date: 14 March 2001 (2) [$-809]d mmmm yyyy;@ 
Custom: hh:mm:ss  h:mm:ss 
Time: * 13:30:55  [$-F400]h:mm:ss AM/PM 
Time: 13:30:55 (1)  hh:mm:ss;@ 
Time: 13:30:55 (2)  h:mm:ss;@ 
Time: 01:30:55 PM  [$-409]hh:mm:ss AM/PM;@ 
Time: 1:30:55 PM  [$-409]h:mm:ss AM/PM;@ 

Excel形式列の値(1)及び(2)に私が追加されました2つの明らかに同一のフォーマットが存在することを示します。 NumberFormat列からわかるように、それぞれの場合、第2のバージョンは先行ゼロを抑制する。

ほとんどの変更は重要な影響を与えません。 "[$ -F800]"などは明らかにダミー値であり、効果はありません。明らかに、「F800」をMicrosoftの国コードに置き換えて、その国の言語に翻訳された日と月の名前を付けることができます。

ただし、Microsoftがアスタリスクでマークする3つの標準形式は、容認できないほど変更されています。日付はリトルエンディアンからミディアムエンディアンに変更されます。 「* 2001年3月14日」に時刻が24時から12時に変更され、曜日が追加されます。

アスタリスクを日付に対して使用すると、コメントが参照されます。「タイプリスト(番号タブ、セルの書式設定)」ダイアログボックスでアスタリスク()を持つアイテムを除き、適用する日付書式では、 「オペレーティングシステム」と表示されます。「アスタリスク()が[タイプ]リスト([番号]タブ、[セルの書式設定]ダイアログボックス)にあるアイテムを除いて、オペレーティングシステムと一緒に使用することができます」。

標準の日付と時刻の形式では、結果が得られない可能性があることをユーザーに警告できます。しかし、彼らが普及しているフォーマット「dd/mm/yyyy」を望むなら、それを持つことはできません。たとえば「dd-mm-yyyy」はOKですが、カスタム形式「dd/mm/yyyy」は日付形式になります。「* 14/03/2001」は「m/d/yyyy」になります。

私の最初のところに戻ってください:ある特定の日付形式のこの奇妙な取り扱いは、多くの人が日付を主張している理由が時々アメリカ形式に変換されているので、問題がそれほどわかりにくいのですか?私は他のグループが何をしているのか分からない、あるタイプのMicrosoftプログラマーの他の場所で、このタイプの問題に遭遇しました。これは、一部の機能が常に機能し、他は機能しないことがある理由ですか?マイクロソフトのプログラマーの中には、正しい形式を探す場所とそうでないものがあります。

さらに重要なことは、私にとっては、誰でも提案することができます:

  • を私は本当の日付や時刻の形式を取得する方法は?
  • 日付または時刻のユーザーの選択した表示形式を決定する他の方法はありますか?

BTW 1:私は30年前に、アメリカ軍が月/日/年形式を使用していないと言いました。アメリカの民間人だけがこのフォーマットを使用しています。これが本当なら誰でも教えてくれますか?

BTW 2:同様の問題はExcelの色にあります。 Excelは色を "ggbbrr"として保持し、他の人は "rrggbb"として保持します。 .Net Excelインターオペラのプログラマーは、スクリーンを制御するために使用する前に、Excelのカラー番号を聞いたり、取り消したりしなかった。

+0

及び(2)ビット、 'D 'は' dd'が一桁の日にゼロを付加として、一桁または二桁の日を示しています。同様に 'h'は10桁未満で1桁の時間を与え、' hh'は0を前に付けます。フォーマットは同じではないので、それぞれの曜日または時間が2桁の場合、同じ結果が返されます。 – Pete

+0

私は言う: "Excel形式の列の値(1)と(2)は、2つの明らかに同じ形式があることを示すために私によって追加されました。先行ゼロ。それはあなたのコメントとどのように違いますか? –

+0

@Pete上記のコメントにあなたの名前を含めるのを忘れてしまった。 –

答えて

1

地域別の設定で保存されたテキストファイルを開くときに、主にフォーマットと日付の問題が発生しています。これに対処するための二つの有用な細胞の特性は以下のとおりです。

  • .Value2がフォーマットされていないセルの値または日付のシリアル番号を返します表示されるよう

    • .Textは、セルの値を返します。

    標準の日付と数値の書式は、Windowsの地域設定によって異なりますが、同じブックが別の地域で異なって表示される可能性があります。 MSは、地域コード接頭辞を必要な場合に一貫性のある表示を実施するための数値書式(Excel 2000に記載)で導入しましたが、明示的に選択する必要があります。

    ユーザーが実際に入力した日付または数字を表示したい場合は、ワークシートのセル形式と共有された文字列xml定義を調べて.xlsxファイルの内容を抽出し、ワークブック。基本的な値が内部的にシリアル番号として保存されていて、これは変更されないため、これを行う必要はありません。

  • +0

    私はTextプロパティを認識していましたが、その重要性は認識していませんでした。それは私が構築したすべての例に対して正しい表示値を生成します。ありがとうございました。ただし、テキストファイルをインポートするのではなく、ユーザーが入力した値を探しているわけでもありません。 Excelの場合は、地域の設定を考慮に入れて良いです。 Excelが地域の設定を無視し、ユーザーの要件が間違っています。これは.NumberFormatプロパティが行っていることです。私はまだこれが多くの報告された問題の原因だと思っています。しかし、あなたはもう一度ありがとう私の問題を解決しました。 –

    +0

    .Textプロパティが問題を解決したことをうれしく思っています。 '.NumberFormat'についてのあなたの意見をより明確に見ています。実際にはバグのように見える日付形式の地域設定には反応しません。私は 'Evaluate'と似たようなものを見つけました。これはいつもUS形式で日付を扱い、過去に私に悲しみをもたらしました。 –

    0

    目次1:軍隊に入ってから30年近く経ちました。 私はヘリコプターで作業していましたが、私は航空機のログブックにこのような形式を使用するように教えられました:4月3日3日。この方法では、2012年4月3日には不思議はありません - それは4月3日か3月4日ですか?

    +0

    私の記憶が間違っていないことを確認してくれてありがとう。 –

    0

    私はこれをハッキングしました:元のデータを既知の形式で書き換えます。それはDateSerialのとTimeSerialないに依存している:あなたの(1)について

    'Google spreadsheet stores dates in USA format (MM/DD/YYYY). We're in Australia, using DD/MM/YYYY, so we need to swap them. 
            ' 
             With dc 'the cell who contains a date in USA format. 
              d = .Value  'capture value in USA format 
              t = TimeValue(d) 
              .NumberFormat = "dd/mm/yyyy" 'set to OZ format, so Excel knows the values were swapped in its internal math. 
              .Value = DateSerial(Year(d), Month(d), Day(d)) 'DateSerial takes y,d,m. We swap Month and Day components, to get OZ format dates 
              .Value = .Value + TimeSerial(Hour(t), Minute(t), Second(t)) 
              dc.Font.Bold = True       ' We bold the cells that are swapped, for debugging 
             End With 
            End If 
    
    +0

    答えをありがとうが、私はそれが私の質問に関連しているとは思わない。私はGoogleスプレッドシートに精通していませんが、米国の日付形式で保存されていると驚いています。 Excelは、1899年12月31日からの日数として日付を格納します。私の問題と他の人の問題は、その数値を文字列に変換するときにExcelが誤った形式を使用することがあります。私は日付がdd/mm/yyyyとして入力されたときExcelがそれを正しく認識して表示するが、NumberFormatを要求するとmm/dd/yyyyが与えられることを発見した。 Excelは正しい形式を認識していますが、間違った形式を外部に提供します。 –

    +0

    ところで、あなたのコードがExcel VBAの場合、値は変更されませんでしたが、 '.NumberFormat =" dd/mm/yyyy ""はUSAから表示された場合の外観を変更します。 –

    +0

    ええ、私のコードはあいまいなデータを取り、それをデータ値dd/mm/yyyyと見なさなければなりません。申し訳ありませんがあなたの問題に関連していない場合。 – joshoff