VBAで自動化 VBA一覧 セル・値の取得と貼り付け 値渡し・参照

【VBA】セルの値を変数に格納する方法|ループ処理で実務データを扱う基本

Excel VBAで業務を自動化するとき、セルの値をそのまま処理するだけでなく、一度変数に格納してから使う場面は非常に多くあります。

例えば、商品コード、氏名、金額、日付、在庫数などをセルから取得し、条件判定や転記、集計、メッセージ表示などに使う場合です。

セルの値を直接何度も参照することもできますが、実務では変数に格納した方が、処理の意味が分かりやすくなり、後から修正しやすいコードになります。

特にループ処理では、1行ずつセルの値を取得し、変数に格納しながら処理する書き方が基本になります。

この記事では、VBAでセルの値を変数に格納する基本から、ループ処理で複数行のデータを扱う方法、実務で壊れにくいコード設計までを解説します。

目次

✅ VBAでセルの値を変数に格納する基本

VBAでセルの値を変数に格納する処理は、非常に基本的な内容です。
しかし、ここを曖昧にしたままコードを書き始めると、後から処理の意味が分かりにくくなります。
特に実務では、「どのセルの値を何として扱っているのか」が分からないコードは、修正や引き継ぎで大きな負担になります。
また、セルを直接何度も参照すると、処理が長くなったときに可読性が下がります。
変数に一度格納しておけば、値の意味を名前で表現できるため、コード全体の見通しが良くなります。
まずは、セルの値を変数に入れる基本形を確認しておきましょう。

・セル1つの値を変数に格納する基本コード

Sub StoreSingleCellValue()

    Dim customerName As String

    'A2セルの値を顧客名として変数に格納する
    customerName = Worksheets("Sheet1").Range("A2").Value

    MsgBox customerName

End Sub

このコードでは、Sheet1のA2セルの値を customerName という変数に格納しています。

Range("A2").Value を直接 MsgBox に書くこともできますが、変数に入れることで「この値は顧客名として使う」という意味が明確になります。

・変数に格納することで処理の意味が見えやすくなる

例えば、次のような書き方も動きます。

MsgBox Worksheets("Sheet1").Range("A2").Value

しかし、この書き方だけでは、そのセルの値が何を表しているのか分かりません。

一方で、次のように変数へ格納すると、コードを読む人に意図が伝わりやすくなります。

customerName = Worksheets("Sheet1").Range("A2").Value
MsgBox customerName

実務では、数か月後の自分や別の担当者がコードを見る可能性があります。
そのため、少しコードが長くなっても、値の意味が分かる変数名を使うことが重要です。


✅ VBAでセルの値を格納するときの変数型の考え方

セルの値を変数に格納するとき、意外と重要なのが変数の型です。
文字列なのか、数値なのか、日付なのかによって、適切な型は変わります。
ここを適当に決めてしまうと、実務データに空白や想定外の文字が入ったときにエラーになることがあります。
特にExcelのセルには、見た目は数値でも実際には文字列として入っているケースがあります。
また、日付も表示形式によって見え方が変わるため、扱いを誤ると判定ミスにつながります。
変数型は、処理の安定性と保守性に直結するため、最初にしっかり考えておきましょう。

・よく使う変数型の例

Dim customerName As String
Dim salesAmount As Double
Dim orderDate As Date
Dim stockQuantity As Long
Dim cellValue As Variant

実務では、次のように考えると分かりやすいです。

  • 名前やコード:String
  • 件数や行番号:Long
  • 金額や小数を含む数値:Double
  • 日付:Date
  • 空白やエラー値の可能性があるセル:Variant

・セルの値を扱うときにVariantが便利な場面

セルには、空白、文字列、数値、日付、エラー値など、さまざまな値が入る可能性があります。

そのため、最初にセルの値を受け取る段階では Variant を使うと安全な場合があります。

Sub StoreCellValueAsVariant()

    Dim cellValue As Variant

    cellValue = Worksheets("Sheet1").Range("A2").Value

    Debug.Print cellValue

End Sub

ただし、すべてを Variant にすればよいわけではありません。
例えば、在庫数として計算に使う値であれば、数値かどうかを確認したうえで Long に変換する方が安全です。


✅ VBAでループ処理を使ってセルの値を変数に格納する方法

実務では、1つのセルだけでなく、一覧表の複数行を順番に処理することが多くあります。
このとき、各行の値を変数に格納しながら処理すると、コードの意味が非常に分かりやすくなります。
ただし、ループ内で変数を使う場合は、「今どの行の値を扱っているのか」を意識することが重要です。
変数名が曖昧だったり、セル参照を直接何度も書いたりすると、処理が複雑になったときに読みづらくなります。
ループ処理では、行番号、取得する値、処理対象シートを明確に分けて書くことが大切です。
ここでは、一覧表を1行ずつ処理する基本形を確認していきます。

・A列の値を1行ずつ変数に格納する基本コード

Sub StoreValuesInLoop()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim lastDataRow As Long
    Dim customerName As String

    '処理対象のシートを明示する
    Set targetWorksheet = Worksheets("Sheet1")

    'A列を基準に最終行を取得する
    lastDataRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

    '2行目から最終行まで、セルの値を変数に格納する
    For currentRow = 2 To lastDataRow

        customerName = targetWorksheet.Cells(currentRow, "A").Value

        Debug.Print customerName

    Next currentRow

End Sub

このコードでは、A列の値を1行ずつ customerName に格納しています。

・この書き方が実務で扱いやすい理由

このコードでは、次の役割を変数で分けています。

  • targetWorksheet:処理対象のシート
  • currentRow:現在処理中の行
  • lastDataRow:データの最終行
  • customerName:セルから取得した値

このように役割を分けておくと、後から処理を追加するときに迷いにくくなります。

例えば、顧客名が空白ならスキップする、別シートへ転記する、条件に応じてメッセージを出す、といった処理を追加しやすくなります。

ループ処理で1行ずつ値を変数に格納する方法は、VBAの基本として非常に重要です。
次のステップとしては、複数のセルの値をまとめて「配列」として取得することで、処理速度を大きく改善できる場面も増えてきます。
【VBA】セルの値を変数配列に取得:ループ処理を実務で使いこなす方法の記事では、セルの値を変数配列に取得する方法を、実務での活用例とあわせて詳しく解説しています。


✅ VBAで複数のセルの値を複数の変数に格納する方法

実務の表では、1列だけを処理することは少なく、複数列の値をまとめて扱うことが多くあります。
例えば、商品コード、商品名、在庫数、単価などを同じ行から取得し、それぞれの意味に合わせて変数へ格納します。
このとき、変数名を適当に付けてしまうと、どの値を扱っているのか分からなくなります。
また、列番号を直接何度も書くと、列構成が変わったときに修正漏れが起きやすくなります。
複数のセル値を扱う場合は、変数名と列指定の整理がとても重要です。
ここでは、商品管理表を例に、複数列の値を変数に格納する方法を解説します。

・商品管理表の値を変数に格納するコード

Sub StoreMultipleCellValues()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim lastDataRow As Long

    Dim productCode As String
    Dim productName As String
    Dim stockQuantity As Long
    Dim unitPrice As Double

    Set targetWorksheet = Worksheets("Sheet1")

    lastDataRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

    For currentRow = 2 To lastDataRow

        productCode = targetWorksheet.Cells(currentRow, "A").Value
        productName = targetWorksheet.Cells(currentRow, "B").Value
        stockQuantity = targetWorksheet.Cells(currentRow, "C").Value
        unitPrice = targetWorksheet.Cells(currentRow, "D").Value

        Debug.Print productCode & " / " & productName & " / " & stockQuantity & " / " & unitPrice

    Next currentRow

End Sub

・意味の分かる変数名を使うメリット

このコードでは、value1data1 のような変数名は使っていません。

理由は、実務では「何の値なのか」が非常に重要だからです。

例えば、次のような変数名では、後から見たときに意味が分かりません。

Dim a As String
Dim b As String
Dim c As Long

一方で、次のように書けば、値の意味がすぐに分かります。

Dim productCode As String
Dim productName As String
Dim stockQuantity As Long

VBAではコードの短さよりも、修正しやすさと読みやすさを優先した方が、実務では失敗しにくくなります。


✅ VBAでセルの値を変数に格納するときの空白・異常値対策

セルの値を変数に格納するとき、実務で最も注意すべきなのが空白や異常値です。
表の中には、未入力セル、入力途中の行、文字として入力された数値、数式エラーなどが混ざることがあります。
これらを想定せずに数値型や日付型へ直接格納すると、型不一致エラーが発生することがあります。
特に複数人で更新するファイルでは、データが常にきれいとは限りません。
そのため、変数に格納する前に「本当にその型として扱えるか」を確認する設計が重要です。
ここでは、実務で使いやすい安全な格納方法を紹介します。

・数値かどうかを確認してから変数に格納するコード

Sub StoreNumericValueSafely()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim lastDataRow As Long
    Dim stockCellValue As Variant
    Dim stockQuantity As Long

    Set targetWorksheet = Worksheets("Sheet1")

    lastDataRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

    For currentRow = 2 To lastDataRow

        stockCellValue = targetWorksheet.Cells(currentRow, "C").Value

        '数値として扱える場合のみLong型に変換する
        If IsNumeric(stockCellValue) Then
            stockQuantity = CLng(stockCellValue)
        Else
            stockQuantity = 0
        End If

        Debug.Print stockQuantity

    Next currentRow

End Sub

・なぜ一度Variantで受け取るのか

このコードでは、いきなり stockQuantity にセルの値を入れていません。

まず stockCellValue という Variant 型の変数で受け取り、その後で数値かどうかを確認しています。

これは、セルに空白や文字列が入っていた場合でも、マクロが止まりにくくするためです。

実務では、データの入力ミスが完全になくなることはありません。
そのため、「正しい値だけが入っている前提」ではなく、「想定外の値が入る可能性がある前提」でコードを書くことが大切です。

空白や異常値を検知できても、そのままでは見落とされてしまうことがあります。
実務では、問題のあるデータを「すぐに気づける状態」にしておくことが重要です。
【Excel】エラーや異常値を色で目立たせる実務テクニックの記事では、エラーや異常値を色で目立たせる方法を、条件付き書式を使った実務向けの手順として詳しく解説しています。


✅ VBAで変数に格納した値を条件判定に使う方法

セルの値を変数に格納する目的は、値を表示することだけではありません。
実務では、変数に格納した値を使って条件判定を行うことが非常に多くあります。
例えば、在庫数が一定以下なら発注対象にする、売上金額が基準以上ならランクを付ける、ステータスが未対応なら処理対象にする、といった使い方です。
このとき、セルを直接参照するよりも、変数に格納してから判定した方が、処理の意味が明確になります。
また、同じ値を複数回使う場合にも、変数を使うことでコードが読みやすくなります。
ここでは、在庫数を変数に格納して判定する例を紹介します。

・在庫数を変数に格納して発注対象を判定するコード

Sub CheckStockByStoredVariable()

    Const REORDER_THRESHOLD As Long = 10

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim lastDataRow As Long

    Dim productCode As String
    Dim productName As String
    Dim stockCellValue As Variant
    Dim stockQuantity As Long

    Set targetWorksheet = Worksheets("Sheet1")

    lastDataRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

    For currentRow = 2 To lastDataRow

        productCode = Trim(targetWorksheet.Cells(currentRow, "A").Value)
        productName = Trim(targetWorksheet.Cells(currentRow, "B").Value)
        stockCellValue = targetWorksheet.Cells(currentRow, "C").Value

        If IsNumeric(stockCellValue) Then
            stockQuantity = CLng(stockCellValue)
        Else
            stockQuantity = 0
        End If

        '在庫数が基準以下なら発注対象として出力する
        If productCode <> "" And stockQuantity <= REORDER_THRESHOLD Then
            Debug.Print productCode & " / " & productName & " / 発注対象"
        End If

    Next currentRow

End Sub

・定数を使って条件を分かりやすくしている理由

このコードでは、発注基準を REORDER_THRESHOLD という定数にしています。

次のように直接数値を書くこともできます。

If stockQuantity <= 10 Then

しかし、この書き方だと「10」が何を意味しているのか分かりにくくなります。

一方で、REORDER_THRESHOLD として定義しておけば、コードを見たときに「発注判断の基準値」だと分かります。

また、将来的に基準値が10から5に変わった場合でも、定数の値だけを変更すれば済みます。

このように、実務では数値そのものよりも、その数値が何を意味しているかをコードで表現することが重要です。

変数に格納した値を使った条件判定は、VBAで業務処理を自動化するうえで非常に重要な基本になります。
実務では、1つの条件だけでなく、複数の条件を組み合わせて判定する場面も多くあります。
【VBA】比較演算子を用いた複数条件の使用方法|実務で迷わない条件分岐の設計の記事では、比較演算子を用いた複数条件の指定方法を、実務で迷わない条件分岐の設計とあわせて詳しく解説しています。


 

✅ VBAで変数に格納した値を別シートへ貼り付ける考え方

セルの値を変数に格納した後、別シートへ貼り付ける処理は実務で非常によく使われます。
例えば、元データから必要な項目だけを抜き出して一覧を作る、条件に合うデータだけを別シートに出力する、といった処理です。
このとき、セルからセルへ直接コピーする方法もありますが、変数を経由することで、処理内容を整理しやすくなります。
また、値を加工してから貼り付ける場合にも、変数を使った方が柔軟に対応できます。
ただし、貼り付け先の行番号を適切に管理しないと、上書きや空行の原因になります。
ここでは、変数に格納した値を別シートへ出力する基本例を紹介します。

・条件に合うデータだけを別シートへ出力するコード

Sub OutputStoredValuesToAnotherSheet()

    Const REORDER_THRESHOLD As Long = 10

    Dim sourceWorksheet As Worksheet
    Dim outputWorksheet As Worksheet

    Dim lastDataRow As Long
    Dim currentRow As Long
    Dim outputRow As Long

    Dim productCode As String
    Dim productName As String
    Dim stockCellValue As Variant
    Dim stockQuantity As Long

    Set sourceWorksheet = Worksheets("Sheet1")
    Set outputWorksheet = Worksheets("発注対象")

    lastDataRow = sourceWorksheet.Cells(sourceWorksheet.Rows.Count, "A").End(xlUp).Row
    outputRow = 2

    For currentRow = 2 To lastDataRow

        productCode = Trim(sourceWorksheet.Cells(currentRow, "A").Value)
        productName = Trim(sourceWorksheet.Cells(currentRow, "B").Value)
        stockCellValue = sourceWorksheet.Cells(currentRow, "C").Value

        If IsNumeric(stockCellValue) Then
            stockQuantity = CLng(stockCellValue)
        Else
            stockQuantity = 0
        End If

        If productCode <> "" And stockQuantity <= REORDER_THRESHOLD Then

            outputWorksheet.Cells(outputRow, "A").Value = productCode
            outputWorksheet.Cells(outputRow, "B").Value = productName
            outputWorksheet.Cells(outputRow, "C").Value = stockQuantity

            outputRow = outputRow + 1

        End If

    Next currentRow

    MsgBox "発注対象データの出力が完了しました。"

End Sub

・貼り付け先の行を別変数で管理する理由

このコードでは、元データの行番号 currentRow と、貼り付け先の行番号 outputRow を分けています。

これは非常に重要です。

元データでは10行目、20行目、35行目だけが条件に一致するかもしれません。
その場合、貼り付け先でも10行目、20行目、35行目に出力してしまうと、間に空白行ができてしまいます。

そこで、貼り付け先は outputRow で管理し、出力するたびに1行ずつ増やしています。

このように、元データの行番号と出力先の行番号を分けることで、きれいな一覧表を作成できます。


✅ VBAでセルの値を変数に格納するときに直接参照より安全な理由

VBAでは、セルの値を直接参照して処理を書くこともできます。
しかし、実務では変数に格納してから処理した方が安全で分かりやすい場面が多くあります。
特に、同じセルの値を複数回使う場合や、条件判定・加工・出力を組み合わせる場合には、変数の方が処理の流れを追いやすくなります。
また、セル参照がコード内に何度も出てくると、列が変わったときの修正漏れが起きやすくなります。
変数を使うことで、値の意味をコード上で表現でき、保守性も高まります。
ここでは、直接参照と変数利用の違いを整理します。

・セルを直接参照する書き方

If Worksheets("Sheet1").Cells(2, "C").Value <= 10 Then
    MsgBox "発注対象です。"
End If

この書き方でも動きます。

ただし、処理が増えてくると、どの値を判定しているのか分かりにくくなります。

・変数に格納してから判定する書き方

Dim stockQuantity As Long

stockQuantity = Worksheets("Sheet1").Cells(2, "C").Value

If stockQuantity <= 10 Then
    MsgBox "発注対象です。"
End If

こちらの方が、「在庫数を判定している」という意図が分かりやすくなります。

・実務では変数経由の方が変更に強い

セル参照を直接何度も書いていると、列がC列からD列に変わったときに、すべての参照箇所を修正する必要があります。

一方で、変数に格納する箇所を整理しておけば、修正箇所を限定できます。

特に、処理が長くなるほど、この差は大きくなります。


✅ VBAでセルの値を変数に格納する完成形コード

ここまでの内容を踏まえると、実務では「対象シートを明示する」「最終行を取得する」「セル値を意味のある変数に格納する」「空白や異常値を確認する」「条件に応じて処理する」という流れが重要になります。
単にセルの値を読み取るだけなら短いコードでも書けますが、実務で長く使うマクロでは、後から修正しやすい構成にしておくことが大切です。
特に、列や開始行、判定基準をコード内に直接散らばらせると、仕様変更時に修正漏れが発生しやすくなります。
完成形では、変更されやすい値を定数としてまとめ、処理対象を明確にしています。
これにより、読みやすさと保守性を両立できます。
ここでは、商品管理表を想定した実務向けの完成形コードを紹介します。

・実務で使いやすい変数格納とループ処理のコード

Option Explicit

Sub StoreCellValuesWithLoop()

    Const START_ROW As Long = 2
    Const PRODUCT_CODE_COLUMN As String = "A"
    Const PRODUCT_NAME_COLUMN As String = "B"
    Const STOCK_QUANTITY_COLUMN As String = "C"
    Const REORDER_THRESHOLD As Long = 10

    Dim sourceWorksheet As Worksheet
    Dim lastDataRow As Long
    Dim currentRow As Long

    Dim productCode As String
    Dim productName As String
    Dim stockCellValue As Variant
    Dim stockQuantity As Long

    '処理対象のシートを明示する
    Set sourceWorksheet = Worksheets("Sheet1")

    '商品コード列を基準に最終行を取得する
    lastDataRow = sourceWorksheet.Cells(sourceWorksheet.Rows.Count, PRODUCT_CODE_COLUMN).End(xlUp).Row

    'データ行が存在しない場合は処理を終了する
    If lastDataRow < START_ROW Then
        MsgBox "処理対象のデータがありません。"
        Exit Sub
    End If

    '各行のセル値を変数に格納しながら処理する
    For currentRow = START_ROW To lastDataRow

        productCode = Trim(sourceWorksheet.Cells(currentRow, PRODUCT_CODE_COLUMN).Value)
        productName = Trim(sourceWorksheet.Cells(currentRow, PRODUCT_NAME_COLUMN).Value)
        stockCellValue = sourceWorksheet.Cells(currentRow, STOCK_QUANTITY_COLUMN).Value

        '商品コードが空白の行は処理しない
        If productCode <> "" Then

            '在庫数として扱える値だけをLong型に変換する
            If IsNumeric(stockCellValue) Then
                stockQuantity = CLng(stockCellValue)
            Else
                stockQuantity = 0
            End If

            '在庫数が基準以下の場合だけ確認用に出力する
            If stockQuantity <= REORDER_THRESHOLD Then
                Debug.Print productCode & " / " & productName & " / 在庫数:" & stockQuantity
            End If

        End If

    Next currentRow

    MsgBox "セルの値を変数に格納して処理しました。"

End Sub

・この完成形コードで意識している実務設計

このコードでは、まず処理対象のシートを sourceWorksheet として明示しています。
これにより、アクティブシートに依存せず、意図したシートだけを処理できます。

また、列や開始行、発注基準を定数としてまとめています。
これは、後から列構成や基準値が変わった場合でも、修正箇所を見つけやすくするためです。

さらに、在庫数は一度 stockCellValue という Variant 型で受け取り、数値かどうかを確認してから stockQuantity に格納しています。
この流れにすることで、空白や文字列が混ざっていてもマクロが止まりにくくなります。

実務では、完璧なデータだけを前提にしないことが大切です。
多少の入力ミスや空白があっても、処理が大きく崩れない設計にしておくことで、長く使いやすいマクロになります。


✅ VBAでセル値の格納処理を再利用しやすくする考え方

同じようなセル値の取得処理を何度も書いている場合は、処理の一部を関数化することも検討できます。
ただし、最初から何でも関数化すると、かえって分かりにくくなることがあります。
大切なのは、繰り返し使う処理や、意味のまとまりがある処理を切り出すことです。
例えば、最終行を取得する処理や、数値として安全に変換する処理は、複数のマクロで使い回しやすい部分です。
このような処理を関数化しておくと、コードの重複を減らし、修正漏れを防ぎやすくなります。
ここでは、数値変換を関数化する考え方を紹介します。

・数値として安全に変換する関数

Function ConvertToLongOrDefault(ByVal targetValue As Variant, ByVal defaultValue As Long) As Long

    '数値として扱える場合はLong型に変換し、それ以外は初期値を返す
    If IsNumeric(targetValue) Then
        ConvertToLongOrDefault = CLng(targetValue)
    Else
        ConvertToLongOrDefault = defaultValue
    End If

End Function

この関数を使うと、メイン処理では次のように書けます。

stockQuantity = ConvertToLongOrDefault(stockCellValue, 0)

・関数化が向いている処理

関数化が向いているのは、次のような処理です。

  • 最終行を取得する処理
  • 数値変換の処理
  • 日付変換の処理
  • 空白判定の処理
  • 文字列の整形処理

一方で、そのマクロで一度しか使わない処理まで無理に関数化する必要はありません。

まずは読みやすく書き、同じ処理が何度も出てきたら関数化する、という順番で考えると実務では扱いやすくなります。


 

✅ まとめ:VBAでセルの値を変数に格納するならループ処理と設計が重要

  • セルの値は Range.ValueCells.Value で取得できる
  • 取得した値を変数に格納すると処理の意味が分かりやすくなる
  • ループ処理では1行ずつ値を変数に入れて処理する
  • 変数名は値の意味が伝わる名前にする
  • 空白や異常値を想定してから型変換する
  • 条件判定や転記処理では変数を使うと保守しやすい
  • 列や基準値は定数化すると仕様変更に強くなる
  • よく使う処理は関数化すると再利用しやすい

VBAでセルの値を変数に格納する処理は、転記、集計、判定、チェック、自動化の土台になります。

ただ値を取得するだけでなく、その値を何として扱うのかを変数名で表現することで、コードは一気に読みやすくなります。

特に実務では、後から列構成が変わったり、入力データに空白や異常値が混ざったりすることがあります。
そのため、最初から保守性と安全性を意識した書き方にしておくことが大切です。

まずは、身近な管理表や一覧表を使って、セルの値を変数に格納しながらループ処理する流れを練習してみてください。

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 値渡し・参照