【VBA中級編】配列の数はもう数えない!LBound&UBoundで「エラー知らず」の爆速自動化を実現する方法

【業務効率化】VBA
スポンサーリンク

  • 「またエラーだ…。データの行数が増えるたびに、プログラムの中の数字を書き換えるなんて面倒くさい!」
  • 「配列って便利だけど、中身が何個あるかいちいち数えるの、もう限界…。」

VBAを学び始めたばかりの頃、私も全く同じ壁にぶつかっていました。

配列(データをまとめて入れる箱)を使えば処理が早くなると聞いたのに、データの数が変わるたびにエラーが出て、結局手作業で直すハメに…。これじゃあ「自動化」とは呼べませんよね。

今日は、そんな「配列の数え間違い」を根本から解決する 、LBound(エル・バウンド)とUBound(ユー・バウンド)という強力な関数をご紹介します。

これをマスターすれば、データの数が10件でも1万件でも、コードを1行も変えずに対応できるようになります。

【業務効率化】VBAの記事を見る 

配列は「マンションの部屋」をイメージしてみよう

専門用語を使うと難しく聞こえますが、配列は「名前がついた1棟のマンション」だと思ってください。

  • 配列名:マンションの名前
  • インデックス:部屋番号
  • LBound:一番下の階の番号
  • UBound:一番上の階の番号

例えば、3階建てのマンション(部屋番号0, 1, 2)があるとします。
このとき、LBoundは「0」、UBoundは「2」を自動的に取得してくれます。「3階建てだから、ループは3回!」と私たちが数える必要はありません。

なぜこの2つを使うと良いコードになるのか?

ズバリ、「メンテナンスの手間がゼロになるから」です。

以前、私は同僚から引き継いだツールで苦労したことがあります。

そのツールはデータの個数を「10個」と決め打ちして作られていました。ある日、データが「100個」に増えた瞬間、ツールは「インデックスが有効範囲にありません」というエラーを吐いて止まってしまいました。

もし、事前にデータの増減を想定してUBoundを使ってくれていれば、データが100個に増えてもエラーは起きませんでした。エラー原因の特定やコードを修正する手間と時間も積み重なれば年間で何時間ものロスになります。

でも配列に関してはLBoundとUBoundを活用するだけで、この修正時間をゼロにできるのです。

【実践】コピペで使える!基本のコード

まずは、1次元配列(一列の並び)での使い方を見てみましょう。

Sub ArraySample()
    ' フルーツの名前を入れる配列を準備
    Dim fruits As Variant
    fruits = Array("りんご", "バナナ", "みかん", "いちご", "メロン")

    Dim i As Long
   
    ' LBoundで最小(開始)の番号、UBoundで最大(終了)の番号を自動取得
    For i = LBound(fruits) To UBound(fruits)
        ' イミディエイトウィンドウに結果を表示
        Debug.Print "部屋番号 " & i & " の中身は " & fruits(i) & " です。"
    Next i
   
End Sub

応用編:Excelで「2次元配列」の場合

Excelのセル範囲を配列に取り込むと、2次元配列(縦と横の表形式)になります。

この場合は、「1番目の次元(行)」と「2番目の次元(列)」を指定してあげましょう。

Sub GetDynamicTableSize()
    ' --- 変数定義 ---
    Dim dataRange As Variant
    Dim rowMax As Long
    Dim colMax As Long
    
    ' --- データの読み込み ---
    ' A1セルを含む「ひとかたまりの範囲(CurrentRegion)」を配列に格納
    dataRange = Range("A1").CurrentRegion.Value
    
    ' --- 二次元配列のサイズを取得 ---
    ' UBoundの第2引数で、1:行方向、2:列方向の最大インデックスを取得
    On Error Resume Next ' 範囲が空の場合の対策
    rowMax = UBound(dataRange, 1)
    colMax = UBound(dataRange, 2)
    On Error GoTo 0
    
    ' --- 結果の表示 ---
    If rowMax > 0 Then
        MsgBox "データの読み込みが完了しました。" & vbCrLf & _
               "現在の表は " & rowMax & " 行、" & colMax & " 列です。", vbInformation, "完了通知"
    Else
        MsgBox "対象の範囲にデータが見つかりませんでした。", vbExclamation, "エラー"
    End If
End Sub

まとめ:機械に任せられることは機械に任せよう

プログラミングの格言に重複を避ける「Don’t Repeat Yourself」というものがあります。これは「人間が同じ作業を繰り返すべきではない」という意味でもあると私は思います。

LBoundとUBoundを使うのは、最初は少し手間に感じるかもしれません。

でも、これを取り入れるだけで「この人のコードは、どんなデータが来ても壊れない安心感がある」と、周囲からの信頼も高まるはずです。

一歩ずつ、確実に。一緒にエラーのないスマートな自動化を目指していきましょう!

【業務効率化】VBAの記事を見る 


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

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