Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ セル値の読み取りと書き込み | Excelデータの操作
ビジネス自動化のためのExcel VBA

セル値の読み取りと書き込み

メニューを表示するにはスワイプしてください

VBAが行う最も基本的な操作は、セルの値(Value)の読み取りと書き込み。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(row, column)は、文字ではなく数値で同じことを行う。ループ処理で特に便利。ループ変数は文字ではなく数値。

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

ValueとFormulaとFormula2の違い

これらは似ているが、同じではない。

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
図3.1

数値のみが必要な場合は .Value を使用。セルに数式を書き込む場合は .Formula を使用(例:合計列をプログラムで作成する場合、手入力やコピーの代わりに使用):

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

値の表示形式を制御し、元の数値は変更しない:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

この設定は見た目以上に重要。セルには 0.1 が格納されていても、同時に「10%」と表示でき、NumberFormat のみが表示部分を制御する。

課題

  1. Sub を作成し、注文 ORD1003 の顧客名と合計金額を2つの変数に読み込み、MsgBox で表示する。
  2. ORD1002 のステータスを Range ではなく Cells(row, column) を使って「Shipped」に変更する。
  3. 単価および合計金額の列に NumberFormat = "$#,##0.00" を、割引率の列に「0%」を適用する。
ヒント
expand arrow

1. ORD1003 の顧客名と合計金額の読み取り

  • まず、ORD1003 がどの行にあるかを確認 — 第3章の冒頭データの表で数えると、ORD1001 が2行目なので、ORD1003 はさらに2行下。
  • 顧客名と合計金額は異なる列 — ヘッダー行(Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status)を横に数えて、それぞれの列の位置を確認。
  • 顧客名用の変数(String 型)と合計金額用の変数(Double 型)を宣言し、第3章で学んだ方法でシートを明示的に参照(ThisWorkbook.Worksheets("Orders"))、各セルの .Value を対応する変数に読み込む。
  • 2つの変数を & で連結し、MsgBox に渡して表示 — 第2章で行ったパターンと同じ。

2. Cells(row, column) を使った ORD1002 のステータス変更

  • Cells(row, column) は列記号ではなく数字を使う — ORD1002 の行番号は表から分かるので、列は位置を数えて指定(Status は9列目)。
  • これは単純な代入:.Cells(row, column).Value = "Shipped"、事前に値を読み取る必要はなし。

3. 3つの列への NumberFormat の適用

  • NumberFormat はセル単体でも範囲でも同じ方法で設定 — F2:F6H2:H6G2:G6 に適用(単価、合計金額、割引率がそれぞれどの列か再確認してから入力)。
  • 各列ごとに1行ずつ記述。単価・合計金額は通貨書式、割引率はパーセント書式 — 1行で両方の書式を適用しないこと。
  • すでに設定した ws 変数で範囲を参照すれば、3行とも簡潔で統一感のある記述になる。
解答例
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  1

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セル値の読み取りと書き込み

VBAが行う最も基本的な操作は、セルの値(Value)の読み取りと書き込み。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(row, column)は、文字ではなく数値で同じことを行う。ループ処理で特に便利。ループ変数は文字ではなく数値。

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

ValueとFormulaとFormula2の違い

これらは似ているが、同じではない。

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
図3.1

数値のみが必要な場合は .Value を使用。セルに数式を書き込む場合は .Formula を使用(例:合計列をプログラムで作成する場合、手入力やコピーの代わりに使用):

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

値の表示形式を制御し、元の数値は変更しない:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

この設定は見た目以上に重要。セルには 0.1 が格納されていても、同時に「10%」と表示でき、NumberFormat のみが表示部分を制御する。

課題

  1. Sub を作成し、注文 ORD1003 の顧客名と合計金額を2つの変数に読み込み、MsgBox で表示する。
  2. ORD1002 のステータスを Range ではなく Cells(row, column) を使って「Shipped」に変更する。
  3. 単価および合計金額の列に NumberFormat = "$#,##0.00" を、割引率の列に「0%」を適用する。
ヒント
expand arrow

1. ORD1003 の顧客名と合計金額の読み取り

  • まず、ORD1003 がどの行にあるかを確認 — 第3章の冒頭データの表で数えると、ORD1001 が2行目なので、ORD1003 はさらに2行下。
  • 顧客名と合計金額は異なる列 — ヘッダー行(Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status)を横に数えて、それぞれの列の位置を確認。
  • 顧客名用の変数(String 型)と合計金額用の変数(Double 型)を宣言し、第3章で学んだ方法でシートを明示的に参照(ThisWorkbook.Worksheets("Orders"))、各セルの .Value を対応する変数に読み込む。
  • 2つの変数を & で連結し、MsgBox に渡して表示 — 第2章で行ったパターンと同じ。

2. Cells(row, column) を使った ORD1002 のステータス変更

  • Cells(row, column) は列記号ではなく数字を使う — ORD1002 の行番号は表から分かるので、列は位置を数えて指定(Status は9列目)。
  • これは単純な代入:.Cells(row, column).Value = "Shipped"、事前に値を読み取る必要はなし。

3. 3つの列への NumberFormat の適用

  • NumberFormat はセル単体でも範囲でも同じ方法で設定 — F2:F6H2:H6G2:G6 に適用(単価、合計金額、割引率がそれぞれどの列か再確認してから入力)。
  • 各列ごとに1行ずつ記述。単価・合計金額は通貨書式、割引率はパーセント書式 — 1行で両方の書式を適用しないこと。
  • すでに設定した ws 変数で範囲を参照すれば、3行とも簡潔で統一感のある記述になる。
解答例
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  1
some-alt