|
まず、Left関数等の戻り値についてです。
Sub test1()
Dim a As Long
a = 12345
Debug.Print VarType(Left(a, 2))
End Sub
上記コードを実行すると、イミディエトウィンドウに 8 が返ると思います。
(8 は文字列型という意味です。詳しくはVarTypeのヘルプを参照して下さい。)
12345 という数値の上 2桁を切り取ると、数値型→文字列型に変換されます。
Left(日付型,4) の返り値は2005 という値であっても
数値型でなく、文字列型として扱われています。
-----------------------------------------------------------------------
もう1点、VBA上で暗黙の型変換が行われてしまう事です。
Sub test2()
Dim a As String
Dim b As String
Dim c As Long
Dim d As Long
a = "2"
b = "5"
c = 2
d = 5
Debug.Print "A:" & a + b
Debug.Print "B:" & a * b
Debug.Print "C:" & c + d
Debug.Print "D:" & c * d
End Sub
A の結果は文字列型の「2」「5」を足しているので「25」
(通常は文字列型の連結には「&」を使いますが…)
C、Dの結果は普通の数値型の計算なので「7」「10」
B の結果は文字列型同士は掛け算出来ないため、
暗黙の型変換が行われ数値型と同じ結果を返しています。
------------------------------------------------------------------------
以上の2点から、
Left(日付型,4) = '2005'
Left(日付型,4) = 2005
どちらの場合でも VBA 上は同じ様に解釈してくれる、という事になります。
ですが「VBAが勝手に判断してくれるから大丈夫」と過信してコードを作成するのは危険ですので、
Left(日付型,4) = '2005'
CLng(Left(日付型,4)) = 2005
のように出来る限りデータ型については意識された方が無難だと思います。
-------------------------------------------------------------------------
蛇足になりますが、日付型の表記は OS の設定依存です。
わん さん もWindows を使用されていると思われますが、
コントロールパネル → [地域と言語のオプション] → [カスタマイズ] →
[日付] タブに [短い日付の形式] という欄があると思います。
上の方にあるカレンダーの種類を西暦(英語)にすると、
この [短い日付の形式] に mm/dd/yyyy などが選べる様になります。
(日本では馴染みがありませんが、英語圏ですとこの表記が標準の模様です。)
こちらの設定によっては、Left(日付型,4) が 2005 を返さずに
01/1 を返してしまう恐れも出てきてしまいます。
Left関数 を使用するよりも、Year関数の方が無難かもしれません。
(Year関数は西暦でなくグレゴリオ暦を使うと狂ってしまいますが(笑))
|
|