日付のコピーで起こる不具合

エラー

日付のコピーで起こる色々な不具合

 日付型のセルを他のセルにコピーすると全く異なった値になってしまう事があります。

 日付型は日付を扱うには便利なように書式で振舞っていますが、その中身はシリアル値であり、ただの数値です。
 このため、コピーして貼り付ける際、思うように動作しない事があるのです。
 
 ここではどのような時に不具合が起こるのか、どうすれば不具合を回避できるかを解説します。

 例として、「2000年1月1日」を色々な書式にして、別のセルに貼り付けてみました。

そのまま代入

Sub test1()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "C") = Cells(i, "A")
    Next i
End Sub

普通に代入した場合は、全てシリアル値となりました。

Textプロパティで代入

Sub test2()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "C") = Cells(i, "A").Text
    Next i
End Sub

 文字列として日付を貼り付けると、貼り付け先で自動変換が働きます
 最初と最後は結果的に上手くいきました。
 2つ目は文字列に変換されているので日付型としては機能しません。
 3つ目は「年」の値がないため今年の値に変換されました。

解決方法

 日付の表示不具合を解決するには、シリアル値書式設定をコピーする必要があります。

値をコピーしてから書式設定もコピー

 最初のコピーでシリアル値が貼り付けられ、次に書式設定の値をコピーして貼り付け先の書式設定にしています。

Sub test3()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "C") = Cells(i, "A")
        Cells(i, "C").NumberFormatLocal = Cells(i, "A").NumberFormatLocal
    Next i
End Sub

Copyコマンドを使う

 Copyコマンドを使えば、値や書式設定の他、全てを貼り付け可能です。

Sub test4()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "A").Copy
        Cells(i, "C").PasteSpecial Paste:=xlPasteAll
    Next i
End Sub

残った書式設定をクリアする方法

 NumberFormatLocal や PasteSpecial で値を貼り付けたセルは、その後も書式設定が残ります。
 書式設定を削除したければ以下のようにします。

Sub test5()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "C") = ""
        Cells(i, "C").ClearFormats '書式設定をクリア
    Next i
End Sub

 値と書式設定を同時にクリアしたい場合は、Clear も使えます。
 Clear は値、書式設定だけでなくコメントなども削除するコマンドです。

Sub test6()
    Dim i As Long
    For i = 1 To 4
        Cells(i, "C").Clear
    Next i
End Sub

まとめ

 日付型の値をコピーするには、単なる代入では上手くいきません。
 日付型の構造上、値+書式設定をコピーする必要があります。
 もちろん、Copy PasteSpecial を使って全ての属性をコピーしてしまっても良いでしょう。
 
 コピー後は書式設定が残るので、値だけ削除して書式設定を削除するのを忘れないようにしましょう。

コメント

タイトルとURLをコピーしました