【Excel VBA】セルに値を入れる方法!一括代入も!

Excel VBAでセルに値を入れたいときはないでしょうか。

けど、そんな中で悩むことは、

・Excel VBAでセルに値を入れるやり方がわからない。
・Excel VBAでセルに形式を指定して値を入れるやり方がわからない。
・Excel VBAで複数のセルに一括で値を入れがやり方がわからない。

ですよね。

今回はそんなお悩みを解決する
Excel VBAでセルに値を入れる方法について
まとめます!


Excel VBAでセルに値を入れるパターン

本ページで取り上げているVBAでセルに値を入れるパターンは以下の通りです。詳細は各章をご参照ください。

①セルへ値を入力するオブジェクト

単体セルへの代入方法について説明します。

②選択シートのセルへ値を入力する

デフォルトのシートはどこを選択しているか、シートを選択するにはどうしたらよいか説明します。

③形式を指定した上セルへ値を入力する

Valueプロパティ以外に数式入力などどのような形式の指定方法があるか説明します。

④別シートのセルへ値を入力する

別シートのセルへ値を入力する方法について説明します。

⑤別ブックのセルへ値を入力する

別ブックのセルへ値を入力する方法について説明します。

⑥複数のセルへ値を入力する

複数のセルへ値を入力する方法について説明します。

それではさっそくやってみましょう。



①セルへ値を入力するオブジェクト

セルへ値を入力する際に使用するオブジェクトはRangeオブジェクトです。
取得方法はRangeオブジェクトのRangeプロパティとCellsプロパティの2種類があります。

Rangeプロパティ

Rangeプロパティはセル、セル範囲を扱うことができます。
A1形式でセルの位置を記述します。
Valueプロパティでセルの値を入出力していきます。

Sub セルへ入力する1_1()

Dim objRrange As Range
Set objRrange = Range("A1")
objRrange.Value = "テスト入力"

End Sub

実行結果です。

タカヒロ
タカヒロ
Valueプロパティは省略可能で、未記載の場合も同様の結果を得ることができます。

Cellsプロパティ

Cellsプロパティは単体のセルを扱うことができます。列、行番号でセルの位置を指定します。
Valueプロパティでセルの値を入出力していきます。

Sub セルへ入力する1_2()

Dim objCells As Range
Set objCells = Cells(1, 1)
objCells.Value = "テスト入力"

End Sub

タカヒロ
タカヒロ
Rangeオブジェクトの扱いがちょっとややこしいですねRangeは通常アクティブシートのRangeプロパティであるととらえた方がよいでしょう。




②選択シートのセルへ値を入力する

選択シートのセルへ値を入力する方法について説明します。
現在選択されているシートを扱うActiveSheetオブジェクトを使用して、RangeやCellsプロパティでセルを指定しValueプロパティで値を指定していきます。

Rangeプロパティ

Sub セルへ入力する2_1()

Dim objRrange As Range
Set objRrange = ActiveSheet.Range("A1")
objRrange.Value = "テスト入力"

End Sub

Cellsプロパティ

Sub セルへ入力する2_2()

Dim objCells As Range
Set objCells = ActiveSheet.Cells(1, 1)
objCells.Value = "テスト入力"

End Sub

なお、ActiveSheetオブジェクトは省略可能です。

Sub セルへ入力する2_1()

Dim objRrange As Range
Set objRrange = Range("A1")
objRrange.Value = "テスト入力"

End Sub

タカヒロ
タカヒロ
ActiveSheetオブジェクトを省略して記載しているVBAがほとんどですね。




③形式を指定した上セルへ値を入力する

セルに値を入れるときに、書式などの形式を指定したい場合があります。
例えば数式/関数として入力したい場合はFormulaプロパティを使います。

Formulaプロパティ

タカヒロ
タカヒロ
セル代入の値の先頭に「=」を入れればセル挿入時点で関数入りの数式であるとExcel側で判断しますので、一応Formulaを使わなくてもできます。

使い方はRangeオブジェクトにFormulaプロパティを指定します。

Range(“<挿入先セルA1値>”).Formula = “<数式>”
Cells(“<挿入先セル番号>”).Formula = “<数式>”

Sub セルへ入力する3_1()

ActiveSheet.Cells(1, 3).Formula = "=SUM(A1:B1)"

End Sub

タカヒロ
タカヒロ
Formulaプロパティの他、上記Valueプロパティ、テキストだけのTextプロパティ、セルのサイズを示す、Width、Heightプロパティ、フォントのFontプロパティなどがあります。




④別シートのセルへ値を入力する

これまで選択されたシートを対象にオブジェクトを取得してきましたが、別シートのオブジェクトも取得し、別シートのセルへ入力することが可能です。

Sub セルへ入力する4()

Worksheets("Sheet2").Range("A1").Value = "テスト入力2"

End Sub




⑤別ブックのセルへ値を入力する

これまで選択されたシートを対象にオブジェクトを取得してきましたが、別ブックのオブジェクトも取得し、別ブックのセルへ入力することが可能です。

Sub セルへ入力する5()
    Workbooks.Open "F:\test\Book1.xlsx"
    Workbooks.Open "F:\test\Book2.xlsx"
    Workbooks("Book2.xlsx").Worksheets("Sheet1").Range("A1").Value = _
    Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Value
End Sub




⑥複数のセルへ値を入力する

これまで1つのセルに対しての入力処理でしたが、行(右)方向、列(下)方向、行列双方向の指定範囲に対して値を入力することが可能です。

Rangeプロパティでと配列で一括代入

Rangeプロパティで範囲指定し、配列で一括代入します。

列(下)方向

(1, 2, 3, 4)を代入した配列で、列(下)方向”A1:A4″へ一括代入していきます。

Sub セルへ入力する6_1()
    Dim arrTmp(3, 0) As Integer
    arrTmp(0, 0) = 1
    arrTmp(1, 0) = 2
    arrTmp(2, 0) = 3
    arrTmp(3, 0) = 4
    Worksheets("Sheet1").Range("A1:A4") = arrTmp
End Sub

行(右)方向

(1, 2, 3, 4)を代入した配列で、”A1:D1″へ一括代入していきます。

Sub セルへ入力する6_2()

    Worksheets("Sheet1").Range("A1:D1").Value = Array(1, 2, 3, 4)
    
End Sub

行列双方向

行列双方向の範囲に対して指定するには、二次元配列を使います。
二次元配列へ値を代入し、配列のままRangeプロパティへ代入すると配列のインデックス番号に応じてRangeの範囲で配列の値が一括代入されます。

サンプルでは二次元配列の値を”A1:B2″へ一括代入をしています。

Sub セルへ入力する61()
    Dim arrTmp(1, 1) As String
    arrTmp(0, 0) = "A1"
    arrTmp(1, 0) = "A2"
    arrTmp(0, 1) = "B1"
    arrTmp(1, 1) = "B2"
    Worksheets("Sheet1").Range("A1:B2").Value = arrTmp
End Sub

また、応用技で、Rangeプロパティから配列へ一括取得をし、別の指定範囲に同じくRangeプロパティをつかえば、
2行で一括代入することができてしまいます。

Sub セルへ入力する6_5()
    Dim arrTmp As Variant
    
    arrTmp = Worksheets("Sheet1").Range("A1:B2").Value
    Worksheets("Sheet1").Range("D1:E2").Value = arrTmp
End Sub

タカヒロ
タカヒロ
ForNextステートメントを使わないで一括代入できるので、VBAの高速手法として知られていますね。

ForNextステートメントと配列で順次処理

ForNextステートメントと配列で順次処理をしていく方式となります。
Rangeプロパティの一括代入方式と比べ、件数に応じて処理は重くなりますが、条件追加などによる小回りの利いた処理をすることができます。

列(下)方向

(1, 2, 3, 4)を代入した配列で、”A1:A4″へ一括代入していきます。

Sub セルへ入力する6_2()
    Dim arrTmp As Variant
    arrTmp = Array(1, 2, 3, 4)
    For n = LBound(arrTmp) To UBound(arrTmp)
    Worksheets("Sheet1").Cells(1, n + 1) = arrTmp(n)
    Next n
End Sub

行(右)方向

(1, 2, 3, 4)を代入した配列で、”A1:D1″へ一括代入していきます。

Sub セルへ入力する6_3()
    Dim arrTmp As Variant
    arrTmp = Array(1, 2, 3, 4)
    For n = LBound(arrTmp) To UBound(arrTmp)
    Worksheets("Sheet1").Cells(n + 1, 1) = arrTmp(n)
    Next n
End Sub

 

行列双方向

サンプルでは二次元配列の値を”A1:B2″へ一括代入をしています。

Sub セルへ入力する6_4()
    Dim arrTmp(1, 1) As String
    arrTmp(0, 0) = "A1"
    arrTmp(1, 0) = "A2"
    arrTmp(0, 1) = "B1"
    arrTmp(1, 1) = "B2"
    For n = LBound(arrTmp, 1) To UBound(arrTmp, 1)
        For o = LBound(arrTmp, 2) To UBound(arrTmp, 2)
            Worksheets("Sheet1").Cells(n + 1, o + 1) = arrTmp(n, o)
        Next o
    Next n
End Sub

 

タカヒロ
タカヒロ
Rangeプロパティから配列へ一括取得をした場合、配列のインデックス番号は0,0ではなく1,1から始まりますのでご注意ください。

オートフィルで連続コピー

オートフィルで連続コピーする方法となります。
コピー元から指定範囲まで連続コピーをしていきます。
連続する数値を指定した場合は加算された形で値がコピーされていきます。

データを以下のように準備します。

列(下)方向

“A1:A2″を参照し、”A1:A4″まで連続コピーしていきます。

Sub セルへ入力する6_7()
    Worksheets("Sheet1").Range("A1:A2").AutoFill Destination:=Worksheets("Sheet1").Range("A1:A4"), Type:=xlFillDefault
End Sub

行(右)方向

“A1:B1″を参照し、”A1:D1″まで連続コピーしていきます。

Sub セルへ入力する6_6()
    Worksheets("Sheet1").Range("A1:B1").AutoFill Destination:=Worksheets("Sheet1").Range("A1:D1"), Type:=xlFillDefault
End Sub



⑦行列すべてのセルへ値を入力する

行列すべてのセルへ値を入力する方式となります。
行、列の最終セルまで処理されますので、最終セルまで代入させたいときに便利です。

列(下)方向

列の選択はRowsプロパティを使います。
サンプルはC列選択を意味する3を指定しています。

Sub セルへ入力する7_1()

    Worksheets("Sheet1").Rows(3) = Array(1, 2, 3, 4)
    
End Sub

タカヒロ
タカヒロ
配列で代入する場合、インデックス数を超えたセルは「#N/A」となります。


行(右)方向

行の選択はColumnsプロパティを使います。
サンプルは3行目選択を意味する3を指定しています。

Sub セルへ入力する7_2()
    Dim arrTmp(3, 0) As Integer
    arrTmp(0, 0) = 1
    arrTmp(1, 0) = 2
    arrTmp(2, 0) = 3
    arrTmp(3, 0) = 4
    Worksheets("Sheet1").Columns(3) = arrTmp
End Sub




VBAの実装手順

実装手順は以下の通りです。

今回はExcel側にこのVBAを実装します。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。


さいごに

いかがでしょうか。

今回は、
Excel VBAでセルに値を入れる方法について
まとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です