VBA(Visual Basic for Applications)における「オブジェクト」と「プロシージャ(Sub / Function)」は、どちらもプログラムの構成要素ですが、役割や使われ方が根本的に異なります。
🔷 1. 基本的な違い
項目 | オブジェクト | プロシージャ |
---|---|---|
概要 | Excelなどの操作対象になる実体 | 動作・処理のまとまり |
機能 | 状態(プロパティ)や操作(メソッド)を持つ | 一連の命令を実行する命令ブロック |
使用方法 | Range("A1").Value = 100 (状態や操作) | Call SubName() や =FunctionName() |
主な用途 | 対象(セル、シート、ファイルなど)を表す | 処理の自動化や計算など |
🔷 2. オブジェクトとは?
● 定義
オブジェクトとは「属性(プロパティ)」と「機能(メソッド)」を持つ実体です。Excel の中では、ブック(Workbook)やシート(Worksheet)、セル(Range)などすべてがオブジェクトです。
● 例
Range("A1").Value = "Hello"
Range("A1").Interior.Color = RGB(255, 255, 0)
ここで Range("A1")
がオブジェクト、.Value
や .Interior.Color
はプロパティ(属性)、.ClearContents
のようなものがメソッド(機能)です。
🔷 3. プロシージャとは?
● 定義
プロシージャとは、複数の命令をまとめた処理のかたまりです。SubプロシージャとFunctionプロシージャの2種類があります。
- Subプロシージャ:実行はするが戻り値を返さない
- Functionプロシージャ:実行結果(戻り値)を返す
● 例(Sub)
Sub GreetUser()
MsgBox "こんにちは"
End Sub
● 例(Function)
Function Add(x As Integer, y As Integer) As Integer
Add = x + y
End Function
🔷 4. オブジェクト vs プロシージャ:違いを具体的に
比較項目 | オブジェクト | プロシージャ |
---|---|---|
存在の意味 | 操作対象(データや構造) | 動作・処理の定義 |
例 | Worksheets("Sheet1") | Sub Hello() / Function Add() |
振る舞い | 値を持ち、操作される | 実行され、命令を順に処理する |
主な構成要素 | プロパティ、メソッド | 引数、ローカル変数、処理文 |
使用方法 | .プロパティ や .メソッド() で使用 | Call ProcName() で呼び出す |
🔷 5. 両者を組み合わせた例
Sub SetCellValue()
Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A1") ' オブジェクト
rng.Value = "VBAで入力しました" ' オブジェクトのプロパティを操作
End Sub
このコードでは:
Worksheets("Sheet1").Range("A1")
はオブジェクトValue
はそのプロパティSetCellValue
はプロシージャ
🔷 6. クラスとカスタムオブジェクトの関係(上級)
VBAでは Class Module
を使って、自分でオブジェクトを作成できます。これにより「プロシージャ(FunctionやSub)」をそのクラスの「メソッド」に含めて使うこともできます。
' Class1(クラスモジュール)内
Public Name As String
Public Sub SayHello()
MsgBox "こんにちは、" & Name
End Sub
' 標準モジュール
Dim user As New Class1
user.Name = "山田"
user.SayHello
ここでは user
がオブジェクトで、SayHello
はそのメソッド(プロシージャ)になります。
🔷 7. まとめ:どちらも重要!
ポイント | 解説 |
---|---|
オブジェクト | VBAの操作対象(セル、シート、ファイル、フォームなど) |
プロシージャ | 一連の処理や計算を実行するコードのまとまり |
関係性 | オブジェクトを使って、プロシージャ内で操作することが多い |
VBAでの基本スタイル | オブジェクト + プロシージャ の組み合わせ |
✅ 補足:オブジェクトの中にもプロシージャ(メソッド)がある!
例えば、Range.ClearContents
は「オブジェクトの中のプロシージャ的な機能」です。
これにより、オブジェクトとプロシージャは排他的なものではなく、連携して使われるという点も重要です。