日付をそのままの文字列に変換する手順を検討し、それを自動化するそのマクロを作成します。
日付が数値になってしまう
Excel が扱う日付データの実体は、単なる数値です。
セルに日付っぽいテキストを入力すると、日付データとして扱ってくれますが、このときセルの値としては勝手に数値(シリアル値)に変換されます。
それが日付に見えているのはセルの書式設定でやっていることです。 セルの表示形式に日付の書式が設定されていると、数値を基準日からの経過日数とみなして年月日や時分秒に換算し、日付形式で表示されるようになっています。
何かしてそれが外れたときに、元の数値が裸で現れることになります。
日付を見た目そのままの日付テキストとして扱いたい時には、それをなんとかして文字列データに変換しなければなりません。
日付を文字列に変換するには
これが意外に難しくて、日付セルの表示形式を「文字列」に変更してみても、数字の文字列になるだけです。
ここでは、日付を文字列に変換する方法として、「数式で TEXT 関数を使う」やり方と、「テキストエディタにいったんコピペする」やり方の2つを検討します。
TEXT 関数でテキストに変換してみる
TEXT 関数を使うとシリアル値を日付の文字列に変換できます。それには数式で TEXT 関数に日付セルへの参照と「日付書式」を指定します。
日付書式というのは日付の表示形式を決めている式で、「yyyy年m月d日」のような決められたルールに従って記述します。
残念ながら既存のセルからその表示形式(日付書式)を取得するような関数はないので、書式ルールを手で入力してやる必要があります。書式ルールを理解して入力してもいいのですが、「セルの書式設定」ダイアログの「表示形式」で基本的な書式が取得できるので、そこからコピペしてくる方が早いでしょう。
「ユーザ定義」の「種類」テキストボックスに表示されている暗号のような文字列をそのままコピーします。 基本的に、これをそのまま貼り付けしてTEXT関数に渡せばいいのですが、日本の日付書式には余計なダブルクォーテーション(”)が挿入されているので、これらを削除しておく必要があります。
yyyy"年"m"月"d"日"
⇒yyyy年m月d日
⇒=TEXT(A1, "yyyy年m月d日")
そうなってくるともう面倒なので、よく使いそうな日付書式をそのまま数式としてコピペできるようにまとめておきます。
【手順例】
- 日付の入ったセルを選択し、「セルの書式設定」の「表示形式」から日付書式をコピーします
- ショートカット :
Ctrl+1
⇒Alt+T
⇒Ctrl+C
- 「分類」リストが「日付」になっていたら、「ユーザ定義」に切り替えてください(
Alt+C
⇒End
)
- ショートカット :
- 日付データとは別のセルに、数式で TEXT 関数を入力し、1番目の項目に日付セルの参照、2番目の項目に日付書式を入力します
- 日付書式はダブルクオート(")で囲み、書式内の余分なダブルクオートは削除します。
- 日付セルの参照は、そのセルをクリックすることで入力できます。
- 日付が文字列として表示されます。
- 必要なら、数式を他のセルにもコピーします。
- 数式セルを選択し表示形式を「文字列」に変更します
- ショートカット :
Ctrl+1
⇒Alt+C
⇒End
⇒↑↑
- ショートカット :
- 数式セルをコピーしてそのまま「値として貼り付け」してテキスト(文字列データ)に変換します。
- ショートカット :
Ctrl+C
⇒Ctrl+Alt+V
⇒V
⇒Enter
- 必要なら、これをさらに元の日付セルにコピー&ペーストします(表示形式も「文字列」にしておきます)
- ショートカット :
テキストエディタを介してコピー&ペーストしてみる
日付セルの表示形式を調べると「標準」ではなく「日付」(あるいは「ユーザ定義」)になっています。
Excel が勝手に日付テキストを「日付」形式(シリアル値)に変換するのは、入力セルの表示形式が「標準」となっているときの場合のみのようです。
あらかじめ、入力先の表示形式を「文字列」に設定しておけば、日付セルになることはありません。
コピーしたセル範囲をクリップボード経由でテキストエディタなどに貼り付けると、日付などの表示文字列がそのまま取得できます。
その後、日付セルの表示形式を「文字列」に変更したうえで、その日付テキストを Excel シートに貼り付け戻せば、テキストデータとして日付が入力でるはずです。
【手順例】
- 日付を文字列に変換したいセル範囲をコピーします
- テキストエディタ(メモ帳など)を開き、コピーしたセルデータを貼り付けます
- セルデータがTAB区切りのテキストとして展開されます
- 今度はテキストエディタで、そのテキストを全選択し、コピーしておきます。(
Ctrl
+A
⇒Ctrl
+C
) - Excel に戻り、「セルの書式設定」ダイアログで、元のセル範囲の表示形式を「文字列」に変更します
- 元の日付が数字になってしまいますが、心配ありません
- 元のセル範囲にテキストデータを「貼り付け」(
Ctrl
+V
)して上書きします - 日付が文字列としてセルに入力されています
シートを丸ごと文字列化していいならならこの方法が一番お手軽ですが、こまめに何度も繰り返すとなるとそれも苦痛になります。
セルの値を文字列データに変換するマクロ
上記のクリップボードを使ったテキスト変換を自動化するマクロ作成してみました。
本マクロは、セルの表示テキストをそのまま文字列データに変換し、セルの表示形式も「文字列」に変更するものです。
このマクロ VBA を実行すると、選択セル範囲の日付や時刻、通貨、など数値系データが表示通りの文字列データになります。
マクロ実行による文字列への変換は Undo することはできませんが、セルの書式設定を「標準」にすることで日付データに戻せるはずです。
元の日付セルの内容が数式だった場合、本マクロで数式は削除され、固定の文字列で上書きされることになるので注意してください。
Option Explicit Sub セルの値を表示文字列に変換する() If TypeName(Selection) <> "Range" Then Beep: Exit Sub Dim selRng As Range Set selRng = Selection Dim txtRng As Range Set txtRng = Intersect(selRng, ActiveSheet.UsedRange) If txtRng Is Nothing Then Beep: Exit Sub Application.ScreenUpdating = False textize txtRng selRng.Select selRng.NumberFormatLocal = "@" Application.ScreenUpdating = True End Sub Private Sub textize(rng As Range) rng.Worksheet.EnableCalculation = False Dim col As Range For Each col In rng.Columns copyRangeAsText col col.NumberFormatLocal = "@" col.Select ActiveSheet.PasteSpecial Format:="Unicode テキスト" Next clearClipboard rng.Worksheet.EnableCalculation = True End Sub Private Sub copyRangeAsText(rng As Range) Dim txt As String rng.Copy With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .GetFromClipboard txt = .getText End With Application.CutCopyMode = False With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText txt .PutInClipboard End With End Sub Private Sub clearClipboard() Range("A1").Copy Application.CutCopyMode = False End Sub
【使い方】
- 上記VBAプログラムを Excel の標準モジュールにコピー&ペーストします
- 文字列データに変換したいセル範囲を選択します
- 本マクロを実行します
- 日付や数値が文字列に変換されています
【注意】 本マクロの動作結果は元に戻す(Unde)ことができません。
【注意】 セルの内容が数式だった場合、本マクロで数式は失われ元に戻せません。
まとめ
この記事では、日付の表示の仕組みと、それをなんとか文字列データに変換する手順を検討しました。
本記事の内容は Windows 10 と Excel 2013 の環境で動作確認しました。