目標
VBAのIs演算子について理解し利用できる
演算子には算術演算子・比較演算子・論理演算子・代入演算子・連結演算子があります。この記事ではオブジェクトの比較を行ってくれるIs演算子ついて書いています。
Is演算子の概要と利用方法
Is演算子とは
それぞれの変数が同じオブジェクトを参照しているかを確認してTrue/Falseの値を返す比較演算子です。参照のイメージが湧きづらい場合は次の記事を参考にして下さい。
Is演算子の構文と利用方法
Is演算子の構文
次の比較が合えばTrue =『オブジェクト変数1』 Is 『オブジェクト変数2』
次の比較が違えばFalse =『オブジェクト変数1』 Is 『オブジェクト変数2』
Microsoft Learnでは以下のように表記されています。
result = object1 Is object2
resultに「True」か「False」が入ります。
object1に1つ目の変数を指定します。 object2に2つ目の変数を指定します。
objectに入るのものが『変数』というところが注目ポイントです。
Is演算子の利用例(1)
Worksheetオブジェクトの参照を比較します。 |
Sub IsOperator1()
Dim ws1 As Worksheet
Set ws1 = Worksheets(1)
Dim ws2 As Worksheet
Set ws2 = ws1
Dim ws3 As Worksheet
Set ws3 = Worksheets(1)
MsgBox ws1 Is ws2
MsgBox ws1 Is ws3
End Sub
ws2にws1を直接代入したときの2つの参照先は同じか?
実行結果:Trueを返します。
ws3にはws1からの代入ではなく、Worksheet番号を利用してws1と同じシートを代入。この時の2つのオブジェクトの参照先は同じか?
実行結果:Trueを返します。
Is演算子の利用例(2)
Rangeオブジェクトの参照を比較します。 |
Sub IsOperator2()
Dim cell1 As Range
Set cell1 = Range("A1")
Dim cell2 As Range
Set cell2 = cell1
Dim cell3 As Range
Set cell3 = Range("A1")
MsgBox cell1 Is cell2
MsgBox cell1 Is cell3
End Sub
cell2にcell1を直接代入したときの2つの参照先は同じか?
実行結果:Trueを返します。
cell3にはcell1からの代入ではなく、Range(“A1”)を指定してcell1と同じRangeオブジェクトを代入。この時の2つのオブジェクトの参照先は同じか?
実行結果:Falseを返します。
※Rangeオブジェクトを利用する時はWorksheetオブジェクトを扱うときと異なった結果を返しました。Rangeオブジェクトを代入する時は代入の仕方によって結果が変わることに注意が必要となります。
Is演算子の利用例(3)
Is演算子の利用例(3)ではクラスオブジェクトを扱ってみます。クラスについての記事はまた別の機会に書きたいと思います。
クラスモジュールの作成「挿入」タブ内の「クラスモジュール」を選択します。
プロジェクトエクスプローラーにクラスモジュールが作成されます。
今回作成した「Class1」をダブルクリックするとClass1のエディタがコードウィンドウに表示されます。また左下にはClass1のプロパティウィンドウが表示されます。
プロパティウィンドウのオブジェクト名の変更をします。今回は「Car」と変更します。
クラスモジュールにプログラムを記述します。
Option Explicit
Private this_carModel As String
Private this_carSheets As Integer
Private this_engineDisplacement As Integer
Public Function Init(carModel) As Car
Set Init = Me
this_carModel = carModel
this_carSheets = 5
this_engineDisplacement = 1500
End Function
Public Sub syokumuSitumonn()
MsgBox this_carModel
End Sub
Public Sub carAccelerator()
MsgBox "加速します"
End Sub
Public Sub carStop()
MsgBox "止まります"
End Sub
作成したクラスモジュールを使用して2つのオブジェクトを作成します。作成したオブジェクトの片方へ、もう片方のオブジェクトの参照を代入します。
Option Explicit
Sub IsOperator3()
'パパの車をCarクラス型で宣言します。
Dim Papa_no_Carolla As Car
'同様に僕の車をCarクラス型で宣言します。
Dim BokugaNoru_Carolla As Car
'パパの車のインスタンスを作成します。(インスタンスはクラスモジュールのコピーと考えてください)
Set Papa_no_Carolla = New Car
'インスタンス作成後にパパの車のナンバーを登録します。
Papa_no_Carolla.Init "CarNum123_4567"
MsgBox "パパが車で外出します。"
Papa_no_Carolla.carAccelerator
Papa_no_Carolla.carStop
MsgBox "車のナンバーを確認。"
Papa_no_Carolla.syokumuSitumonn
'僕の車オブジェクトを作成します。代入はパパの車オブジェクト(先ほどインスタンス化したもの)です。
Set BokugaNoru_Carolla = Papa_no_Carolla
MsgBox "僕が車で外出します。"
BokugaNoru_Carolla.carAccelerator
BokugaNoru_Carolla.carStop
MsgBox "車のナンバーを確認。"
BokugaNoru_Carolla.syokumuSitumonn
If Papa_no_Carolla Is BokugaNoru_Carolla Then
MsgBox "同じ車を利用しています。"
End If
Set Papa_no_Carolla = Nothing
Set BokugaNoru_Carolla = Nothing
End Sub
実行結果:
‘インスタンス作成時にパパの車のナンバーを登録します。
Papa_no_Carolla.Init “CarNum123_4567”
ここで登録したナンバーが「僕の車オブジェクト」のナンバーと同じになります。最後のIs演算子の条件ではTrueを返しています。つまり、同じオブジェクトを参照しているということになります。利用例(3)が難しく感じた方も(1)と(2)の違いが分かれば十分です。
今回の内容は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。