日付をはじめとする数字の表記の問題

日付の1桁の数字のみ全角にして表示する

変な風習

書類なんかの日付の表記(まあ、日付以外もですけど)について、ウチの職場には、

数字が1桁のときは全角、2桁のときは半角!

という謎ルールがあって、これがWordやExcelを使った作業と本当に相性が悪い。

もちろん、この謎ルールのせいで、使用フォントは見出しが「MSゴシック」、本文が「MS明朝」のそれぞれ一択w

Wordなんかの場合、デフォルトだと英数字がCentury(だったかな?)なので、「スタイル」とかの知識のない人たちは皆、

  • 書類作成
  • 全範囲を選択
  • フォントを「MS明朝」(またはMSゴシック)に変更
  • 完成

という妙な作業をやっている。

こんなアホなことをせんですむように皆さんに説いて回りたいのはやまやまなれど、

誰でもできる仕事が一人前以上フツーに割り振られている上に、私にしかできない仕事が発生したら純粋に上積みで私に回ってくる

という事情、及び

皆「忙しい」が口癖みたいになっているので、教えようとしても迷惑がられる

というのが現状なので、黙っているwww

まあ、そんな職場です。

Excelで変な風習に合わせる

せっかくExcelには

データは日付型として持っておいて表示形式だけを操作する

という超便利な機能があるのに、この変な風習のせいでExcelに日付型データを入力するという発想自体が根こそぎ刈り取られているのが実情。

しかし、この状態を放置するのはあまりにむかつくので、

日付データを「1けた全角、ほか半角」方式に変換する関数

を作った。

日付データを「1けた全角、ほか半角」方式に変換する関数

リスト1
Private Function adjustExpressionOfDate(ByVal style As Integer, _
                                        ByVal dt As Date) As String    '……(1)'
  Dim str As String    '……(2)'
  Dim m As String
  Dim d As String
  m = Month(dt)    '……(3)'
  d = Day(dt)
  '第1引数が「WHEN_SINGLE_DIGIT~」だったら1桁の数字を全角にする'
  If style = WHEN_SINGLE_DIGIT_EXCHANGE_TO_WIDE Then
    If m < 10 Then m = StrConv(m, vbWide)    '……(4)'
    If d < 10 Then d = StrConv(d, vbWide)
    '文字列として結合する'
    str = m & "月" & d & "日" & "(" & Format(dt, "aaa") & ")"    '……(5)'
    adjustExpressionOfDate = str    '……(6)'
    Exit Function    '……(7)'
  End If
  '第1引数が「WHEN_SINGLE_DIGIT~」でなかったら半角のまま文字列にして返す'
  adjustExpressionOfDate = m & "月" & d & "日" & "(" & Format(dt, "aaa") & ")"    '……(8)'
End Function

(1)で、

Private Function adjustExpressionOfDate(ByVal style As Integer, _
                                        ByVal dt As Date) As String

2つの引数を渡すようにしている。

第1引数の「style」で変換方式を指定するようにし、
第2引数のdtで日付データを渡すようにした。

「style」については、今回はとりあえず「○月○日(曜日)」という形式を定数「WHEN_SINGLE_DIGIT_EXCHANGE_TO_WIDE」(中身はIntegerの「1」。長っw)で指定するようにした。

で、どの道「8月29日(火)」みたいな形にしてしまうともはや日付データとしては扱えないので、返り値はString型にした。

(2)からの3行

Dim str As String
Dim m As String
Dim d As String

で変数を宣言。それぞれの役割は以下の通り。

  • 「str」には最終的にできあがった日付文字列を格納する
    ※不要ですが、可読性向上のために使う。
  • 「m」には月の数字を格納する
  • 「d」には日の数字を格納する

(3)からの2行

m = Month(dt)
d = Day(dt)

で変数「m」、「d」にそれぞれ月・日の数値を代入。

この関数に渡された第1引数が「WHEN_SINGLE_DIGIT_EXCHANGE_TO_WIDE」だったら、(4)以下の処理に移る。

(4)からの2行

If m < 10 Then m = StrConv(m, vbWide)
If d < 10 Then d = StrConv(d, vbWide)

で、それぞれ1桁だったら全角に変換する。

あとは、(5)の

str = m & "月" & d & "日" & "(" & Format(dt, "aaa") & ")"

で「○月○日(曜日)」の形式になるように整形して変数「str」に代入。

(6)の

adjustExpressionOfDate = str

で返り値を設定し、(7)の

Exit Function

で呼び出し元に帰る。

ここでExitするのは、後々の拡張性のため。

今回は「○月○日(曜日)」の形式だったが、今後

元号も入れんかい!」

とか後出しジャンケンされたときには、その処理を書いて、第1引数の「style」で分岐できるようにすればよい。

(8)の

adjustExpressionOfDate = m & "月" & d & "日" & "(" & Format(dt, "aaa") & ")"

を最後に書いているのはそういうこと。

実行結果

f:id:akashi_keirin:20170611101901j:plain

この状態で、次のコードを書いて実行。

スト2
Public Sub getAdjustedDateString()
  ActiveCell.Offset(0, 1).Value = _
    adjustExpressionOfDate(WHEN_SINGLE_DIGIT_EXCHANGE_TO_WIDE, _
                           ActiveCell.Value)
End Sub

f:id:akashi_keirin:20170611101908j:plain

無事に変換された。

ちなみに、月、日ともに1桁でも

f:id:akashi_keirin:20170611101916j:plain

この通り大丈夫。

文字の位置がそろっていないのはプロポーショナルフォントにしているせい。

みんな大好き(笑)「MSゴシック」にすると……。

f:id:akashi_keirin:20170611101922j:plain

ほれ、このとおりピッタリそろった! よかったねw

おわりに

しっかし、こんなしょうもないことに神経を使うなんて、それこそ無駄だと思うんですけど。

こんな謎風習を生きながらえさせている上長には「働き方改革」とかほざいてほしくないっす。

@akashi_keirin on Twitter