Excel VBA

【マネするだけ】エクセルVBAでゼロ埋めをする方法を紹介

エクセルで作業をしていると、ゼロが消えてしまうことがあります。

例えば「0001」と入力してEnterキーを押すと「1」になってしまうようなことです。

エクセルが気を利かせてやってくれるのですが、IDや管理コードなど「0」が消えないでほしい場面があります。

手入力でも修正できるのですが、データ量が膨大で頻繁に処理しないといけない時は少し面倒です。

今回は、エクセルVBAでゼロ埋めをする方法を紹介します。

ゼロ埋めプログラムのコードはこちら

ゼロ埋めのコードを紹介します。

こちらがコードです。

Sub ゼロ埋め()
  Dim lastRow As Long, i As Long
  With Sheet1
    lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRow
      If Len(.Cells(i, 1)) < 4 Then
        .Cells(i, 1) = "'" & Format(.Cells(i, 1), "0000")
      Else
        .Cells(i, 1) = "'" & .Cells(i, 1)
      End If
    Next i
  End With
End Sub


プログラムの実行前後のイメージです。
ゼロ埋めができているのが分かると思います。

ゼロ埋めができた


このプログラムでやっていること

このプログラムはこのような処理の流れです。

  1. データ数を確認(最終行チェック)
  2. 2行目から最終行まで処理を繰り返す(For文)
  3. セルの値の文字数が4文字より少ないか確認
  4. 4文字より少なければ、0を補充(ゼロ埋め)
  5. それ以外(4文字以上)なら、0を補充しない



注意

このプログラムの前提をメモしておきます。

  • 作業シートは、Sheet1
  • A列の2行目から処理を行っている
  • シングルクオーテーション【’】を数字の先頭に付けることで文字列に変換している。

もし、このプログラムを使いたい場合は、【シート】【列】の場所を変更する必要があります。
※そのまま使うとA列しか処理できませんので・・


コードを解説

プログラムのコードを紹介した後は、コードを細かく解説したいと思います。

まずは一行目のコードから

Dim lastRow As Long, i As Long

ここで行っていることは「変数の宣言」です。

エクセルVBAをやったことがない方に簡単に紹介すると、変数はデータを入れる箱という表現をすることが多いです。
この場合は「lastRow」という名前の箱と「i」という名前の箱の計2つを作ったとイメージするといいのかなと思います。

当然ですが、変数(箱)を作っただけなので中には何も入っていません。
(細かいですが、Longというのは変数【箱】に入れるデータの種類をしているしています。この場合は数字を入れるようにしています)



続いてこちらのコードです。

lastRow = .Cells(Rows.Count, 1).End(xlUp).Row

このコードはデータの入っている最終行の数値を取得するためのコードです。
最終行を取得する理由は「処理をする回数が変動する時に、プログラムに判定してもらう」ためです。

先ほどのデータの場合は13行目までのデータですが、実務では、毎回データ数が異なります。

このコードを書くと、変化に強いコードになります。
詳しくはこちらの記事で紹介しています。

こちらもCHECK

タイトル画像
Excel VBAで最終行を取得する方法【繰り返し処理で必須】

Excel VBAでプログラムを作っていると、よく使うのが「最終行の取得」です。 目次1 最終行の取得方法はこれ1.1 コードの説明2 最終行取得が活躍するのはFor文2.1 For文と相性がいい理由 ...

続きを見る

取得した最終行の行番号(今回のコードの場合は13という数字)がlastRowという変数の中に入ります。


次はやや複雑です。

For i = 2 To lastRow
      If Len(.Cells(i, 1)) < 4 Then
        .Cells(i, 1) = "'" & Format(.Cells(i, 1), "0000")
      Else
        .Cells(i, 1) = "'" & .Cells(i, 1)
      End If
    Next i

繰り返し処理のFor文、条件分岐のIf文が入っています。

For分は同じ処理を指定した回数だけ繰り返すために使うコードです。
(Forで始まり、Nextで終わるものです)

For i = 2 to lastRowという部分で2つの変数が出てきます。
(lastRowは13という数字が入っている状態です)

そのため、iという変数に2~13が順番に入るという意味になります。
(For文でいうと、iの中の数字が2で始まり、一回処理をするごとに1を加えていく。そして、13になった時の処理が終わったらFor文から出るという意味になります)

次はFor文の中の処理について紹介します。
For文の中の処理は、Sheet1のA列の2行目から13行目までのデータを順番に見て行きます。
まずは、データの長さを確認します。
セルの中の値が4文字未満の場合(0001にしたかったけど、1になってしまった場合など)は、0を補う処理しています。
そしてここが肝、0を補う処理の前にシングルクオーテーションを書いています。
これをやることで、数字を文字列として認識してくれます。(結果、0が補充された状態で保存されます)

もし、セルの値が4文字以上の場合は、シングルクォーテーションを先頭に付けるだけの処理をしています。


Format(セル, "0000")だけではいけない理由

今回紹介したコードはFormatだけでなく先頭にシングルクオーテーションを書いています。

では、【’】(シングルクオーテーション)を書かないとどうなるのか簡単に紹介したいと思います。

プログラム上は、Format(セル,"0000")だけでも、ゼロを埋めることができます。
ですが、問題が一つ。

エクセルの仕様で、0001と入力すると1になってしまうことは、手入力でも経験したことがある方が多いと思います。
シングルクオーテーションを使わないと、プログラムで0001と入力した状態になってしまいます。
結果、エクセルの機能により【0001】と入力しても【1】になってしまいます。

これではやりたいことが実現できません。

対策としては、セルの書式設定で、文字列に変更することもできます。
ですが、毎回セルの書式設定をするのは効率的ではありません。

さらにデータを貼り付ける時にそのまま貼り付け(値貼り付けではなく、セル情報も含めたすべての情報を貼り付け)してしまうと、セルの書式設定が変わってしまいます。

何をしても、0001のようにゼロ埋めするには、シングルクォーテーションが一番効率的だと思います。


どうしてもTEXT関数を使いたいならこのコード

【’】(シングルクォーテーション)を使わないでゼロ埋めをしたい方もいらっしゃると思います。
(例えば、TEXT関数で入力しないといけないなど)

その場合は、このコードでもいいかもしれません。
コードはこちらです。

Sub ゼロ埋めTEXT関数を使用する場合()
'変数の宣言
  Dim lastRow As Long, i As Long, cellName As String
'最終行を取得
  With Sheet1
    lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRow
      cellName = .Range(.Cells(i, 1).Address)
      .Cells(i, 1) = "=TEXT(" & cellName & "," & .Range("H1").Value & ")"
    Next i
  End With
End Sub

このコードのポイント

このコードでは、TEXT関数の結果ではなく「TEXT関数の式をそのままセルに入力」しているのが特徴です。

そのため、セルの値をみると「=TEXT(セル,”0000”)」が入力されています。

今まで手入力でTEXT関数を入力していて「今後もTEXT関数の入力内容を維持したい」という人にオススメです。
(かなり少数派な気がします・・)

コードの8行目の【cellName = .Range(.Cells(i, 1).Address)】は、TEXT関数を入力するために必要なセル番地を取得するコードです。
(やっていることは、Cells→Rangeに変換しているだけですが、TEXT関数のセル番地の指定の際に使います)

もう一つはTEXT関数の表示形式【”0000”】を入力する点です。


”0000”とVBAコードの中に入力すると「文字列として0000と入力する意味」になってしまします。
対策としては、別のセルに直接「”0000”」と入力し、コード上で値を参照する方法があります。


手入力編でゼロ埋めはできるけど・・めんどう

手入力でゼロ埋めをする方法を紹介します。

エクセルVBAを使わなくてもゼロ埋めができるので「一回だけ行う場合」におススメです。

ですが、毎回行う場合にはプログラムの方が良いかもしれません。

Text関数

Text関数を使うという方法があります。

エクセル関数でゼロ埋めができる


Text関数

=TEXT(セル,"0000")

と指定するだけで、ゼロ埋めができます。


セルの書式設定

セルの書式設定でもゼロ埋めができます。

セルの書式設定

ゼロ埋めができる


エクセルVBAおもしろいと思った時は学び時かも

今回のコードをみて「エクセルVBAっていろんなことができるんだな~」「おもしろい」と感じてもらえればうれしいです。

最近はオンラインレッスンも安くなている(本一冊くらいの値段でレッスン動画が売っている)ので学びやすいと思います。

こちらの記事で紹介しています。

こちらもCHECK

Excel vbaを学びたいなら。レッスンサイトを紹介

「AIが仕事を奪う」などのニュースを聞くようになりました。単純作業はプログラムが得意とする分野なので、事務作業もAIが行う時代も遠くないかもしれません。 普段事務作業をしている方からすると「めんどうな ...

続きを見る


あとがき

今回は、エクセルVBAでゼロ埋めをするプログラムを紹介しました。

この方法だと、完全自動に処理ができるので便利です。
(If文を使っているので、おかしな処理になることがありません)

ゼロ埋めをするだけのために使ってもいいですし、プログラムの中に組み込んでも良いと思います。

先ほどのコードのシート名とセル座標を変更すると応用できると思います。

-Excel VBA
-, , , ,