【Excel VBA】ゼロ埋め表記文字から数字を抽出(001 → 1 とか)

Blog Admin
Blog Admin

久しぶりにVBAを書いていると、「Numberだっけ?」とか、よく分からない記憶の混濁が起こるわけです。

シート

Excel VBA
数値型に変換

VBAでの細かい処理ではあります。
単純な話ですし。

備忘録です。

数値型に変換する関数

以下のような処理を目指しておりました。
関数があることは分かっていたのです。

  1. 年月を表す YYYYMM の MM を抽出
  2. 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")

年月日の値を持ってこないといけないのですが。
こちらもやりようだと思います。

どのような処理が最適かは、他の処理との兼ね合い取得できる元データコーディングルールなどで変わってきます。

型を上手に使えばよい

Excel

VBAでは、変数型をあまり意識しませんよね。
Excelの思想そのものです。

明示すればそのとおりになりますが、なんとなく定義すれば、なんとなくで取り扱えてしまいます。

今回利用するのは、型を明示することで、型としての値になってもらうという考え方です。
なんとなく「001」とすれば、VBAではそのまま扱えてしまいます。変数を定義せずに使うとか、型を指定せずに変数を扱うとかいったことが可能な世界です。

そういった中で、厳密な定義も可能です。
整数型の変数に「001」を格納しようとすれば、値は「1」として格納されます。

このあたりを上手に活用したいものです。

この投稿を書いたのは・・・
Blog Admin

ガジェットが大好きで、ほぼ毎月何かしら調達しております。
無駄遣い扱いされたくないのと、何かの役に立つかと思い、記録を書くことにしたのでした。

お出かけのときには、スマホを複数台とタブレットとパソコンを持ち歩きます。
両手首にはスマートウォッチです。
こんなスタイルで生活している中での備忘録を書いています。

「Blog Admin」をフォローしてみる
Excel関連
「Blog Admin」をフォローしてみる

ご意見やご感想などお聞かせください! コメント機能です。

タイトルとURLをコピーしました