←
▼
▲
Function FormatNumber( Number as integer [, Decimal as integer, bZero as integer,
bMinus as integer, bKeta as integer ] ) as string
数値を、書式で整列した文字列に変換します。
【引数】
Number
Decimal
変換前の数値
小数の桁数。 四捨五入されます。 省略時 = 2
返り値
数値を、書式で整列した文字列
bZero
整数部が 0 のとき 0 を付けるか。 True=0.1、False=.1、省略時= OS設定(True)
'// デフォルト
FormatNumber( 1 ) = "1.00"
'// 小数点の桁数
FormatNumber( 1, 0 ) = "1"
FormatNumber( 1, 1 ) = "1.0"
FormatNumber( 1, 2 ) = "1.00"
FormatNumber( 1.5, 0 ) = "2"
'// 整数部が 0 のとき
FormatNumber( 0.5, 1, True ) = "0.5"
FormatNumber( 0.5, 1, False ) = ".5"
'// マイナスのとき
FormatNumber( -0.5, 1,, True ) = "(0.5)"
FormatNumber( -0.5, 1,, False ) = "-0.5"
'// 桁を区切るコンマ
FormatNumber( 12345, 0,,, True ) = "12,345"
FormatNumber( 12345, 0,,, False ) = "12345"
サンプル:
bMinus
負の数のとき - 記号ではなく ( ) で囲むかどうか。 省略時=OS設定(False)
bKeta
3桁ごとにコンマで区切るかどうか。 省略時=OS設定(False)
数値の先頭に 0 をつけるときは、下記のようにします。
Right( "00" & 27, 3 ) = "027"
3桁のときは、0 を2つ並べます
サンプル:
FormatNumber( 12345.6, 2,,, False ) = "12345.60"
小数2桁、コンマ区切りなし
関連
キーワード:
←
▼
▲
Function Hex( Num as integer ) as string
数値から、16進数の文字列に変換します。
サンプル:
Hex( 16 ) = "10"
CLng( "&h" & "10" ) = 16
関連
16進数の文字列から、数値に戻すには、
CLng( "&h" & Mid( "0x10", 3 ) )
32ビット整数 (C言語の int32_t) の値は、&h...& と記述します。
&h8000 = -32768 '// (Long型 = C言語の int16_t 型の値から型変換したもの)
&h8000& = 32768 '// (Long型 = C言語の int32_t 型の値)
&h10000 = 65536 '// (Long型 = C言語の int32_t 型の値)
Right( "000"+ Hex( 15 ), 4 ) = "000F"
サンプル:
4桁の 16進数にする
CLng( Replace( "0x10", "0x", "&h" ) )
←
▼
▲
Function InStr( [start_i,] s, key [,mode] ) as integer
(p211)
start_i
開始位置(1〜)、省略すると 1
s
検索対象の文字列
key
検索キーワード
返り値
見つかった位置(1〜)、 見つからなかった = 0
取得した返り値 i を Left( s, i ) とすると、見つかった文字まで含みます。
取得した返り値 i を Mid( s, i ) とすると、見つかった文字から含みます。
start_i を指定しても、返り値は s の先頭からの位置です。
【引数】
文字列 s の中を検索して、文字列 key のある位置を返します。
A B C D E F
1 2 3 4 5 6
InStr
Left(s,3) = "ABC"
Mid(s,3) = "CDEF"
参考
s が Null のときは、Null を返します。
大文字小文字を区別しないときは、s と key を LCase 関数で変換してください。
サンプル
Assert InStr( "abcde", "cd" ) = 3
Assert InStr( 1, "abcde", "CD", 1 ) = 3
補足
大文字小文字を区別しない
mode
大文字小文字を 0=区別する、1=区別しない
詳細な検索条件や見つかった数など
←
▼
▲
Function InStrRev( s, key [,start][,mode] ) as integer
start_i
開始位置(1〜)、省略すると -1=末尾
s
検索対象の文字列
key
検索キーワード
返り値
見つかった位置(1〜)、 見つからなかった = 0
【引数】
文字列 s の中を末尾から検索して、文字列 key のある位置を返します。
mode
関連
大文字小文字を 0=区別する、1=区別しない
start_i 引数は、次にマッチする可能性があるキーワードの末尾の位置を指定してください。
Assert InStrRev( "abcbc", "bc", 5 ) = 4
Assert InStrRev( "abcbc", "bc", 4 ) = 2
Assert InStrRev( "abcbc", "bc", 3 ) = 2
Assert InStrRev( "abcbc", "bc", 2 ) = 0
InStrRev( "abcbc", "bc", 0 ) '// Error
サンプル
←
▼
▲
Function Replace( str as string, from as string, to as string
[, start[, count[, compare]]] )
str
置き換えられる文字列を含む文字列
from
置き換える前の文字列
to
置き換えた後の文字列
返り値
置き換えた後の文字列を含む文字列
【引数】
文字列の一部を置き換えます。
str に from と一致する文字列が複数あったら、すべて置き換えます。
例:
Replace( "abcd abcd", "abc", "x" ) = "xd xd"
関連
関連
Replace( "abcd ABCD", "abc", "x",1,-1,1 ) = "xd xD"
例:
←
▼
▲
Function Join( Array as array of variant [,Delimiter as string] ) as string
配列の要素を列挙した文字列を返します。
【引数】
Array
Delimiter
列挙する配列
要素の間に入れる文字列、省略時=" "(空白)
返り値
配列の要素を列挙した文字列
関連
←
▼
▲
英文字を小文字にします。
Function LCase( s as string ) as string
←
▼
▲
Function Asc( Text as string ) as integer
文字列の先頭の文字を、Shift-JIS コードの数値で返します。(Asc)
VBScript のテキストは Unicode ですが、Asc の返り値は Unicode ではありません。
AscW の返り値は Unicode です。
サンプル
Assert Asc( "あ" ) = &h82A0
82 が Shift-JIS の第1バイト
&h82A0 はマイナスの値です。
Function AscW( Text as string ) as integer
Assert AscW( "あ" ) = &h3042
3042 は、Unicode
関連
文字列の中のすべての文字コード(を表示)
←
▼
▲
Function Left( s as string, i as integer ) as string
文字列の左から数文字だけ返します。
s
i
返り値
"abc"
2
"ab"
"abc"
9
"abc"
0
""
"abc"
エラー 5
-1
"abc"
"あaいbうc"
4
"あaいb"
""
1
""
←
▼
▲
Function Mid( s as string, i as integer [, n as integer ] ) as string
文字列の i 文字目から n 文字分だけ返します。
s
i
返り値
"abc"
2
"b"
""
4
"abc"
0
"abc"
エラー 5
"あaいbうc"
3
"いb"
n
1
(省略)
"bc"
2
"abc"
2
"bc"
3
"abc"
1
2
1
0
""
1
"abc"
1
-1
"abc"
エラー 5
1
9
""
"abc"
←
▼
▲
Function StrComp( String1 as string, String2 as string [, Option as integer ] )
as integer
文字列を比較します。
Option に指定できる値
vbBinaryCompare (=0)
vbTextCompare (=1)
大文字小文字は区別しない
大文字小文字は区別する。(デフォルト)
サンプル: 下記の条件式は、すべて真です
If StrComp( "a", "b" ) < 0 Then ...
If StrComp( "a1", "a2" ) < 0 Then ...
If StrComp( "A", "a" ) < 0 Then ...
If StrComp( "-", " " ) < 0 Then ... '// ハイフンは空白より小さい
If StrComp( "A", "a", 1 ) = 0 Then ...
Select 文で、大文字小文字を区別しないときは、次のように UCase を使います。
Select Case UCase( str )
Case "ABC" : op = ABC
Case "DEF" : op = DEF
Case Else : op = Empty
End Select
返り値は、String1 = String2 なら、0 です。
0 と比較する演算子は、String1 と String2 を比較する演算子と同じになります。(下記サンプル)
←
▼
▲
Function UCase( s as string ) as string
英文字を大文字にします。
←
▼
▲
Class Book
Public m_Title '// メンバ変数
Private m__Price '// メンバ変数
Private Sub Class_Initialize() '// コンストラクタ
End Sub
Public Sub Echo() '// メンバ関数
WScript.Echo Title & " - " & Price
End Sub
End Class
main
Sub main()
Dim a_book
Set a_book = new Book : ErrCheck
a_book.Title = "VBS本"
a_book.Echo
a_book = Empty '// 明示的な廃棄
End Sub
Class
Public Sub
new
.
End Class
配列のメンバ変数もできます。
ただし、Redim は、メンバ関数の中でしかできません。
Public XArr()
Redim Preserve XArr(-1)
コンストラクタで初期化
構造体配列の初期化子に相当するものはありませんが、
Me
メンバ関数の中で使える、自分のオブジェクト(this ポインタ)
TypeName( obj )
クラス名を文字列で返す
クラスを関数の引数に渡すことはできません。 オブジェクトは渡せます。
If a Is b Then
同じオブジェクトかどうかを判定します。
Class Book
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
End Sub
Public Property Get Title()
Title = ""
End Property
Public Property Let Title( value )
End Property
Public Property Set AnObj( obj )
End Property
Public Property Get Title( index )
Title = ""
End Property
End Class
Class_Terminate
Set ObjA.AnObj = ObjB ' Property Set AnObj が呼ばれる
プロパティにオブジェクトを設定するときは、次のように記述し、Property Set が呼ばれます。
Public Property Let XXXX( x ) : XXXX = x : End Property
Public Property Get XXXX() : XXXX = m_XXXX : End Property
Public Property Set XXXX( x ) : Set XXXX = x : End Property
Public Property Get XXXX() : If IsObject(m_XXXX) Then Set XXXX = m_XXXX : _
Else XXXX = m_XXXX : End If : End Property
' コンストラクタ
' プロパティ(Read)
' プロパティ(Write)
' プロパティ(Set)
' 添え字付き Read プロパティ
すれば使えます。
をサポート
関連
参考
委譲するとき
Public Property Let XXXX( x ) : m_Partner.XXXX = x : End Property
Public Property Get XXXX : XXXX = m_Partner.XXXX : End Property
Public Property Set XXXX( x ) : Set m_Partner.XXXX = x : End Property
Public Property Get XXXX : Set XXXX = m_Partner.XXXX : End Property
Public Sub XXXX( a ) : m_Partner.XXXX a : End Sub
Public Function XXXX( a ) : XXXX = m_Partner.XXXX( a ) : End Function
→ オブジェクトの属性の反映 (C言語)
←
▼
▲
Class_Terminate (デストラクタ) メソッドは、どの変数からもオブジェクトが参照されなく
なったとき(参照カウントが0になったとき)に呼び出されます。 このとき、オブジェクトは
削除されたと見なされます。
WScript.Quit が呼ばれたとき、ローカル変数に Set されたオブジェクトの
Class_Terminate は、呼ばれません。 実行時エラーになったときは呼び出されます。
グローバル変数のオブジェクトの Class_Terminate なら、WScript.Quit が呼ばれた
ときでも、呼ばれます。
VBScript は、例外処理構文が使えないため、Finally ブロックを記述できません。
On Error Resume Next は、サブ・プロシージャのエラーをキャッチできますが、
Finally ブロックにジャンプする機能がありません。
Finally ブロックに似た記述をする
Class_Terminate で、エラーが発生する可能性のある処理は行わないでください。
参考
参考
通常、Class_Terminate が呼ばれたら、オブジェクトは削除されたことになりますが、
厳密には、オブジェクトはメモリ上に存在し、オブジェクトを参照することはできます。
これは同時に複数のオブジェクトが削除されたときに、それぞれの Class_Terminate
が呼ばれるのですが、すでに Class_Terminate が呼ばれたオブジェクトを、別の
Class_Terminate から参照することができるところから分かります。
オブジェクト
変数 A
変数 B
Set A = new ClassA '// ClassA のオブジェクトを生成
Set B = A
A = Empty
変数 B
オブジェクト
B = Empty '// Class_Terminate が呼ばれる
上記は、変数に Empty を代入することで、オブジェクトを参照しなくなっていますが、
Empty 以外の値や、別のオブジェクトを参照するようになっても参照しなくなります。
関数の中のローカル変数であれば、関数から返っても参照しなくなります。
関連
相互参照しているオブジェクトは、参照されなくなってもプログラム終了時まで
残り続けます。
←
▼
▲
Option Explicit
Class ClassA
Public Name
Public Ref
Public Del
Private Sub Class_Terminate()
If not IsEmpty( Del ) Then _
WScript.Echo Name + "::Class_Terminate .Del = Empty" : Del = Empty
WScript.Echo Name + "::Class_Terminate"
End Sub
End Class
'// グローバルでは、生成した順番で Class_Terminate が呼ばれます。
Dim g
Dim a : Set a = new ClassA : a.Name = "a"
Dim b : Set b = new ClassA : b.Name = "b"
If 0 Then Set a.Ref = b
If 0 Then Set b.Ref = a
'// グローバルのオブジェクトに参照関係があっても、
'// Class_Terminate が呼び出される順序に影響しません。
main
Sub main()
'// ローカルでは、生成した順番と逆に Class_Terminate が呼ばれます。
Dim c : Set c = new ClassA : c.Name = "c"
Dim d : Set d = new ClassA : d.Name = "d"
Dim e : Set e = new ClassA : e.Name = "e"
If 0 Then Set c.Ref = d '// c, d の順で呼ばれるようになります
If 0 Then Set a.Ref = e '// a, e の順で呼ばれるようになります
Set g = new ClassA : g.Name = "g" '// b の後で呼ばれます
Set a.Del = new ClassA : a.Del.Name = "a.Del" '// 後で呼ばれます
Set e.Del = new ClassA : e.Del.Name = "e.Del" '// 即時呼ばれます
If 0 Then
WScript.Quit 4 '// c,d,e の Class_Terminate は呼ばれません。
'// ただし、a.Ref = e を実行したら e の
'// Class_Terminate は、a の後に呼ばれます。
Else
unknown_symbol_error
End If
End Sub
グローバルの変数に格納したオブジェクトは、格納した順番で Class_Terminate が呼ばれます。
ローカルの変数に格納したオブジェクトは、格納した順番と逆に Class_Terminate が呼ばれます。
A から B を参照している(A のプロパティで B を参照している)場合、A、B の順に
Class_Terminate が呼ばれます。 ただし、グローバルのオブジェクト同士に参照関係があっても
無くても、呼び出される順番は変わりません。
検証コード
Class_Terminate の中で、オブジェクトの参照カウントをゼロにした場合も、参照関係と同様に、
ローカルでは即時呼ばれますが、グローバルでは後で呼ばれます。
デバッガで Class_Terminate の中でブレークしたときに、コールスタックを見ると、削除される
ローカルオブジェクトが所属する関数ではなく、その関数を呼び出している関数から、
Class_Terminate が呼ばれるように見えます。
関連
←
▼
▲
Case1
Case2
WScript.echo "End of Main"
WScript.echo "もし、ここ以降でデストラクターが動くときは、"+_
"プログラム終了時にすべてのオブジェクトを削除する"+_
"ことによるデストラクター呼び出しです。"
Sub Case1()
WScript.echo "Case1:"
Set a_object = new A_Class
Set b_object = new B_Class
Set a_object.Reference = b_object
End Sub
Sub Case2()
WScript.echo "Case2:"
Set a_object = new A_Class
Set b_object = new B_Class
Set a_object.Reference = b_object
Set b_object.Reference = a_object
End Sub
Class A_Class
Public Reference
Private Sub Class_Terminate()
WScript.echo "A_Class::Class_Terminate"
End Sub
End Class
Class B_Class
Public Reference
Private Sub Class_Terminate()
WScript.echo "B_Class::Class_Terminate"
End Sub
End Class
検証コード
相互参照していると、関数内のローカル・オブジェクト同士であっても、Class_Terminate は
呼ばれません。 プログラム終了時に呼ばれます。
Case1:
Case1: A_Class::Class_Terminate
Case1: B_Class::Class_Terminate
Case2:
End of Main
もし、ここ以降でデストラクターが動くときは、プログラム終了時にすべての
オブジェクトを削除することによるデストラクター呼び出しです。
Case2: A_Class::Class_Terminate
Case2: B_Class::Class_Terminate
表示例:
参考
→ ガーベージコレクション (GC)
A
B
A, B とも、被参照(矢印の先)の数が2つずつ
を使うと、関数から返るときに Class_Terminate が呼ばれ
のキーや配列番号で参照することで、Class_Terminate が呼ばれなくなる状況を回避
することができます。
辞書のキーや配列番号
B
A
オブジェクトの Set
や
るようにできます。