【VBAマクロ】エクセルに値を書き込みする方法|範囲指定・シート指定・ブック指定

スポンサードリンク
VBA
過去の自分
過去の自分

VBAを使ったマクロを習い始めたんだけど、
セルに値を書き込みするにはどうしたらいいの?
初心者にでもわかるように教えて!

今の自分
今の自分

なるほど…。
セルへの書き込みはマクロの基本中の基本です。
これをマスターすれば、マクロ活用の幅がぐーんと広がります。
では、「セルに値を書き込みするマクロ」を詳しく解説いたします。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
エクセル使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

スポンサードリンク

マクロでセルに値を書き込みする方法(VBA)

簡単な書き込み方法

まずはVBAコードをお見せします。
後ほど、細かく解説していきます。

Sub セルに値を書き込み()
    Range("A1").Value = "Utatane"
End Sub
実行結果

プロシージャの作成

Sub セルに値を書き込み()

End Sub

まずはプロシージャを作成しましょう。

プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。

セルに値を書き込み

ここからが本題です。

    Range("A1").Value = "Utatane"

上記コードにて、セルに値を書き込みしています。
今回はわかりやすく「A1」セルに「Utatane」という文字を書き込みした例です。

「Range」はセルの位置を指定する場合に使います。

「Range」の先頭の文字は大文字です。
全て小文字にすると動かない場合がありますのでご注意ください。

「Range」の後ろに()を書き、()内にセル名を書きましょう。
※例:A1、B2、D5

セル名は「”(ダブルクォーテーション)」で囲ってください。
囲わないとうまく動きません。
「”」は、「Shift」キーを押しながら「”2ふ」を押すことで入力されます。

次に「.Value」を書きます。
これも先頭は大文字です。
「Value」は「値」という意味だと思ってください。

ここまでをまとめると、「Range(“A1”).Value」となり、「A1セルの値」となります。
では、「A1セルの値」をどうするのかを書いていきましょう。

「Range(“A1”).Value」の後ろに「=(イコール)」を書きます。
「=」の後ろに書き込みたい値(文字列や数値)を書いて完了です。

値もセル名と同様、「”」で囲ってください。
ただし、値が数値の場合は囲わなくてOKです。

    Range("A1").Value = 100

「=」以降の意味は、「○○を代入する」です。
「代入」は「書き込む」とか「入れる」という意味だと思ってください。
左辺 = 右辺とした場合、「左辺に右辺を代入する(書き込む)」となります。
(言い換えると、「右辺を左辺に代入する」となります)

つまり、「A1セルの値に○○(Utatane)を代入する」ということです。
これでA1セルに「Utatane」が書き込みされます。

マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。

ショートカットキーを押すことでマクロを実行させることもできます。
詳しくは下記記事をご参考ください。

少し高度な書き込み方法

範囲指定で書き込み

「A1~C3」など、セルの範囲を指定して書き込みすることもできます。
下記のVBAコードを見てください。

Sub セル範囲に値を書き込み()
    Range("A1:C3").Value = "Utatane"
End Sub
範囲指定して書き込みした結果

「A1~C3」の範囲に「Utatane」が書き込みされました。
ひとまず「0」を書き込みたい場合などに便利です。

シートを指定して書き込み

シートを指定して値を書き込みすることもできます。
まずは下記のVBAコードを見てください。

Sub シートを指定して書き込み1()
    Worksheets("Sheet1").Range("A1").Value = "Utatane"
End Sub

2行目の先頭に「Worksheets(“Sheet1”).」が追加されただけです。
これで「Sheet1」の「A1」セルを指定したことになります。

シートの指定方法は他にもあります。
下記コードのように、シート番号で指定することもできます。

Sub シートを指定して書き込み2()
    Worksheets(1).Range("A1").Value = "Utatane"
End Sub

シート番号は、一番左のシートが「1」、左から2番目が「2」という具合です。
一番右のシートを指定したい場合は、()内に数字ではなく「Sheets.Count」を記述してください。

アクティブシート(現在選択されているシート)を指定することもできます。

Sub アクティブシートを指定して書き込み()
    ActiveSheet.Range("A1").Value = "Utatane"
End Sub

ブックを指定して書き込み

現在開いているブックを指定したい場合は、下記のように記述してください。

Sub ブックを指定して書き込み1()
    ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "Utatane"
End Sub

2行目の先頭に「ThisWorkbook.」が追加されただけです。

ブックを指定する場合は、併せてシートも指定する必要があります。
下記のようにブックだけを指定した場合、エラーが発生します。

Sub 失敗例()
    ThisWorkbook.Range("A1").Value = "Utatane"
End Sub
シート指定省略によるエラー

別のブックに書き込みする場合は、少し難しくなります。
下記のVBAコードを見てください。

Sub 別ブックを指定して書き込み()
    Dim targetWb As Workbook
    Dim targetWs As Worksheet
    Dim filePath As String

    filePath = "C:/Utatane/test.xlsx" ' 書き込みたいブックのフルパスを指定
    Set targetWb = Workbooks.Open(filePath) ' 対象のブックを開く
    Set targetWs = targetWb.Sheets("Sheet1") ' 対象のシートを指定
    targetWs.Range("A1").Value = "Utatane" ' セルに値を書き込む

    targetWb.Save ' 保存する
    targetWb.Close ' 閉じる
End Sub

これで別ブックである「test.xlsx」の「Sheet1」の「A1セル」に「Utatane」と書き込みされます。

Cellsで書き込み

「Range」以外にもセルへの書き込みを実行する方法があります。
下記のVBAコードを見てください。

Sub 少し高度な書き込み()
    Cells(1, 1).Value = "Utatane"
End Sub

前項の「Range(“A1”)」が「Cells(1, 1)」に変わっただけです。
実行結果は前項と同じです。

実行結果

「Range」では「A1」や「B2」といった「セル名」でセルの位置を指定します。
「Cells」では「1,2」のように、数値の掛け合わせで指定します。

【 Cells(行番号,列番号) 】

「Cells(1,2)」なら1行目×2列目なので「B1」、
「Cells(3,1)」なら3行目×1列目なので「A3」といった具合です。

Cellsの指定

【Cellsは範囲指定ができない】
「Range」は「A1:C3」のように範囲指定ができますが、「Cells」は範囲指定ができません。
セル単体のみの指定となりますので、ご注意ください。

Cellsを使うメリットは「ループを使って書き込みする」で紹介しております。

変数を経由して書き込み

これまでは直接セルに値を書き込みしていました。
今回は、値を一旦変数に代入し、その値が入った変数をセルに書き込みしてみます。
ピンと来ないと思いますので、下記VBAコードを見てください。

Sub 変数を経由して書き込み1()
    Dim name As String

    name = "Utatane"
    Cells(1, 1).Value = name
End Sub

2行目で今回使う変数を宣言しております。
宣言や変数の特徴については、下記記事をご参考ください。

4行目にて、「Utatane」を変数(name)に代入しています。
(「Utatane」を「name」に入れる)
その値(Utatane)が入った変数(name)を5行目で、セルに書き込みしています。

結果的には「Utatane」をセルに書き込みしたのと同じことになります。
一見意味が無いように思うかもしれません。
しかしながら日付や担当者名など、時と場合によって値が変わる場合は、変数を経由する方が便利です。

また、セル指定も変数を経由して行うことができます。
下記のVBAコードを見てください。

Sub 変数を経由して書き込み2()
    Dim name As String
    Dim row As Integer
    Dim col As Integer

    name = "Utatane"
    row = 1
    col = 2
    Cells(row, col).Value = name
End Sub

row=1、col=2を代入しているため、「Cells(row,col)」は「Cells(1,2)」となり、「B1」を指定したことになります。
これで「B1セル」に「Utatane」が書き込みされます。
Rangeも同様に変数を経由して書き込みできます。

Sub 変数を経由して書き込み3()
    Dim name As String
    Dim row As Integer

    name = "Utatane"
    row = 1
    Range("B"& row).Value = name
End Sub

Cellsの方が、列も変数で指定できるため便利といえます。

ループを使って書き込み

下記VBAコードは、ループを使ってA1~A5セルに連番(1~5)を書き込んだ例です。

Sub ループを使って書き込み1()
    Dim row As Integer
    For row = 1 To 5
         Range("A"& row).Value = row
    Next row
End Sub

Cellsでも可能です。

Sub ループを使って書き込み2()
    Dim row As Integer
    For row = 1 To 5
         Cells(row, 1).Value = row
    Next row
End Sub

ループを実行するためにForを使っています。
For文については下記記事で詳しく解説しておりますのでご参考ください。

応用例

いずれ役に立ちそうな応用例を2つ紹介いたします。

条件付きで書き込み

条件に応じてセルへの書き込みを行うことができます。
下記は、指定のセルが空白なら、「0」を書き込みした例です。

Sub 条件付きで書き込み()
    If Range("A1").Value = "" Then
        Range("A1").Value = 0
    End If
End Sub

※「””」は空白を表す

条件分岐にはIfを使用しています。
If文については下記記事で詳しく解説しております。ご参考ください。

最終行にデータを追加

下図のようなデータがあったとします。

今月のデータ

このデータの最終行に本日のデータを書き込みしたい場合に便利な方法です。

Sub 最終行にデータを追加()
    Dim lastRow As Integer

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Cells(lastRow, 1).Value = Date
    Cells(lastRow, 2).Value = "新しいデータ"
End Sub
今日のデータを追加

「Rows.Count」を使って最終行を取得し、その次の行に値を書き込みしています。

最終行を取得する方法は、下記記事をご参考ください。

Dateは本日の日付を取得・書き込みするために使用しています。
下記記事をご参考ください。

スポンサードリンク

うまく動作しないときの対処法

エラーが発生する

コンパイルエラー・実行時エラー

コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。

警告表示

マクロが無効になっている表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。

スポンサードリンク

最後に

VBAを使ったマクロでセルに値を書き込みする方法を解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

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