久しぶりにVBAを書いていると、「Numberだっけ?」とか、よく分からない記憶の混濁が起こるわけです。
Excel VBA
数値型に変換
VBAでの細かい処理ではあります。
単純な話ですし。
備忘録です。
数値型に変換する関数
以下のような処理を目指しておりました。
関数があることは分かっていたのです。
- 年月を表す YYYYMM の MM を抽出
- MM を M 表記に変更
たとえば、「202403」(2024年3月)から「3」(3月)を抽出したいという話です。
つまり「03」ではなく「3」です。
もちろん「12」のときには「12」です。
ゼロ始まりのときだけ、頭のゼロをなくしないのです。(ゼロを落としたいとかいった言い方をしますね。)
ファイル名から表示内容を取得するような感じです。
CInt or CLng
文字列を整数型に変換します。
VBAなので、元の文字列の型はあまり気にしなくても大丈夫です。
String型でもVariant型でも、それらしい値ならそれらしい処理になります。
表記がすべてです。
整数型に収めるための関数があります。
CInt
Integer型に変換します。
有効範囲は -32,768 ~ 32,767 です。
Cell(1, 1).Value = CInt("001")
「1」が出力されます。
今回の処理は、年月を表す6文字から月を取り出すだけですので、Integerで足りています。
CLng
Long型に変換します。
有効範囲は -2,147,483,648 ~ 2,147,483,647 です。
Cell(1, 1).Value = CLng("001")
「1」が出力されます。
Integer型よりも広い範囲を扱えます。
想定値次第で、どちらかの型を活用でしょう。パワーが限られるマシンだと、メモリー計画も考えるべきなのですが、手元で取り扱うような処理をイマドキなマシンで稼働させるくらいでしたら、メモリーの限界は考慮不要でしょう。分からなかったら大きい方を使っておけば間違いないです。
他にも方法は考えられるが
今回やりたかったことを実現する方法は、他にもいろいろとあるかと思います。
たとえば、月を扱うだけなので、5文字目が「1」かどうかで処理を分けるとか、値を月数として扱ってしまうとかいったことでしょうか。
前者なら以下でしょうか。
If Mid("202403", 5, 1) = "1" Then
Cell(1, 1).Value = Right("202403", 2)
Else
Cell(1, 1).Value = Right("202403", 1)
End If
コードは長くなりますが、他の処理との兼ね合いで最適になるかもしれません。
月による出汁分けはよくある話です。
後者なら以下でしょうか。
Cell(1, 1).Value = Month("2024/3/1")
年月日の値を持ってこないといけないのですが。
こちらもやりようだと思います。
どのような処理が最適かは、他の処理との兼ね合いや取得できる元データやコーディングルールなどで変わってきます。
型を上手に使えばよい
VBAでは、変数型をあまり意識しませんよね。
Excelの思想そのものです。
明示すればそのとおりになりますが、なんとなく定義すれば、なんとなくで取り扱えてしまいます。
今回利用するのは、型を明示することで、型としての値になってもらうという考え方です。
なんとなく「001」とすれば、VBAではそのまま扱えてしまいます。変数を定義せずに使うとか、型を指定せずに変数を扱うとかいったことが可能な世界です。
そういった中で、厳密な定義も可能です。
整数型の変数に「001」を格納しようとすれば、値は「1」として格納されます。
このあたりを上手に活用したいものです。
ご意見やご感想などお聞かせください! コメント機能です。