【2026年8月最新】VBA配列のUBound・LBound完全ガイド|要素数取得・列挙・エラー対処まで

【2026年8月最新】VBA配列のUBound・LBound完全ガイド|要素数取得・列挙・エラー対処まで

「配列に何個データが入っているか、コードの中でどう調べればいいんだろう」——Excel VBAでマクロを組んでいて、この壁にぶつかった経験がある方は多いはずです。

配列の要素数を扱う場面で必ず登場するのがUBound関数LBound関数です。名前だけ見ると難しそうですが、仕組みを理解すれば「配列の上限・下限のインデックスを返すだけ」のシンプルな関数です。ただし、多次元配列動的配列が絡んでくると、途端に理解が怪しくなる方が多いのも事実です。

代表菅澤 代表菅澤
VBAの配列処理は、最初のうちは「なんとなく動くけど理由が分からない」状態になりがちです。今日はUBound・LBoundの基本から、多次元配列、実務でよく使うエラー対処まで、順を追って整理していきます。
AI鬼管理山崎 AI鬼管理山崎
「配列の要素数を取得したいだけなのに、なぜUBoundとLBound両方使う場面があるのか」——ここが理解の分かれ目です。この記事を読めば、その理由もスッキリ腑に落ちるはずです。

この記事を最後まで読むと、次の7つが明確になります。

✔️UBound・LBound関数の役割と基本構文
✔️1次元配列・多次元配列それぞれでの正しい使い方
✔️配列の要素数を1行で正確に取得する計算式
✔️For文・For Eachで配列要素を安全に列挙する方法
✔️動的配列(ReDim)と組み合わせた実務でのパターン
✔️「Subscript out of range」など頻出エラーの原因と対処法
✔️VBAでの手作業を減らし、AIに任せるという新しい選択肢
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年8月最新】VBA配列のUBound・LBound完全ガイド|要素数取得・列挙・エラー対処まで
VBAのUBound・LBound関数の使い方を1次元・多次元配列の実例つきで解説。要素数の正しい取得方法、For文での列挙、動的配列との組み合わせ、よくあるエラー対処、AIで自動化する選択肢まで網羅します。

01 UBound・LBoundとは何か 配列の基本構造から関数の役割まで

UBound・LBoundを理解するには、まず配列(はいれつ)そのものの構造を押さえておく必要があります。

📚 用語解説

配列(はいれつ):複数のデータを1つの変数名でまとめて管理する仕組み。例えば「Data(0)、Data(1)、Data(2)」のように、同じ変数名に番号(インデックス)をつけて複数の値を格納できます。Excelのセル範囲をまとめて処理したいときによく使われます。

配列には、要素を指す番号としてインデックスが振られます。VBAの配列は初期設定では0から始まる(0-based)ため、「Data(0)」が1つ目の要素になります。ただし、Option Base 1を宣言したり、後述のTo構文で明示的に下限を指定すると、1から始まる配列も作れます。

1-1. UBound関数とは

UBound関数は、配列の最大インデックス(上限)を返す関数です。「Upper Bound(上限)」の略で、配列に何番目の要素まで入っているかを調べるときに使います。

基本構文は次のとおりです。

UBound(配列名, [次元])

第2引数の「次元」は、多次元配列を扱うときにだけ指定します。1次元配列であれば省略可能で、その場合は自動的に1次元目が対象になります。

1-2. LBound関数とは

LBound関数は、UBoundとちょうど逆で、配列の最小インデックス(下限)を返します。「Lower Bound(下限)」の略です。

📚 用語解説

UBound / LBound:UBoundは配列の最大インデックス(上限)、LBoundは最小インデックス(下限)を返す関数。多くのVBA配列は下限が0のため見落とされがちですが、Excelのセル範囲を配列に変換した場合など、下限が1や別の数値になるケースもあるため、両方セットで確認する習慣が重要です。

構文はUBoundと全く同じ形です。

LBound(配列名, [次元])
💡 なぜ両方覚える必要があるのか

「配列の下限は基本0だから、LBoundは不要では?」と思うかもしれません。しかし、Excelのセル範囲を配列に代入した場合(例: Range("A1:A10").Value を配列に格納)は下限が1になります。下限を決め打ちせず、常にLBoundで確認するクセをつけておくと、後々のバグを防げます。

AI鬼管理山崎 AI鬼管理山崎
実務でハマりやすいのは、他の人が書いたマクロを修正するときです。配列の下限が0か1かを確認せずにコードを書き足すと、思わぬところでズレが発生します。LBoundを使う習慣があれば、この手の事故は未然に防げます。

02 1次元配列でのUBound・LBoundの使い方 最も基本的なパターンをコード例で確認する

まずは最も基本的な、1次元配列でのUBound・LBoundの使い方を見ていきます。

2-1. 静的配列でのサンプルコード

Sub Sample1D()
    Dim Data(4) As String
    Data(0) = "田中"
    Data(1) = "佐藤"
    Data(2) = "鈴木"
    Data(3) = "高橋"
    Data(4) = "伊藤"

    Debug.Print "下限: " & LBound(Data)  '結果: 0
    Debug.Print "上限: " & UBound(Data)  '結果: 4
End Sub

Dim Data(4)と宣言すると、インデックス0〜4の合計5個の箱が用意されます。この場合、LBoundは0、UBoundは4を返します。「宣言時のカッコの数字=要素数」ではない点が、初学者がつまずきやすいポイントです。

⚠️ よくある勘違い

Dim Data(4)としたとき、多くの人が「要素数は4」と思い込みがちですが、実際は0番目から4番目までの5個です。UBoundの戻り値をそのまま要素数だと誤解すると、ループ処理や集計で1個ズレるバグの原因になります。

2-2. 下限を1から始める場合(To構文)

To構文を使うと、下限を任意の数値に指定できます。

Sub Sample1DFrom1()
    Dim Data(1 To 5) As String
    Data(1) = "田中"
    Data(2) = "佐藤"
    Data(3) = "鈴木"
    Data(4) = "高橋"
    Data(5) = "伊藤"

    Debug.Print "下限: " & LBound(Data)  '結果: 1
    Debug.Print "上限: " & UBound(Data)  '結果: 5
End Sub

「請求書の明細を1行目から数えたい」など、業務上1から数えたい場面では、この1 To 5のような書き方が重宝します。Excelの行番号감覚と一致させられるため、集計コードが直感的になります。

代表菅澤 代表菅澤
私が新人の頃、UBoundの戻り値をそのまま「要素数」として使ってしまい、集計が1件足りないバグを出したことがあります。UBound・LBoundは必ずセットで、要素数は引き算で出す——これを最初に覚えておくと、後々の事故を防げます。

03 多次元配列でのUBound・LBoundの使い方 第2引数「次元」の指定を正しく理解する

Excelの表(行×列)のようなデータを扱う場合、多次元配列を使います。多次元配列でのUBound・LBoundは、第2引数の「次元」指定がポイントになります。

📚 用語解説

多次元配列:複数の添字(インデックス)を持つ配列。例えば「Data(行, 列)」のように2つの添字を持つものを2次元配列と呼び、Excelの表形式データ(縦×横)をそのまま格納するのに向いています。3次元以上の配列も定義できますが、実務では2次元配列が最も多く使われます。

3-1. 2次元配列のサンプルコード

Sub Sample2D()
    Dim Data(2, 3) As String  '3行×4列

    Debug.Print "1次元目の下限: " & LBound(Data, 1)  '結果: 0
    Debug.Print "1次元目の上限: " & UBound(Data, 1)  '結果: 2
    Debug.Print "2次元目の下限: " & LBound(Data, 2)  '結果: 0
    Debug.Print "2次元目の上限: " & UBound(Data, 2)  '結果: 3
End Sub

第2引数に1を指定すると1次元目(多くの場合「行」に相当)、2を指定すると2次元目(「列」に相当)の上限・下限が返ります。次元の指定を省略すると自動的に1次元目が対象になるため、2次元目を調べたい場合は必ず引数を明記する必要があります。

3-2. 3次元配列のサンプルコード

Sub Sample3D()
    Dim Data(1, 2, 3) As Variant

    Debug.Print UBound(Data, 1)  '結果: 1
    Debug.Print UBound(Data, 2)  '結果: 2
    Debug.Print UBound(Data, 3)  '結果: 3
End Sub

3次元以上になると管理が複雑になるため、実務では「支店別×月別×商品別」のような3軸データを扱うケース以外では、あまり出番がありません。可読性を優先するなら、Collectionオブジェクトや辞書(Dictionary)への置き換えも検討する価値があります。

⚠️ 次元指定忘れの事故

多次元配列でUBoundの第2引数を書き忘れると、常に1次元目の値が返ってきます。2次元目のループ処理で「なぜか3行分しか処理されない」といったバグの多くは、この指定漏れが原因です。多次元配列を扱うコードでは、UBound・LBoundの引数を必ず目視確認する習慣をつけてください。

AI鬼管理山崎 AI鬼管理山崎
Excelのシートデータをそのまま2次元配列に取り込んで処理するケースは非常に多いです。「Range("A1:D100").Value」のように代入すると自動的に2次元配列になるので、UBoundの次元指定を意識する場面は思っている以上に頻繁に出てきます。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 配列の要素数を正しく取得する UBoundだけでは要素数にならない理由

ここが今回の記事で最も重要なポイントです。「配列の要素数」=「UBoundの戻り値」ではありません。正しい要素数の計算式は次のとおりです。

要素数の計算式

要素数 = UBound(配列) - LBound(配列) + 1
下限が0でも1でも、この式なら常に正確な要素数が求まります。

下限が0の配列であれば「UBound + 1」で足りると考えがちですが、この考え方は下限が1やそれ以外の値になったときに崩れます。常に「UBound - LBound + 1」の形で書いておけば、下限がいくつであっても正確な要素数を取得できます。

4-1. 要素数取得のサンプルコード

Sub CountElements()
    Dim Data(1 To 5) As String
    Dim cnt As Long

    cnt = UBound(Data) - LBound(Data) + 1
    Debug.Print "要素数: " & cnt  '結果: 5
End Sub

文字列を区切って配列化するSplit関数の結果に対しても、この計算式は同じように使えます。

Sub CountSplitElements()
    Dim arr() As String
    arr = Split("東京,大阪,名古屋,福岡", ",")

    Debug.Print "要素数: " & (UBound(arr) - LBound(arr) + 1)  '結果: 4
End Sub
✔️UBoundだけを要素数として使わない(下限が0以外だとズレる)
✔️要素数は必ず「UBound - LBound + 1」で計算する
✔️Split関数の戻り値にも同じ計算式が使える
✔️多次元配列は次元ごとに別々に要素数を計算する

要素数を正しく求めるまでの考え方を図解すると、以下のような流れになります。

Step 1
配列の下限を
LBoundで確認
Step 2
配列の上限を
UBoundで確認
Step 3
上限-下限+1で
要素数を計算
Step 4
ループ処理・
集計に利用
代表菅澤 代表菅澤
「UBoundを要素数だと思い込んで集計が1件ズレる」というバグは、VBA初心者が一度は通る道だと思います。この計算式さえ覚えておけば、下限が0だろうと1だろうと迷わず対応できます。

05 For文・For Eachで配列要素を列挙する 安全にループ処理を書くための書き方

配列の中身を1つずつ処理するには、For文またはFor Each文を使います。ここでもUBound・LBoundが活躍します。

5-1. For文での列挙(1次元配列)

Sub LoopFor1D()
    Dim Data(1 To 5) As String
    Data(1) = "田中": Data(2) = "佐藤": Data(3) = "鈴木"
    Data(4) = "高橋": Data(5) = "伊藤"

    Dim i As Long
    For i = LBound(Data) To UBound(Data)
        Debug.Print Data(i)
    Next i
End Sub

ここでのポイントは、For i = 1 To 5のように数値を決め打ちせず、For i = LBound(Data) To UBound(Data)と書く点です。この書き方なら、配列の宣言範囲が変わってもコードを一切修正せずに対応できます

💡 決め打ちループの危険性

「For i = 0 To 4」のように数値を直接書いたコードは、後から配列のサイズを変更したときにループ範囲がズレて、一部のデータが処理されなかったり、逆に存在しない要素にアクセスしてエラーになったりします。LBound・UBoundを使ったループは、この事故を根本から防ぐ書き方です。

5-2. For文での列挙(多次元配列)

Sub LoopFor2D()
    Dim Data(1 To 3, 1 To 2) As String
    Dim r As Long, c As Long

    For r = LBound(Data, 1) To UBound(Data, 1)
        For c = LBound(Data, 2) To UBound(Data, 2)
            Debug.Print "(" & r & "," & c & ") = " & Data(r, c)
        Next c
    Next r
End Sub

📚 用語解説

For Each文:配列やコレクションの各要素を、インデックス番号を意識せず順番に取り出せる構文。「For i = LBound To UBound」より書き方がシンプルになる一方、要素の現在位置(何番目か)を取得できないという制約があります。

5-3. For Each文での列挙

Sub LoopForEach()
    Dim Data(1 To 3) As String
    Data(1) = "東京": Data(2) = "大阪": Data(3) = "福岡"

    Dim v As Variant
    For Each v In Data
        Debug.Print v
    Next v
End Sub

For Eachは記述がシンプルな反面、「今何番目の要素を処理しているか」が分からないというデメリットがあります。インデックス番号を使った処理(例: 隣の要素と比較する)が必要な場合はFor文、単純に全件処理したいだけならFor Eachという使い分けが基本です。

この2つの列挙処理の流れをまとめると、以下のように整理できます。

配列を用意
静的 or 動的
用途を判断
番号が必要か
単純処理か
For文
番号操作が
必要な場合
For Each文
全件処理
のみの場合
AI鬼管理山崎 AI鬼管理山崎
実務では「特定の行だけ色を変える」「隣接するセルと比較する」といった処理が多いので、私はFor文を使う場面のほうが多い印象です。For Eachは、単純に集計するだけのシンプルな処理で重宝します。

06 動的配列(ReDim)と組み合わせた実務パターン 要素数が事前に分からないデータを扱う

実務では「何件データが来るか事前に分からない」というケースが多くあります。この場合に使うのが動的配列です。UBound・LBoundは、動的配列のサイズを確認する際にも欠かせません。

📚 用語解説

動的配列(ReDim):宣言時にサイズを確定させず、実行中にデータ量に応じてサイズを変更できる配列。Dim Data() As Stringのように空のカッコで宣言し、後からReDim Data(件数)でサイズを確定させます。件数が変動する請求書明細や顧客リストの処理でよく使われます。

6-1. ReDimで配列サイズを変更する

Sub DynamicArraySample()
    Dim Data() As String
    Dim lastRow As Long

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

    Dim i As Long
    For i = 1 To lastRow
        Data(i) = Cells(i, 1).Value
    Next i

    Debug.Print "取得件数: " & (UBound(Data) - LBound(Data) + 1)
End Sub

この例では、シートの最終行を取得してからReDimでその件数分の配列を確保しています。データ件数が毎回変わる帳票処理では、この「最終行取得 → ReDim → UBound/LBoundで検証」という流れが定番パターンです。

6-2. ReDim Preserveでデータを保持したまま拡張する

通常のReDimは配列の中身を初期化(消去)してしまいますが、ReDim Preserveを使うと既存データを保持したまま配列を拡張できます。

Sub RedimPreserveSample()
    Dim Data() As String
    Dim n As Long
    n = 0

    ReDim Data(1 To 1)
    Data(1) = "1件目"

    n = UBound(Data) + 1
    ReDim Preserve Data(1 To n)
    Data(n) = "2件目"

    Debug.Print "現在の要素数: " & (UBound(Data) - LBound(Data) + 1)
End Sub
⚠️ ReDim Preserveのパフォーマンス注意

ReDim Preserveはループの中で毎回呼び出すと、実行速度が大幅に低下します。件数が多い処理(数百〜数千件)では、あらかじめ最大件数分の配列を確保しておき、最後にUBound・LBoundで実際の使用範囲だけ切り出す方が高速です。

実務でよくある活用例を挙げると、次のようなケースでUBound・LBoundと動的配列の組み合わせが役立ちます。

✔️請求書データの集計:明細行数が毎回変わる請求書を、動的配列で読み込んで合計金額を計算する
✔️顧客リストのフィルタリング:条件に合致した顧客だけを別の配列に詰め直す
✔️複数シートのデータ統合:シートごとに異なる件数のデータを1つの配列にまとめる
✔️重複チェック:配列内を走査して同じ値がないか確認する
代表菅澤 代表菅澤
動的配列とUBound・LBoundの組み合わせは、Excel業務を自動化するVBAコードの中核と言っていいくらいよく使うパターンです。ここを押さえておけば、大抵の集計マクロは書けるようになります。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 よくあるエラーと対処法 「Subscript out of range」を中心に原因を整理する

UBound・LBoundを使ったコードで最もよく遭遇するのが、「実行時エラー9: Subscript out of range(インデックスが有効範囲にありません)」です。ここでは代表的な原因と対処法を整理します。

📚 用語解説

Subscript out of range(実行時エラー9):配列に存在しないインデックスにアクセスしようとしたときに発生するエラー。「配列の範囲外を指定した」ことを示すVBAの標準エラーメッセージで、UBound・LBoundを使ったコードで最も頻繁に遭遇するエラーの一つです。

7-1. 【原因1】未初期化の配列にUBoundを使う

動的配列を宣言しただけでReDimを実行する前にUBoundを呼び出すと、このエラーが発生します。

Sub ErrorSample1()
    Dim Data() As String
    Debug.Print UBound(Data)  '実行時エラー9が発生
End Sub

対処法としては、UBoundを呼び出す前に配列が初期化済みかどうかをOn ErrorIsArrayEmpty的な自作関数でチェックする方法が一般的です。

Function IsArrayInitialized(arr As Variant) As Boolean
    On Error Resume Next
    IsArrayInitialized = (UBound(arr) >= LBound(arr))
    On Error GoTo 0
End Function

7-2. 【原因2】多次元配列で次元指定を誤る

先述のとおり、2次元配列に対してUBound(Data, 3)のように存在しない次元を指定すると、このエラーが発生します。次元数を意識せずにコピー&ペーストしたコードでよく起きるミスです。

7-3. 【原因3】Erase後にUBoundを呼び出す

動的配列に対してEraseを実行すると、配列は完全に未初期化の状態に戻ります。その直後にUBoundを呼び出すと、原因1と同じエラーになります。

⚠️ Eraseの挙動の違いに注意

静的配列(Dim Data(4)のように固定サイズで宣言したもの)にEraseを実行した場合は、要素の中身だけがクリアされ、配列自体は初期化されたままなのでUBoundは正常に動作します。一方、動的配列(Dim Data())の場合はEraseで配列自体が未初期化状態に戻るため、UBoundを呼ぶとエラーになります。この違いを知らずにハマる方が非常に多いです。

✔️UBoundを呼ぶ前に、ReDimで配列が初期化済みか確認する
✔️多次元配列は次元数(第2引数)を毎回目視確認する
✔️動的配列にEraseを使った直後はUBoundを呼ばない
✔️エラーが不安な場合はOn Error Resume Nextで安全に判定関数を作る
AI鬼管理山崎 AI鬼管理山崎
Subscript out of rangeは、VBAを触っていれば誰もが一度は見るエラーメッセージです。原因のパターンさえ覚えてしまえば、エラーメッセージを見た瞬間に「あ、多分これだな」と当たりがつくようになります。

08 【独自】VBAで消耗する前に知っておきたいAI自動化という選択肢 そもそも配列処理を自分で書かない、という発想

ここまでUBound・LBoundの使い方を細かく解説してきましたが、実務の現場では正直なところ「毎回このレベルの配列処理を手で書くのが負担」という声もよく聞きます。特に、非エンジニアの管理職が本業の合間にVBAを覚えて保守していくのは、決して楽な道ではありません。

弊社(株式会社GENAI)では、Claude CodeというAIエージェントを使って、こうした「Excelの集計・データ整形マクロ」の多くを、VBAを1行も書かずに自動化しています。

📚 用語解説

Claude Code:AnthropicがreleaseするAIエージェント。チャットで「この請求書データを集計して」と話しかけるだけで、必要なコード(VBA・Python問わず)を自ら書き、実行し、結果を確認するところまで自律的に行います。プログラミング未経験でも、日本語の指示だけで業務自動化を進められるのが特徴です。

8-1. VBAを自分で書く場合とAIに任せる場合の違い

項目VBAを自分で書くClaude Codeに任せる
習得コストUBound・LBound・ReDim等の文法を理解する必要あり日本語で依頼するだけ、文法知識は不要
保守担当者が異動・退職すると誰も直せなくなりがちAIに再度依頼すれば都度メンテナンス可能
エラー対応Subscript out of range等を自力でデバッグエラー内容を伝えれば自動で修正案を提示
応用範囲Excel内で完結する処理が中心メール送信・他システム連携まで拡張しやすい

弊社の実運用データで見ると、Claude Max 20xプラン(月額約30,000円)を契約し、経理・営業・広告・秘書業務など社内のあらゆる業務にClaude Codeを活用しています。特に経理領域では、請求書チェックや経費仕訳といったExcelでの集計・突合作業が、月40時間程度から月5時間程度まで圧縮できている肌感です。

💡 VBAを学ぶこと自体は無駄にならない

ここまで解説してきたUBound・LBoundの考え方(配列の範囲を意識する、ループを安全に書く)は、AIにコードを書かせる際の指示出しにもそのまま活きます。「配列の要素数がずれていないか確認して」とAIに指示できるのは、この記事で学んだ知識があってこそです。VBAの基礎理解とAI活用は対立するものではなく、両輪だと捉えるのがおすすめです。

8-2. どちらを選ぶべきか の判断基準

「これから覚えるならVBAかAIか」と迷う方に向けて、シンプルな判断基準をお伝えします。

単発の集計
1回きりの処理
AIに依頼
その場で完結
定型・毎月の処理
繰り返し発生
AIにマクロ生成を
依頼して社内資産化

再利用可能な形で保存

単発の集計であればAIにその場で依頼して終わらせ、毎月繰り返す定型処理であれば、AIに生成させたマクロやスクリプトを社内の資産として残す——このハイブリッドな使い方が、非エンジニアの管理職にとって最も現実的な着地点だと考えています。

代表菅澤 代表菅澤
「VBAを覚える時間が惜しい」という方には、まずAIに丸ごと任せてみることをおすすめします。実際に動くものを見てから、必要な部分だけ自分でも理解を深めていく方が、挫折しにくいはずです。

09 まとめ UBound・LBoundを正しく使いこなすための要点整理

この記事では、VBA配列のUBound・LBound関数について、基本構文から多次元配列、要素数の正しい計算方法、For文・For Eachでの列挙、動的配列との組み合わせ、よくあるエラー対処、そしてAIによる自動化という選択肢までを解説しました。最後にポイントを振り返ります。

✔️UBoundは配列の上限、LBoundは配列の下限を返す関数
✔️要素数は「UBound - LBound + 1」で計算する(UBoundだけでは不正確)
✔️多次元配列では第2引数(次元)の指定を必ず確認する
✔️ループは「For i = LBound(Data) To UBound(Data)」と書けば安全
✔️動的配列(ReDim)は、事前に件数が分からないデータ処理で必須
✔️「Subscript out of range」の多くは未初期化配列へのアクセスが原因
✔️VBAの配列処理は、AIエージェントに任せて自動化する選択肢もある

UBound・LBoundは、一見地味な関数ですが、配列を安全に扱うための土台になる知識です。今回のポイントを押さえておけば、要素数のズレや実行時エラーに悩まされることは大きく減るはずです。

一方で、「そもそも配列処理を毎回自分で書きたくない」という方には、AIエージェントに任せるという選択肢も現実的になってきています。VBAの基礎知識を土台にしつつ、繰り返し作業はAIに寄せていく——そんな働き方の参考に、この記事がお役に立てば幸いです。

AI鬼管理山崎 AI鬼管理山崎
弊社では「AI鬼管理」というサービスで、ExcelマクロやVBAで消耗している業務をClaude Codeで自動化する設計から伴走まで支援しています。「このExcel集計、AIに任せたらどうなるんだろう」と思ったら、お気軽にご相談ください。

ExcelマクロやVBAの手作業を、AI鬼管理が一緒に自動化します

毎月の集計・請求書チェック・顧客リスト整理——UBound・LBoundを駆使したVBAコードで消耗する前に、AIに任せられる範囲を一緒に見極めませんか。
弊社の実運用ノウハウをもとに、個別に自動化のご相談を承ります。

代表菅澤 代表菅澤
VBAを1から覚えるより早く、今の業務を自動化できるケースは少なくありません。まずは無料相談で、あなたの業務のどこにAIが使えそうか一緒に洗い出しましょう。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI鬼管理 — Claude Code導入支援トレーニング

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

AIBPO by AI鬼管理 — 定型業務の丸ごと代行

業務を丸ごと任せたい方へ

AIBPO by AI鬼管理

請求処理・データ入力・問い合わせ対応などの定型業務を、AI×人の品質管理体制で丸ごと代行。いまのコストの50%目安で、日々は成果物を承認するだけ。

よくある質問

Q. UBoundとLBoundは、配列の要素数そのものを返してくれますか?

A. いいえ、返しません。UBoundは上限インデックス、LBoundは下限インデックスを返すだけです。要素数を知りたい場合は「UBound - LBound + 1」という計算が必要です。下限が0か1かによってズレが生じるため、この計算式を必ず使うようにしてください。

Q. 多次元配列でUBoundの第2引数を省略するとどうなりますか?

A. 第2引数を省略すると、自動的に1次元目(多くの場合は行方向)の上限が返されます。2次元目・3次元目の値を取得したい場合は、必ず「UBound(Data, 2)」のように明示的に次元番号を指定する必要があります。

Q. 未初期化の配列にUBoundを使うとどうなりますか?

A. 「実行時エラー9: Subscript out of range」が発生します。動的配列(Dim Data() As String のように宣言したもの)は、ReDimでサイズを確定させるまでUBoundを呼び出せません。呼び出す前に配列が初期化済みかを確認する処理を挟むのが安全です。

Q. ReDim PreserveとReDimの違いは何ですか?

A. 通常のReDimは配列を再宣言する際に既存データを消去しますが、ReDim Preserveを使うと既存データを保持したまま配列サイズを変更できます。ただし、多次元配列でReDim Preserveを使う場合、最後の次元しかサイズ変更できないという制約があります。

Q. For文とFor Each文、配列処理ではどちらを使うべきですか?

A. 要素の位置(インデックス)を使った処理(隣接要素との比較や特定行の書き換えなど)が必要な場合はFor文、単純に全要素を順番に処理するだけならFor Each文が適しています。For Eachはコードがシンプルになる一方、位置情報を取得できない点に注意してください。

Q. Excelのセル範囲を配列に代入すると、下限は0と1のどちらになりますか?

A. Range("A1:D10").Valueのようにセル範囲を配列に代入した場合、下限は1になります。通常のDim宣言による配列(下限0がデフォルト)と挙動が異なるため、この種の配列を扱う際は必ずLBoundで下限を確認してから処理することをおすすめします。

Q. VBAの配列処理をAIに任せることは実際に可能ですか?

A. 可能です。Claude CodeのようなAIエージェントに「このExcelデータを集計して」と日本語で依頼するだけで、必要なコードを自動生成・実行してくれます。弊社でも経理・営業領域のExcel集計作業の多くをこの方法で自動化しており、月40時間かかっていた作業を月5時間程度まで圧縮できている実感があります。

AIAI鬼管理

AI鬼管理/AIBPO by AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。

サービスを選択してください

会社名を入力してください
業種を選択してください
お名前を入力してください
※法人・事業用のメールアドレスでお願いします(Gmail等の個人用フリーメールは受付できません)
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年8月13日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。