LetとSetステートメント

次図のように値型とオブジェクト型の2つに分けるとができる。

値型とオブジェクト型

最も適用範囲が広いのがバリアント/Variant型。Variant型は動的に変数のメモリ領域を割り当てる。しかも、Variant型はどんな型にも対応できるのでメモリは大きめに用意されている。最近流行りのRubyやPythonなどのント/Variant型。Variant型は動的に変数のメモリ領域を割り当てる。しかも、Variant型はどんな型にも対応できるのでメモリは大きめに用意されている。最近流行りのRubyやPythonなどのスクリプト言語は変数宣言しないVariant型みたいなもんです。

Letステートメントは、頻繁に現れるステートメントなのだが普通は省略する。

  x = 1 + 2

=は代入演算子で、次が正確な構文になる。

  Let x = 1 + 2

Letステートメントを使う変数とSetステートメントを使う変数という分類になる。

Letは日本語では「入れる」という意味。例ではxには数値3が入る。値型の変数はLetを使う。これに対してSetでは値を扱うのではなく右辺(=の右側)のメモリ上のアドレスを入れる。Object型の変数には、オブジェクトのインスタンス(Instance、実体)がロードしている先頭アドレスが入る。Setは「オブジェクトへの参照」と言う。

  • オブジェクト変数には、オブジェクトを指すアドレスが入っていると解釈する。
  • オブジェクト変数には、参照先のアドレスが入っている。

オブジェクト変数は、操作するためのハンドルのようなもの。

以下を標準モジュールかSheet1などに書いて実行します。shがオブジェクト変数です。sh変数は、WorkSheetクラスとして振る舞う。インスタンス/実体は作らないが、実体Shee1とSheet2をSetしてSheet1とSheet2の機能(Rangeプロパティ)を使ってデータを入れる。

Sub aa()
    Dim sh As Worksheet
    Set sh = Sheet1
    sh.Range("a1") = 123
    Set sh = Sheet2
    sh.Range("a1") = 456
End Sub
カテゴリー: 7 変数とインスタンス作成   VBA | 2件のコメント

古くからある変数の型は値型。インスタンスを参照する参照型

インスタンスの訳は「実体」

  • Long実体は、変数と言う。
  • Worksheetクラス実体は、インスタンス(オブジェクト変数は変数例えばSheet1)と言う。
  • Dim lng As Longと宣言するとlngは変数でこの型はLong
  • Sheet1はオブジェクト変数でこのクラス(型)はWorkbook。Sheet1変数は初めからある。

古くからある型は、メモリに値を入れる箱を用意する単純な型で、VBのByte、Integer、Long、Double、Single型などの決まったサイズを持つ。サイズが変化することは無い。数値の型で覚えることは、整数か浮動小数点数と大きさだけだ。これらの型はメモリに値を保持する箱が用意され、この箱が比較的小さい。

古くからある値型とその後に考えられたオブジェクトという型。

値型は、Boolean,Integer,Long、Doubleなどの基本データ型の中に本来はオブジェクトじゃない?という型があった。VariantとStringは、オブジェクト型に近いが、VisualBasicでも値型のように使えた。他にも構造体(ユーザー定義型)、列挙型もある。

参照型は、オブジェクトを扱う型で、参照先のアドレス(オブジェクトがあるメモリのアドレス)を入れるので数値を入れる値型と一見同じ。値型の場合は、変数宣言と同時にメモリ上のアドレスと変数を関連づけて、変数の型のサイズで領域を作る。参照型も宣言時点では、メモリ上のアドレスと変数を関連づけて、アドレスを入れる領域を作る。しかし、その変数には何も入っていない/参照していない。Newキーワードかオブジェクトのメソッドを使ってメモリ上にインスタンス/実体を作った時点で、そのメモリ上のアドレスを参照型の変数に入れる。

https://youtu.be/hP7NB6Av9y0
カテゴリー: 7 変数とインスタンス作成   VBA | 2件のコメント

左辺=右辺(箱=値) アドレスの話も

物理的な世界で、みかん箱にバナナを入れる。さらに、みかん箱にリンゴを入れるとみかん箱にはバナナとリンゴがある。メモリの世界ではバナナは無くなります。みかん箱は変数のような入れ物です。実際は、コンピュータの記憶装置/メモリはアドレス/番地で管理するが数字だとわかりにくにのでプログラムでは変数という文字を使う。

変数の機能は、入れ物と入れ物に入るがある。=は同じという意味でも使えるが、ここでは代入を意味する。右辺から左辺へ入る。右辺は値左辺は箱として機能する。

古くからある値型の変数は「入れ物」と「値」だけを理解すれば良かった

入れ物はメモリ上のアドレス(番地)として指定でき、その番地に値が入る。番地は、英語でアドレス、メモリの空間の中の番地という意味。64ビットWindowなら2の64乗(数字にして20桁)のアドレス、メモリ空間がある。この番地の数字の代わりに変数というわかりやすい文字でアドレスの中身を操作できるようにしたもの。

値型の変数は、「箱の大きさ」と「値」だけ

次のDimステートメントで、Long型(型は、メモリ上の大きさと中身性質を意味する)の変数aを宣言する。

    Dim a As  Long

変数aに変数bの値を入れる式は、「a=b」となる。

    Dim  a  As  Long, b As Long
    b=1
    a = b

aには、Longサイズまでの大きさの入れ物で数値が入る。左辺の箱に右辺の値を入れる。左は箱、入れ物。その入れ物はメモリにあり、メモリ上のアドレス(番地)を変数aという名前で使う。

「a=b」は、変数bは、値を右辺に渡す。左辺の変数bは、入れ物として動いている。

「1=b」はできない。この式はありえない。1は値だけで、変数のように入れ物として扱えない。1は計算するまでの一時的なメモリの領域に作られるが、1をプログラム上ではメモリの場所(箱、アドレス)としては扱えない。

右辺のa+bは、a変数の値とb変数の値を加算する。

  a = a + b

値型の変数は、「箱=値」の考えでいいが、オブジェクト変数になるとあるオブジェクトを参照している変数なので次図の値は参照先のメモリアドレス値が入っているのでオブジェクト変数.Valueなどのプロパティやメソッドは、オブジェクト変数に「.」ドットを付けて使う。次図はイメージの図。

Publicにしてイミディエイトウィンドウから使えるようにする。標準モジュールに書く。

Public sh As Sheet1, ra As Range 

以下はイミディエイトウィンドウに書く。

Set sh=Sheet1
Set ra=Sheet1.Range("a1")
ra.Value=123
?ra
234
カテゴリー: 7 変数とインスタンス作成   VBA | コメントする

セルのデータを使った条件式

ExcelでA列とB列の値が同じか比較する式は、「=セル番地=セル番地」。計算式をセルに入れるときは、先頭に=を入れる。2つ目の=が比較の演算子になる。「=IF(A1=B1,1,2)」のA1=B1も比較の演算子。IFはワークシート関数で「=IF(条件式,Trueの時の処理,Falseの時の処理)」。

イミディエイトからExcelのセルを呼び出すにはRangeオブジェクトを使う。()内にセル番地を入れる。以下はイミディエイト。

?Excel.Range("a1")=Excel.Range("b1")
False
?range("a2")=range("b2")
True
range("a2")=range("b2")    'エラーにはならないが比較では無く代入。セルB2の値がセルA2に入る。

=は、右辺(=の右側の式)から左辺(=の左側の変数)への代入に使ったり、左右の比較だったりと読み替える必要がある。比較した結果を知るためには?がいる。無いと=は代入演算子として扱われるので代入できないとエラーになる。

カテゴリー: 2 VBEを使うための基本操作と知識 | コメントする

Sheet1にメソッドとプロパティを定義し、実行する

標準モジュールに書いたプロシージャは、イミディエイトから呼び出す時にプロシージャ名だけで呼び出す。しかし、オブジェクトの場合はオブジェクト.メソッドやオブジェクト.プロパティとして使う。

イミディエイトで使っているようにSheet1のモジュールに書いた変数は、プロパティ。プロシージャは、メソッドと呼ぶ。使う場合は、Sheet1の持ち物なので必ずSheet1にドットで使う。Sheet1の自動メンバー表示でアイコンの違いにも注意。

カテゴリー: 2 VBEを使うための基本操作と知識 | コメントする