推測も入ってますが・・・
そもそもSplitの結果はString型の配列になりますので、tmp(0)
の結果は
型はString
内容は"2018.10"
になっています。なぜ2018.10
をセルへ代入すると2018.1
になるかというと・・・
(A) Str(tmp(0))
わざわざStr(tmp(0))
とやってしまうとtmp(0)
の値が"2018.10"
という文字列であってもStr関数がこの値の外部表現から「浮動小数点数だなー」と解釈してしまい2018.1
という浮動小数点数に変換してからそれを文字列へ変換するという動きをするようです。
vba
1Dim a As Variant
2a = "2018.10"
3Debug.Print a
4a = Str(a)
5Debug.Print a
上記を実行してみてください。最初の印字結果は2018.10
ですが2番目は2018.1
になることが観察できます。
(B) セルの書式と代入動作
では(A)に配慮してStrを使わずtmp(0)をそのままセルへ代入すればうまくいくかというと代入先のセルの書式がデフォルトである「標準」になっているとやはりダメみたいです。つまりこういうセルへの代入の際に「代入する値が文字列であってもその外部表現を書式に合わせて解釈してしまう」という動作をするようです。書式が「標準」の場合、セルの値が数値なのか文字列なのか日付なのかは「代入しようとしている値の型」ではなく「その値の外部表現?」によって解釈されてしまうようです。よって"2018.10"
をセルへ代入しようとしてもそれが「あ、これ浮動小数点数だよね・・・きっと」と解釈されセルへ代入すると型がvbDoubleになってしまうのです。
対処1:
セルへ代入した結果、文字列としての"2018.10"
となってほしい場合はVBAが2018.10
を浮動小数点数と見做さないようセルの書式を「文字列」にする必要があります。具体的には
vba
1...
2WS.Cells(cnt, 2).NumberFormatLocal = "@"
3WS.Cells(cnt, 2) = tmp(0)
のようにすれば期待通りになると思います。
(追記:ttyp03さん回答で解決済みですが・・・上の回答はttyp03さんの(1)の方なのですが、こうすると後でセルの書式を変更した際にセルの値が2018.1
に変わってしまうため、ttyp03さん回答の(2)の方がベターかも知れません)
対処2:
前述したようにVBAでは「見た目で型が自動解釈されてしまう」仕様があるため、「浮動小数として解釈し得るような文字列データにならないように配慮する」と混乱が避けられると思います。例えば年月を2018.10
のように浮動小数に見えるような表現を取らず、2018-10
のように日付や数値として認められないような表現にするのです。
vba
1...
2tmp = WS.Cells(cnt, 1)
3WS.Cells(cnt, 2) = Left(tmp, 4) & "-" & Mid(tmp, 6, 2)
このようにすることで本件のような混乱を回避できるのではないでしょうか?