
Excel VBAベーシック受験に向けて⑨セルの操作、Valueプロパティ
オブジェクト式で対象を指定する際、一般的にコレクションを使う。
たとえば、ブックはWorkbookオブジェクトであるため、ブックの指定はWorkbooksコレクションを使い「Workbooks("Book1.xlsx")」などのように記述する。
しかし、対象にセルを指定するときは、コレクションは使わない。
セルを指定するときは、RnageやCellなどのように特別な単語を使う。
Range
Rangeは文字列を使って、セルを指定する。文字列は計算できないので、Rangeはマクロ作成時に対象のセルが決まっているときなどに使う。
Rangeの書式
括弧の中に指定したいセルのアドレスを文字列形式で記述する。
Range("A1") セルA1
Range("A1:B3") セル範囲A1:B3
Range("A1,B3") セルA1とセルB3
Cells
Cellsは、セルの位置を数値で指定できる。
何らかの計算をするときなどはCellsを使う。
Cellsの書式
Cellsでは、指定するセルの行位置と列位置を指定する。
Cells(行, 列)
Cells(3, 2) セルB3
Cells(2, 4) セルD2
列を指定する引数には、列文字(アルファベット)も指定できる。
列文字を指定するときは、必ずダブルクォーテーションで囲む。
Cells(3, "B") セルB3
Cells(2, "D") セルD2
大きい表を操作するとき、Cells(2, 50)と書くと50が何列目を指しているかが分かりにくい。そいうった場合にCells(2, "AX")と列文字を指定する。
メモ📒COLUM関数
COLUM関数で任意の列が、何列目にあたるかという数値を調べることができる。

Valueプロパティ
Valueプロパティは、セルの中にどんな値が入っているかを表すプロパティ。
「=」を使ってセルに値を代入することもできる。
例1
Sub Macro1()
Range("A1").Value = 100
Range("A2").Value = 200
Range("A3").Value = Range("A1").Value + Range("A2").Value
End Sub

例2
Sub Macro2()
Dim A As Long
A = Range("C1").Value
MsgBox A
End Sub

例3
Sub Macro3()
Dim A As String
A = InputBox("名前は?")
Range("B1").Value = A
End Sub



例4
Sub Macro4()
MsgBox "名前は" & Cells(1, 2).Value & "です"
End Sub

例5
Valueプロパティは「セルの中に入っている値」を表すプロパティである。
セルの中に計算式が入っている場合は計算結果を表します。
セルA4に「=SUM(A1:A3)」という計算式が入っていたとする。
このとき、Range("A4").Valueは、計算式の「=SUM(A1:A3)」ではなく計算式の計算結果を表す。
Sub Macro5()
MsgBox Range("A4").Value
End Sub


次のコードを実行すると、セルB4に、セルA4の計算結果である「600」が代入される。
Sub Macro6()
Range("B4").Value = Range("A4").Value
End Sub

Valueプロパティの省略
オブジェクト式の基本形は「オブジェクト.プロパティ」、「オブジェクト.メソッド」で、いずれにしても最低2つの単語が必要だが、オブジェクトがセル(Rangeオブジェクト)の時だけは、「.プロパティ」「.メソッド」のいずれも記述しない書き方が許されている。
オブジェクトだけを指定し、プロパティやメソッドを記述しなかった場合、セル(Rangeオブジェクト)のValueプロパティを指定したものとみなされる。
Range("A1") =100 は Range("A1").Value = 100 と同じ
Cells(3, 1) = Cells(2, 1) + Cells(1, 1) は Cells(3, 1).Value = Cells(2, 1).Value + Cells(1, 1).Value と同じ
Valueプロパティを省略すると可読性が高まる一方で、省略しなで記述すれば「ここはValueプロパティを操作している」と明示することができるため、ケースに応じて使い分けるようにする。
なお、複数のセルを操作するような場合、Valueプロパティを必ず記述しなければならないケースもある。
Valueプロパティを必ず記述しなければならないケースについて、Copilotさんの回答は次のとおり。
VBA (Visual Basic for Applications) では、`Value` プロパティを省略できる場合が多いですが、明示的に `Value` プロパティを記述しないといけないケースも存在します。以下はその一部です:
オブジェクトの型に依存する場合:
特定のオブジェクトが `Value` プロパティを持っており、かつ他のプロパティやメソッドも同時に存在する場合、VBAは何を参照しているのか不明になることがあります。この場合、明示的に `Value` プロパティを指定することで、意図を明確に示します。セルの範囲を操作する場合:
`Range` オブジェクトを使用する際には、多くの場合 `Value` プロパティが自動的に推測されますが、特定の条件下では明示的に指定することでコードの可読性や正確性が向上します。値の代入:
値を代入する際に、特定のシートやセルに対して `Value` プロパティを明示的に指定することで、正確に値を設定することができます。
例:
Dim cell As Range
Set cell = ThisWorkbook.Sheets("Sheet1").Range("A1")
'明示的にValueを指定
cell.Value = 10
'省略可能な場合
cell = 10
これらのケースでは、`Value` プロパティを明示的に記述することで、コードの明瞭さと正確さを保つことができます。
ChatGPTさんの回答は次のとおり。
VBA(Visual Basic for Applications)において、Value プロパティを必ず記述しなければならないケースは、主に以下のような状況で見られます:
1. セルや範囲の値の取得・設定
Excel VBAでセルや範囲の値を取得または設定する際には、Value プロパティを使用します。Value プロパティを指定しないと、セルや範囲の値を直接操作することができません。
セルの値を設定する場合: Value プロパティを使用して、セルに値を設定する必要があります。
Range("A1").Value = 100
セルの値を取得する場合: セルの値を取得する場合にも、Value プロパティを使用します。
Dim cellValue As Variant cellValue = Range("A1").Value
Value を省略した場合、セルの値を参照しようとしても、基本的に Value が暗黙的に使用されるため、動作は通常通りです。しかし、明示的に Value を指定することで、より意図が明確になります。
2. フォームコントロールの値の取得・設定
VBAでユーザーフォーム(UserForm)のコントロール(例: TextBox, ComboBox, ListBox など)から値を取得したり、値を設定したりする場合、Value プロパティが必要になります。
TextBoxの値を取得する場合:
Dim txtValue As String txtValue = TextBox1.Value
TextBoxの値を設定する場合:
TextBox1.Value = "新しい値"
ComboBoxの値を取得する場合:
Dim selectedValue As String selectedValue = ComboBox1.Value
ComboBoxの値を設定する場合:
ComboBox1.Value = "選択肢1"
3. Rangeオブジェクトと数式
Value プロパティは、セルの値だけでなく、数式を設定する際にも使用されます。例えば、数式をセルに設定する場合、Value を使って数式をセットできます。
セルに数式を設定する場合:
Range("A1").Value = "=SUM(B1:B10)"
4. セルの値に依存する処理を行う場合
VBAで値をチェックしたり、値に基づいて計算や条件分岐を行う場合にも、Value プロパティを使ってセルの内容を取得する必要があります。
If Range("A1").Value > 100 Then
MsgBox "値が100を超えています"
End If
5. 値の設定に特定の形式が必要な場合
特定の形式(例えば、日付や文字列)で値を設定したい場合にも、Value プロパティが必要です。値の設定を行わないと、エラーが発生したり、期待する結果が得られない場合があります。
Range("A1").Value = CDate("2025/01/11")
6. Valueプロパティを使うことで効率的にコードを記述できるケース
Value プロパティを使うと、Excelのセルや範囲から複数の値を一度に取得したり、設定したりすることができます。例えば、範囲を一度に取得して処理する場合です。
Dim data As Variant
data = Range("A1:B10").Value
まとめると、VBAで Value プロパティを使う場面は、セルの値やフォームコントロールの値を設定・取得する場合が主ですが、明示的に Value プロパティを使用することで、より明確で誤解のないコードを記述できます。