私はExcelで日付を扱うのに問題が常にあります、私は何か間違ったことをしなければなりませんが、私は何を理解していません。
Exchangeサーバーからエクスポートされたスプレッドシートがあります。このスプレッドシートには日付が記載された列が含まれています。私はイギリスにいますが、彼らはアメリカのフォーマットで出てきました。
問題の列はこのようになります
04/08/2012
04/09/2009
04/01/2010
04/21/2011
04/05/2012
08/30/2009
08/29/2010
08/28/2011
Excelでは、列を強調表示してFormat Cells...
を選択しました。このダイアログボックスでは、ロケールとしてDate
を選択し、English (United States)
を選択し、リストから一致する日付形式を選択しました。 [OK]をクリックして、この列でデータを並べ替えます。
この列を選択したソートダイアログで、[値]で[ソート]を選択します。ただし、順序はAからZまでのオプションのみを提供します。
これにより、日付データが最初の2桁でソートされます。
私はこのデータをISOに再フォーマットすることができ、それからAからZへのソートがうまくいくことを知っていますが、私もそうすべきではない、私は明らかに何かが足りないのです。それは何ですか?
編集:私は賞金をめちゃめちゃにしたが、これは@ r0bertsの答えに行ったはずで、彼の最初の提案区切り文字なしで列へのテキストの変換とデータの種類として 'MDY'を選択します。さらに、時間がある場合(つまり04/21/2015 18:34:22
)、まず時間データを削除する必要があります。しかし、その後は@ r0bertsによって提案された方法はうまくいきます。
問題:Excelでは、「セルの書式設定 - 数値 - カスタム」で明示的にこれらを指定しようとしても、日付を日付として認識したくありません。日付は "mm/dd/yyyy
"です。あなたが知っているように; Excelが何かを日付として認識した場合は、 "41004
"のようにこれを数値としてさらに格納しますが、指定した形式に従って日付として表示されます。混乱を招くために、Excelでは2009年8月4日などの日付の一部のみを変換することがありますが、 2009年7月28日未変換。
解決策:ステップ1、そしてステップ2
1)日付欄を選択します。データの下のボタン列にテキストを選択します。最初の画面でラジオボタンを "区切り"のままにしてクリック次へいずれかの区切りボックス(任意のボックス空白、チェックマークなし)をクリック解除し、をクリックします。次に。列データフォーマットの下で、日付を選択し、隣接するMDYを選択します。コンボボックスをクリックし、終了をクリックします。これで日付の値が得られました(つまり、Excelは自分の値をDate
データ型として認識しました)が、書式設定はおそらくロケールの日付であり、希望のmm/dd/yyyy
ではない可能性があります。
2)適切に表示される米国の日付形式を取得するには、まず列(選択されていない場合)を選択してからを選択する必要があります。 )セルフォーマット - 数字選択日付そしてロケールを選択: 英語(アメリカ)。これにより、 "m/d/yy
"のような形式になります。次に、[カスタム]を選択し、そこで「mm/dd/yyyy
」と入力するか、カスタム文字列のリストからこれを選択します。
代替方法:LibreOffice Calcを使用してください。 Patrickの投稿のデータを貼り付けたら、[形式を選択して貼り付け](Ctrl+Shift+V
)を選択し、[書式なしテキスト]を選択します。これにより、[テキストのインポート]ダイアログボックスが開きます。文字セットはUnicodeのままですが、言語には英語(米国)を選択してください。 「特別な番号を検出する」のチェックボックスもチェックする必要があります。日付はすぐにデフォルトのUS形式で表示され、日付順に並べ替えられます。あなたが特別な米国フォーマットMM/DD/YYYYを望むならば、あなたはペーストの前か後のどちらかに - "フォーマットセル"を通して一度これを指定する必要があります。
1つは言うかもしれません - Excelが "Cell Format"でそれを言ったとたんに日付を認識するべきでしたそして私はもっと同意できませんでした。残念ながら、これらのテキスト文字列を日付としてExcelに認識させることができたのは、上の手順1を経て初めてです。明らかにあなたがこれをたくさんするなら、それは首の痛みです、そして、あなたはボタンのプッシュであなたのためにこれをするであろう視覚的な基本的なルーチンをまとめるかもしれません。
すべての列を選択してLocate and Replaceに移動し、"/"
を/
に置き換えます。
私は、SAPデータベースから抽出された何千もの行と、同じ日付列に含まれる2つの異なる日付フォーマット(ほとんどが標準の "YYYY-MM-DD"ですが、約10%が "MM-")に関する同様の問題を扱っていましたDD-YYY ")毎月1回650行を手動で編集することはできませんでした。
上記のオプションのどれも(ゼロ... 0 ... nil)は働きませんでした。はい、全部試しました。どういうわけか、テキストファイルにコピーしたり、明示的にtxtにエクスポートしても、10%の日付のフォーマットにはまったく影響しませんでした。
私がそれを修正することができた唯一の方法は、誤った振る舞いの日付の列の右側に空白の列を挿入し、以下の、かなり単純な式を使うことでした:
(不正なデータがColumn D
に含まれていると仮定します)
=IF(MID(D2,3,1)="-",DATEVALUE(TEXT(CONCATENATE(RIGHT(D2,4),"-",LEFT(D2,5)),"YYYY-MM-DD")),DATEVALUE(TEXT(D2,"YYYY-MM-DD")))
その後、計算列を削除できるようになった後にのみ[値]を貼り付けることで、不正な日付の上に新しい計算列の結果をコピーできます。
これは元の質問者には関係がないかもしれませんが、日付の列を並べ替えることができない他の誰かに役立つかもしれません。
私はExcelが1900年以前の日付の列を認識しないことを発見しました。それらはテキストの列であると主張しました(1900年1月1日には1と等価の数値があり、負数は明らかに許されないので)。それで私は1900年代にそれらを置くために私のすべての日付(それは1800年代にあった)の一般的な置き換えをしました。 180 - > 190、181 - > 191など。ソート処理はうまくいきました。最後に私は他の方法で置き換えました。 190 - > 180.
これが他の歴史家に役立つことを願っています。
Excelの日付についてもまったく同じ問題がありました。この形式はExcelの日付の要件を満たしていましたが、各セルを編集しないと日付が認識されず、数千行を扱う場合は各セルを手動で編集するのは現実的ではありません。解決策は、検索を実行し、ハイフンをハイフンに置き換えた日付の行で置き換えることです。 Excelはlikeをlikeに置き換えて列を通過しますが、その結果、日付が認識されるようになります。一定!
ここでの簡単な解決策 - 新しい列を作成する= datevalue(cell)式、それから他の行に式をコピーする - 数秒間修正する
問題はExcelがフォーマットを理解できないことにあるのではないかと思います。日付フォーマットを選択しても、テキストのままです。
これを簡単にテストすることができます。日付フォーマットを更新しようとするとき、カラムを選択してそれを右クリックし、フォーマットセルを選択します(すでに行っているように)が、オプション2001-03-14(リストの一番下近く)を選びます。その後、セルのフォーマットを確認してください。
一部の日付形式のみが正しく更新され、Excelでは日付ではなく文字列として扱われることを示しています(下のスクリーンショットのさまざまな形式に注意してください)。
これには回避策がありますが、毎回エクスポートしているという理由だけで自動化されることはありません。米国から英国の日付形式に変換するマクロを実行することができるVBaを使用することをお勧めしますが、これは毎回VBaをシートにコピーして貼り付けることを意味します。
または、新しく作成したエクスポート済みのExcelシートを(交換から)読み込むExcelを作成してから、VBaを実行して日付形式を更新します。エクスポートされたExchange Excelファイルは常に同じファイル名/ディレクトリを持ち、実用的な例を提供するものとします。
そのため、ImportedData.xlsmという名前の新しいExcelシートを作成します(Excel対応)。これはエクスポートされたExchange Excelファイルをインポートするファイルです。
このVBaをImportedData.xlsmファイルに追加します。
Sub DoTheCopyBit()
Dim dateCol As String
dateCol = "A" 'UPDATE ME TO THE COLUMN OF THE DATE COLUMN
Dim directory As String, fileName As String, sheet As Worksheet, total As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
directory = "C:\Users\Dave\Desktop\" 'UPDATE ME
fileName = Dir(directory & "ExportedExcel.xlsx") 'UPDATE ME (this is the Exchange exported file location)
Do While fileName <> ""
'MAKE SURE THE EXPORTED FILE IS OPEN
Workbooks.Open (directory & fileName)
Workbooks(fileName).Worksheets("Sheet1").Copy _
Workbooks(fileName).Close
fileName = Dir()
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Dim row As Integer
row = 1
Dim i As Integer
Do While (Range(dateCol & row).Value <> "")
Dim splitty() As String
splitty = Split(Range(dateCol & row).Value, "/")
Range(dateCol & row).NumberFormat = "@"
Range(dateCol & row).Value = splitty(2) + "/" + splitty(0) + "/" + splitty(1)
Range(dateCol & row).NumberFormat = "yyyy-mm-dd"
row = row + 1
Loop
End Sub
また、日付形式をyyyy-mm-ddに更新しました。これは、Excelが最新の値ではなくソートフィルタA〜Zを指定していても機能するためです。
上記のコードにはバグがあると確信していますが、どのような種類のデータがあるのかは明らかにわかりませんが、1列の日付でテストしたので、問題ありません。
Excelでは日付が日付として認識されず、テキストとして認識されるため、並べ替えオプションはAからZになります。正しく実行すると、次のようになります。
したがって、Excelが日付を認識するようにすることが重要です。これを行う最も簡単な方法は、ショートカットを使うことです。 CTRL+SHIFT+3。
これが私があなたのデータにしたことです。上記の投稿からコピーして、Excelに貼り付けただけです。それから私は上記のショートカットを適用し、そして私は必要なソートオプションを得ました。画像を確認してください。
私はそれを考え出した!
日付の始めと終わりにスペースがあります。
私は上のすべての提案にはまったく不運でした - 魅力のように働く非常に単純な解決策を思いついたのです。データをGoogleスプレッドシートに貼り付け、日付列をハイライトし、フォーマットをクリックしてから数値をクリックし、もう一度数値を入力して数値フォーマットに変更します。次に、データをコピーしてExcelのスプレッドシートに貼り付け、日付をクリックしてから、セルを日付に合わせて書式設定します。とても速いお役に立てれば。
私はCAST AS smalldatetime
が私の問題を解決することがわかりました。解決策はこちら: https://social.msdn.Microsoft.com/Forums/sqlserver/en-US/f0f8dd05-4212-428f-8099-748e87c637ae/format-data-from-sql-server -view-as-date-in-excel?フォーラム= sqlkjpowerpivotforexcel
基礎となるクエリにアクセスできる場合は、もちろんうまくいきます。
R0bertsを含む上記のすべての解決策は失敗しましたが、この奇妙な解決策が最速の解決策であることがわかりました。
ダウンロードした口座取引のスプレッドシートで「日付」をソートしようとしていました。
これはCHROMEブラウザを介してダウンロードされました。 「日付」を少し操作しても、日付が新旧の並べ替え可能として認識されることはありません。
しかし、それから私はインターネットエクスプローラのブラウザを通してダウンロードしました - 素晴らしい - 私はコラムに触れずに即座にソートすることができました。
私は、異なるブラウザがデータのフォーマットに影響を与える理由を説明できません。
日付を選択して、このコードを実行してください。
選択中の各xcellの次のエラー時に再開
xcell.Value = CDate(xcell.Value)
次のxcell
End Sub
YYYY-MM-DDのような頑固な日付がA列にあるとします。
新しい列に移動して数式バーで列Cとし、= DATEVALUE(A2)を使用してコピーします。
値Cとしてコピー貼り付けを列Aにコピーします。列Aを短い日付としてフォーマットします。
乾杯
[数式を表示]が選択されていることに気付いた後、問題を解決することができました。 Excel 2016では、[数式]、[数式監査]セクションの順に移動し、[数式の表示]が選択されていないことを確認します。私の問題を修正しました。
ちょっと長い解決策を共有することができます.....マクロやこっけいなものを実行する必要はありません。
日付の混在Excelのスナップショット:
#VALUE
結果で終わりました。 - 最後に、作成した文字列から、DATE式によってそれらを日付に変換しました。#VALUE
はDATE式に追加されたIFERRORによるもので、列は必要に応じてフォーマットされています(ここではdd/mmm/yy)*上記のExcelシートのスナップショットを参照する(=日付が混在するExcelのスナップショット)*
同様の問題がありました、日付としてデータをフォーマットしようとしましたが、役に立ちませんでした。それから私は日付に先導的なスペースがあることに気付き、フィールドを編集してスペースを取り除きました。大量のデータには向いていませんが、それをさらに考えて、ワードパッドなどのエディタでデータをチェックして編集した可能性があります。
だから私は同じ問題を抱えていた。上記の解決策のどれも私のために働かなかったか私は私のスキルレベルのためにあまりにも複雑であることが分った。
私がやってしまったのは、日付区切り文字でテキストから列への変換でした。次に、date()関数を使用して、day、month、yearの各セルを使用して日付を再作成しました。働いた。
この問題は私を夢中にさせていました、それから私は簡単な修正につまずいた。少なくともそれは私のデータのために働いた。やりやすく覚えやすいです。しかし、なぜこれが機能するのかはわかりませんが、上記のように型を変更しても機能しません。 1.日付が含まれている列を選択します。2. 2015年など、日付の中の年を検索します。これにより、タイプが年ごとに実際の日付に変更されます。
データに何年もある場合、これはまだ面倒です。より速いのは201を検索して201を201に置き換えることです(2010年から2019年を置き換えるため)。 200を200に置き換えます(2000年から2009年を置き換えるため)。など。
これは、Excelでロケール間で日付データを交換するときに常に発生します。データをエクスポートするVBAプログラムを管理している場合は、日付自体ではなく日付を表す数字をエクスポートすることをお勧めします。書式設定とロケールに関係なく、番号は単一の日付と一意に相関します。たとえば、2010年9月24日を示すCSVファイルの代わりに40445が表示されます。
各セルを保持しているときのエクスポートループで、日付の場合は、CLng(myDateValue)を使用して数値に変換します。これは、テーブルのすべての行を実行してCSVにエクスポートするループの例です(インポート時に削除するタグで文字列内のカンマも置き換えますが、これは不要な場合があります)。
arr = Worksheets(strSheetName).Range(strTableName & "[#Data]").Value
For i = LBound(arr, 1) To UBound(arr, 1)
strLine = ""
For j = LBound(arr, 2) To UBound(arr, 2) - 1
varCurrentValue = arr(i, j)
If VarType(varCurrentValue) = vbString Then
varCurrentValue = Replace(varCurrentValue, ",", "<comma>")
End If
If VarType(varCurrentValue) = vbDate Then
varCurrentValue = CLng(varCurrentValue)
End If
strLine = strLine & varCurrentValue & ","
Next j
'Last column - not adding comma
varCurrentValue = arr(i, j)
If VarType(varCurrentValue) = vbString Then
varCurrentValue = Replace(varCurrentValue, ",", "<comma>")
End If
If VarType(varCurrentValue) = vbDate Then
varCurrentValue = CLng(varCurrentValue)
End If
strLine = strLine & varCurrentValue
strLine = Replace(strLine, vbCrLf, "<vbCrLf>") 'replace all vbCrLf with tag - to avoid new line in output file
strLine = Replace(strLine, vbLf, "<vbLf>") 'replace all vbLf with tag - to avoid new line in output file
Print #intFileHandle, strLine
Next i
Excelがあなたの列を日付として認識することを頑固に拒否した場合は、別の列に置き換えます。
Format
を選択しますdate
に設定しますPaste Special
を選択し、values
のみを貼り付けます。私は単純に数字1をコピーし、PASTE SPECIAL関数を使用してそれを日付列(データ)に乗算しました。それはそれから一般的なフォーマットに変わりますすなわち42102そしてフォーマットに適用日付を行き、それは今日付としてそれを認識します。
お役に立てれば
この問題は私がほとんど私のラップトップを壊すようにしました
手短に言うと、一部のセルでは日付がうまく機能しているが、コピーまたは手動でコピーを入力しても、データテキスト全体を列およびセルの書式設定ソリューションにコピーした場合動かない.
解決策は実際にはExcelではなく、その地域と言語の設定ではありません。
フォーマットタブで日付をMM/DD/YYYYと表示するには、フォーマットをUSに変更します。
フォーマットタブで日付をDD/MM/YYYYと表示するには、フォーマットを英国に変更します。
ほら!
私は同様の問題を抱えていました、しかし私は私が日付の終わりに余分なスペースがあることに気づきました。 replaceコマンドでスペースを削除したので、日付の並べ替えはうまくいきました。
イギリスでの私の解決策 - 私はこのようにドットが入った私の日付を持っていました:
03.01.17
私はこれを次のように解決しました:
14-03-12
を使用してください(私のダッシュが真ん中になるために不可欠です)列をソートすると、その年のすべての日付がソートされます。
私はさまざまな提案を試してみましたが、私にとって最も簡単な解決策は次のとおりであることがわかりました...
例については、画像1と2を参照してください。(注 - 一部のフィールドは例には寄与しないため、意図的に隠されていました)。これが役立つことを願っています...
フィールドC - 私を絶対に夢中にさせた混合フォーマット。これは、データがデータベースから直接取得された方法で、余分なスペースや狂った文字は含まれていません。例えば、テキストとして表示する場合、01/01/2016は '42504'タイプ値として表示され、そのまま表示されていた2006年4月15日と混在しています。
フィールドF - ここで、フィールドCの長さを取得しました(LENの式は、日付形式に応じて5 of 10の長さになります)。このフィールドは、簡単にするために一般形式です。
フィールドG - 混合日付の月構成要素を取得する - フィールドFの長さの結果(5または10)に基づいて、フィールドCの日付値から月を取得するか、文字列内の月文字を取得します。
フィールドH - 混合日付の日の成分を取得する - フィールドFの長さの結果(5または10)に基づいて、フィールドCの日付値から日を取得するか、またはストリング内の日文字を取得します。
私もその年の間これをすることができて、それから一貫している3つの要素から日付を作成します。それ以外の場合は、分析に個々の日、月、および年の値を使用できます。
これが役に立つことを願っています。