2016-10-05 1 views
0

別のアプリケーションからエクスポートされた日付の一覧があります。最初は、特別な変換や自動変換を行わずに、標準としてフォーマットされ、フォーマットはYYYY.MM.DDです。Excel VBA:2桁の年月で非常に短い日付に日付を変更すると機能しません

は、以前私はスラッシュドットに置き換えられ、Excelが自動的にうまく働いた適切なロケールDD.MM.YYYY、それらをフォーマットし、日付と日付を認識しました。

今年の最初の2桁(新しい書式DD.MM.YY)を削除したかっただけですが、試したことはありません。これまでに行ったこと:

  • currentCell.Value = CDate(currentCell.Value):これはフォーマットを日付に切り替えますが、標準の長いフォーマットがそのまま適用されます。
  • currentCell.NumberFormat = "dd.mm.yy;@"マクロを記録して値を手動で変更することからわかるように、出力形式に違いはありません。
  • currentCell.Value = FormatDateTime(currentCell.Value, vbShortDate):短い日付がDD.MM.YYYYで、現在のロケールではDD.MM.YYではありません。
  • format(date, "dd.mm.yy")(Tom Prestonとmsaintが提案):NumberFormatバージョンと比較して出力を変更しません。

私が観察したもう1つの奇妙なこと:VBAごとの日付変更を適用した後、GUIを介した手動の日付書式変更はもはや不可能であり、何の効果もないようです。

これの原因は何か、そしてVBAの本当に短い日付を達成するにはどうすればいいですか?

+0

try cDate(format(currentCell.Value、 "dd.mm.yy")) – msaint

+0

もっとコードを投稿できますか?特に細胞を参照する方法は? – User632716

答えて

2

は、これはそれが許容可能である場合は、文字列形式でお答え与えるのだろうか? format(date, "dd.mm.yy")

をお試しください

Sub Datings() 
    Dim d As Date 
    d = Now 
    Debug.Print d, Format(d, "dd/mm/yy") 
End Sub 
+0

提案していただきありがとうございますが、残念ながら4桁の数字は残っていません。私は質問を更新します。 – user121391

2

は、そしてちょうどセル内のNumberFormatを更新し、(日付としてExcelで認識されたものにテキスト日付を変換置き換える/であなたがもともといたとして:。 は、このいくつかのコンテキストを与えるために。

Sheet1.Range("A1") = Replace(Sheet1.Range("A1"), ".", "/") 
Sheet1.Range("A1").NumberFormat = "dd.mm.yy" 
1

トムプレストンによって、より周囲のコードを追加するための提案をした後、私はそれが動作しませんでした。非常に基本的なテストとして最初のセルにダレンBartrup・クックのサンプルコードを試してみたので、私はスキップするブレークポイントを使用しました前と後のすべてのコードを通してコード片。

これ

は、すべての時間が、それ 正常に働いていたが、 後で他のコードが正しくフォーマット細胞に Cells(1,1).Value = "" & Cells(1,1).Valueを呼び出すことによって書式設定を元に戻すことを明らかにしました。 GUIではまだ のように表示されていたので、気づいていませんでした。フォーマット:日付ですが、内部的に上書きされました。


完全なソリューションは、したがって、後でない接触カラムA

Range("A1:A" & lastRow).Replace What:=".", replacement:="/", LookAt:=xlPart 
Sheet1.Range("A1:A" & lastRow).NumberFormat = "dd.mm.yy" 

を使用してと同じくらい簡単でした。


ので、レッスンは学んだ:問題を絞り込むと、後々の足で自分自身を撮影しないことを確認するために多くのブレークポイントを使用しています。

1

この試してみてください:あなたのシステムが日付としての価値を認識した場合、あなたのシステムが

    それを変換し、その後、日付として値を認識しない場合は、単に
  • を再フォーマットし、

    Option Explicit 
    Sub ReformatDate() 
        Dim C As Range 
        Dim V As Variant 
        For Each C In Selection 
         With C.Offset(0, 1) 
          .NumberFormat = "dd.mm.yy" 
          If IsDate(C) Then 
           .Value = C 
          Else 
           V = Split(C.Text, ".") 
           .Value = DateSerial(V(0), V(1), V(2)) 
          End If 
         End With 
        Next C 
    End Sub 
    
    • dotを区切り文字として使用して分割します。
    • 部分を実際の日付に変換します。
    • ライトバックそれとフォーマットに応じ
あなたはそれを上書きしたい場合は代わりに次の列の値を置くこと、適切な修正を加える必要があります

。変換する範囲を選択するより自動の方法を使用する場合は、

関連する問題