←
▼
▲
Function IsTimeOnlyDate( aDateTime as Date ) as boolean
Date 型の値が、日付指定のない時刻だけの値であるかどうかを返します。
サンプル:
IsTimeOnlyDate( CDate("2009/1/1") ) = False
IsTimeOnlyDate( CDate("13:00") ) = True
(src)
←
▼
▲
Function DateAddStr( BaseDate as Date, Plus as string ) as Date
日付時刻の加減算をします。
d = DateAddStr( CDate("2009/1/1"), "+1month 10days" ) '// d = CDate("2009/2/11")
t = DateAddStr( CDate("17:00"), "-8hours" ) '// t = CDate("9:00")
t = DateAddStr( CDate("10:00"), "+1hours -5min" ) '// t = CDate("10:55")
t = DateAddStr( CDate("10:00"), "-1hours -5min" ) '// t = CDate("8:55")
t = DateAddStr( CDate("10:00"), "-1hours 5min" ) '// t = CDate("8:55")
t = DateAddStr( CDate("10:00"), "-1hours +5min" ) '// t = CDate("9:05")
t = DateAddStr( CDate("10:00"), "+2:30" ) '// t = CDate("12:30")
t = DateAddStr( CDate("10:00"), "-2:30" ) '// t = CDate("7:30")
(src)
Plus 引数
先頭は、"+" か "-" を指定します。 先頭の "+" か "-" を省略すると "+" になります。
先頭以外の "+" か "-" を省略すると、それまでの "+" か "-" を引き継ぎます。
時分は、00:00 形式で指定できます。
単位に指定できるキーワードは次のものがあります。
"year", "years", "month", "months", "day", "days"
"hour", "hours", "minute", "minutes", "min", "second", "seconds", "sec"
関連
→ 時間の加減算 (clib)
→ T_Date.vbs # main
テスト
サンプル
サンプル
echo "日時の例:2008/06/11, 14:28:01, -1day, -2hours"
echo "Enter のみ:"+ limit_str_default
limit_str = Input( "日時 >" )
If limit_str = "" Then limit_str = limit_str_default
Select Case Left( limit_str, 1 )
Case "+", "-" : limit = DateAddStr( Now(), limit_str )
Case Else : limit = CDate( limit_str )
End Select
日時でも、差分(1日前など)でもできる入力
←
▼
▲
Function W3CDTF( SourceTimeDate as Date or string ) as string or Date
日時を文字列(W3C-DTF)に変換します。 または、その逆変換をします。
(src)
サンプル
→ T_Date.vbs # W3CDTF
テスト
W3CDTF( CDate( "2001/2/2 1:15" ) ) = "2001-02-02T01:15:00+09:00"
W3CDTF( "2001-02-02T01:15:00+09:00" ) = CDate( "2001/02/02 1:15:00" )
W3CDTF( "2001-02-02T00:00:00Z" ) = CDate( "2001/02/12 9:00" )
日本(UTC+9時間)の場合
0000
0000-00
0000-00-00
0000-00-00T00:00+00:00
0000-00-00T00:00:00+00:00
0000-00-00T00:00:00.0+00:00
YYYY-MM-DDThh:mm:ss.sTZD
YYYY-MM-DDThh:mm:ssTZD
YYYY-MM-DDThh:mmTZD
YYYY-MM-DD
YYYY-MM
YYYY
年月日時分秒が 1桁のときは 01 のように 0 をつけること。
年は4桁。小数部は何桁でもよい。
時刻(hh:mm:ss)は、現地の時刻を記述する。
XML などで国際的に使える日時の表記法。 タイムゾーンを考慮している。
ISO 8601:1988 に基づく。 XML Schema の dateTime 型より厳密で単純。
W3Cの標準仕様ではない。
は、"Z", "+00:00", "-00:00" のいずれか。
←
▼
▲
Function ConvertTimeZone( DateTime as Date or string, FromTZD as string, ToTZD as string )
as Date or string
タイムゾーンを変更した時刻を返します。
【引数】
DateTime
FromTZD
変更前の時刻。 Date 型、または W3C-DTF 形式の文字列
変更前のタイムゾーン、または Empty
ToTZD
変更後のタイムゾーン、または Empty
(src)
変更後の時刻。 DateTime 引数と同じ型(Date型または文字列)
返り値
サンプル
ConvertTimeZone( "2002-02-02T11:02:02+09:00", "+09:00", "Z" ) = "2002-02-02T02:02:02Z"
ConvertTimeZone( CDate("2:02"), "Z", "+9:00" ) = CDate("11:02")
→ T_Date.vbs # ConvertTimeZone
テスト
DateTime に W3C-DTF を指定するときは、FromTZD は Empty または、DateTime に指定した
タイムゾーンと同じタイムゾーンを指定できます。
DateTime に Date 型を指定するときに、FromTZD を Empty にすると、現在 OS に設定されている
タイムゾーンを指定したことと同じになります。
ToTZD に Empty にすると、現在 OS に設定されているタイムゾーンを指定したことと同じになります。
←
▼
▲
Function TimeZoneDesignator( MinuteBias as integer ) as string
W3C-DTF のタイムゾーンの部分の文字列を返します。
【引数】
MinuteBias
時差。単位は分。 Empty = OS に設定されているタイムゾーン
W3C-DTF のタイムゾーンの部分
返り値
(src)
サンプル
TimeZoneDesignator( 540 ) = "+09:00"
TimeZoneDesignator( Empty ) = "+09:00" '// 日本の場合
→ T_Date.vbs # TimeZoneDesignator
テスト
←
▼
▲
Function MinusTZD( MinuteBias as integer ) as string
W3C-DTF のタイムゾーンの部分の文字列をマイナスにして返します。
【引数】
MinuteBias
時差。単位は分。 Empty = OS に設定されているタイムゾーン
W3C-DTF のタイムゾーンの部分のマイナス
返り値
サンプル
MinusTZD( 540 ) = "-09:00"
MinusTZD( Empty ) = "-09:00" '// 日本の場合
→ T_Date.vbs # MinusTZD
テスト
(src)
←
▼
▲
Sub BenchStart()
全体の処理時間の計測を開始します。
ファイル:
vbslib.vbs
BenchStart
For Each x In Items
Bench 1
'// セクション1の計測区間
Bench 2
'// セクション2の計測区間
Bench 0
Next
BenchEnd
Pause
サンプル
Benchmark Result:
Sampling Count = 1401
Max is Section 2
Section 1: 3times 0.032(sec)
Section 2: 3times 0.102(sec)
計測結果の表示例
テスト
→ T_Date.vbs # T_Bench
(src)
←
▼
▲
Sub Bench( SectionNum as integer )
セクション(全体の中の一部の区間)の処理時間の計測を開始します。
参考
【引数】
SectionNum
セクションの識別番号
計測するセクションの開始位置に、SectionNum に1以上の値を指定して、Bench を呼び出してください。
計測するセクションの終了位置に、SectionNum に0を指定して、Bench を呼び出してください。
計測するセクションの終了位置が、次のセクションの開始位置であるときは、SectionNum に0を指定
しなくても、次のセクションの識別番号を指定できます。
ファイル:
vbslib.vbs
(src)
←
▼
▲
参考
Sub BenchEnd()
全体の処理時間の計測を終了し、計測結果を表示します。
ファイル:
vbslib.vbs
(src)
←
▼
▲
Set vars = CreateObject( "Scripting.Dictionary" )
vars.Item( "a" ) = 2
Assert CalculateVariables( "a + 3", vars ) = 5
Function CalculateVariables( Formula as string, Variables as dictionary ) as variant
文字列で表現された計算式を計算します。
【引数】
Formula
Variables
計算式。 VBScript の文法で表現したもの
計算式で使える変数の集合
返り値
計算結果
ファイル:
vbslib.vbs
関連
テスト
"a + 3"
サンプル
(src)
計算式に、Variables 引数に指定した変数を使うことができます。
変数の値は、数値だけでなく、文字列やオブジェクトも指定できます。
→ T_Calc.vbs # [T_Calc]
変数の値が文字列型であっても、数値として計算します。
変数の値が他の変数の参照にすることもできます。
Set vars = CreateObject( "Scripting.Dictionary" )
vars.Item( "a" ) = 2
vars.Item( "b" ) = "3"
vars.Item( "c" ) = "b"
Assert CalculateVariables( "a + b + c", vars ) = 8
←
▼
▲
Set pos = new NestPos
'// pos.PosArr = Array( 0 )
pos.Start '// pos.PosArr = Array( 1, 0 )
pos.End_ '// pos.PosArr = Array( 1 )
pos.Start '// pos.PosArr = Array( 2, 0 )
pos.Start '// pos.PosArr = Array( 2, 1, 0 )
pos.End_ '// pos.PosArr = Array( 2, 1 )
pos.End_ '// pos.PosArr = Array( 2 )
処理順序におけるネスト(入れ子)の位置をカウント・アップします。
Dim NestPos::PosArr as Array of integer
.PosArr
.Start
Sub NestPos::Start()
.End_
Sub NestPos::End_()
現在のネストの位置。
配列番号は、ネストの深さに対応します。
ブロックの開始。
カウント・アップして、配列の要素を1つ増やします。
ブロックの終了。
配列の要素を1つ減らします。
(src)
←
▼
▲
LetSet
Sub LetSet( Out as variant, In_ as variant )
In_ がオブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
(src)
If IsObject( In_ ) Then Set Out = In_ Else Out = In_
一般に、LetSet を呼び出すより、上記のコードを記述した方が高速ですが、
In_ に関数や Dictionary::Item などの重い処理を記述するときは、その重い処理を
2度実行させないLetSet の方が高速です。
実装:
サンプル:
LetSet v, dic("name") '//[out] v
←
▼
▲
Function get_Object( Name as string ) as Object
静的オブジェクト (または演算器的なオブジェクト) を取得します。
【引数】
Name
取得するオブジェクトのクラス名
返り値
オブジェクト
サンプル:
関連
Dim name : name = "ClassA"
Dim obj : Set obj = get_Object( name )
Dim g_ClassA
Function get_ClassA() '// has_interface_of ClassI
If IsEmpty( g_ClassA ) Then _
Set g_ClassA = new ClassA : ErrCheck
Set get_ClassA = g_ClassA
End Function
get_Object は、機能的には、"get_" + Name の関数を呼び出すだけなので、
別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、get_ClassA の関数が呼ばれます。
ClassI
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
(src)
Name が変数ではないときは、直接 get_ClassA を呼び出すことができます。
Dim obj : Set obj = get_ClassA()
new でオブジェクトを生成すると、get_ClassA で取得できるオブジェクトと別の
インスタンスになります。
Name が動的に変わることがないときは、get_ClassA 関数を直接呼び出して
ください。
→ T_GetObject.vbs [T_IncludeObjs1]
テスト
静的オブジェクトが無ければ、エラーになります。
←
▼
▲
Function get_ObjectFromFile( ModulePath as string, Name as string ) as Object
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
【引数】
ModulePath
Name
スクリプトファイルのパス
取得するオブジェクトのクラス名
返り値
取得したオブジェクト
Dim m : Set m = get_ObjectFromFile( "Lib\SampleLib.vbs", "Sample" )
サンプル: SampleLib.vbs ファイルで定義されている Sample オブジェクトを取得する。
上記サンプルは、下記と同じです。
include "Lib\SampleLib.vbs"
Dim m : Set m = get_Sample()
オブジェクトを取得する部分は、機能的には、"get_" + Name の関数を呼び出すだけなので、
スクリプトファイルの中で、別途関数を定義する必要があります。 参考
(src)
→ T_GetObject.vbs get_ObjectFromFile [T_NewModule]
テスト
←
▼
▲
(src)
Sub get_ObjectsFromFile( GetFuncs as string or Array of Function,
InterfaceName as string, out_Objs as Array of Object )
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
【引数】
GetFuncs
InterfaceName
スクリプトのパス、または include_objs の out_GetFuncs
Empty または、取得するオブジェクトが持つインターフェース
out_Objs
取得したオブジェクトの配列
get_ObjectsFromFile "Lib\*_obj.vbs", "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードと同時に、静的オブジェクトを取得する
include_objs "Lib\*_obj.vbs", Empty, m_CreateFuncs '// [out] m_CreateFuncs
get_ObjectsFromFile m_CreateFuncs, "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードした後で、静的オブジェクトを取得する(ファイルを走査しない)
Sub get_StaticObjects( InterfaceName, out_Obj )
If IsEmpty( InterfaceName ) or InterfaceName = "ClassI" Then
Set out_Obj = get_ClassA()
ElseIf InterfaceName = "ClassI2" Then
out_Obj = Array( get_ClassA(), get_ClassB() )
End If
End Sub
静的オブジェクトを一覧できるようにするには、それぞれのスクリプトで、get_StaticObjects
関数を定義する必要があります。 get_ObjectsFromFile や include_objs は、別のスクリプト
ファイルであれば、同じ関数名でも異なる関数インスタンスになります。
参考
→ T_GetObject.vbs [T_IncludeObjs2] [T_IncludeObjs3]
テスト
←
▼
▲
Sub include_objs( Wildcard as string, Flags as Empty, out_GetFuncs as Array of Funcion )
静的オブジェクト・スクリプトファイルをインクルードします。
【引数】
Wildcard
Flags
スクリプトファイルのパス、またはフォルダパス
Empty を指定してください
out_GetFuncs
Empty、または、静的オブジェクトを取得する関数の集合
out_CreateFuncs が Empty ではないときのサンプル
include_objs は、インクルードのみ行います。 オブジェクトの生成は、new で生成するか、
get_ObjectsFromFile で行います。
(src)
サンプル: Lib フォルダをインクルードして、その中で定義された ClassA オブジェクトを生成する。
include_objs "Lib\*_obj.vbs", Empty, Empty
Set obj : Set obj = new ClassA : ErrCheck
→ new_X_array
Flags = Empty かつ out_GetFuncs = Empty なら、include で代用できます。
関連
out_GetFuncs は、静的オブジェクトを取得する関数の集合です。 get_ObjectsFromFile の第1引数
に渡すと、文字列を渡したときより高速に処理します。
→ T_GetObject.vbs [T_IncludeObjs1c]
テスト
→ T_GetObject.vbs [T_IncludeObjs3]
→ T_GetObject.vbs [T_IncludeObjsMulti]
→ T_GetObject.vbs [T_IncludeObjsMulti_NoWild]
→ T_GetObject.vbs [T_IncludeObjsEmptyArray]
←
▼
▲
Sub get_DefineInfoObject( in_out_Object as DefineInfoClass, FullPath as string )
単純な DefineInfo オブジェクトを生成します。
参考
DefineInfo オブジェクトに FullPath プロパティしか必要ないときのみ使えます。
他のプロパティがあるときは、
(src)
Dim g_SrcPath
If IsEmpty( g_SrcPath ) Then MsgBox "This is vbslib object file." : WScript.Quit
Dim g_Sample_vbs : get_DefineInfoObject g_Sample_vbs, g_SrcPath
'// g_Sample_vbs.FullPath
サンプル:
←
▼
▲
Function get_NameDelegator( Name as string, TrueName as string,
InterfaceName as string ) as InterfaceName_Delegator
指定のインターフェースを持った、正式名オブジェクトに委譲する、静的な一般名オブジェクトを取得します。
【引数】
Name
TrueName
一般名。 取得するオブジェクトの Name プロパティ
正式名。 取得するオブジェクトの委譲先 (*1)
InterfaceName
一般名オブジェクトと正式名〜が共通に持つ、インターフェースの名前 (*2)
(src)
一般名オブジェクト (*3)
返り値
(*2)
(*3)
Name と TrueName の組み合わせが初めてのときは、get_NameDelegator の内部で、
new_(InterfaceName)_Delegator 関数を呼び出して、オブジェクトを生成します。
返り値となるオブジェクトにアクセスすると、Name プロパティとオブジェクトの実体の違いを除けば、
正式名オブジェクトにアクセスします。
(ここでは一般名オブジェクト)を生成することができる、new_(InterfaceName)_Delegator
関数が定義されていること。 参考:new_X
と、(InterfaceName) インターフェースを持ったインスタンス
Class NameDelegator '// defined_as_interface
Public Name
Public Property Get TrueName() : TrueName = NameDelegator_getTrueName( Me ) : End Property
Public m_Delegate ' as ClassA or ClassB or string(before validated)
Public Property Get DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
End Class
Const F_ValidateOnlyDelegate = &h40000000
Dim g_bNeedValidateDelegate
Function NameDelegator_getTrueName( m )
Sub NameDelegator_validate( m, Flags )
Function NameDelegator_getXML( m )
DefineInfo プロパティは、オプションです。
Public Property Get DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
テスト
→ T_NameDelegator_vbslib フォルダ
参照
場面Aの関数
Name 以外は
参照
場面Aでの Name
場面Bでの Name
ある1つのインスタンス
TrueName
(正式名)
ClassI_Delegator クラス
(一般名)
場面Bの関数
ClassI
ClassI
ClassB
ClassI
ClassA
Name = "ClassN", TrueName = "ClassA"
Name = "ClassN", TrueName = "ClassB"
一般名で選択
参照
一般名と正式名の関係は、1対多、または、多対1があります。
(*1)
(InterfaceName) インターフェースを持った、静的な正式名オブジェクトを取得することができる
get_(TrueName) 関数が定義されていること。 参考:get_Object
get_NameDelegator 関数は、
ものです。 get_NameDelegator 関数は、get_(一般名) 関数の内部からのみ呼ばれるようにしてください。
の内部で呼ばれる get_(一般名) 関数の実装を支援する
サンプル:
Function get_GeneralObject()
Set get_GeneralObject = get_NameDelegator( "GeneralObject", "TrueName", "InterfaceName" )
End Function
Function get_TrueName() : ... : End Function
Function new_InterfaceName_Delegator() : ... : End Function
返り値となる一般名オブジェクトは、Name プロパティと委譲元となるオブジェクトの実体の違いを除けば、
同じ1つの正式名オブジェクトとして扱うことができます。 参考: 下記の図の「ある1つのインスタンス」
←
▼
▲
(src)
Sub new_ObjectFromStream( out_Obj as object, ClassName as string, Stream as variant )
ストリームから、オブジェクトを1つ生成します。
【引数】
out_Obj
ClassName
(出力) ストリームから生成した1つのオブジェクト、または Empty
生成するオブジェクトのクラス名 (下記)
Stream
XML ストリーム (下記)
ClassName 引数
XML のタグ名がクラス名に対応します。
XML のタグの中の属性まで一致するデータを元にオブジェクトを生成するときは、
XPath と同様に下記のようにします。
Set xml = LoadXML( "Sample.xml", Empty )
new_ObjectFromStream obj, "ClassA[@attr='value']", xml
参考
→ XPath の [@name='value'] (属性の値)
<Root><ClassA attr="value" ... /></Root>
VBScript コード
XMLデータ
Stream 引数
の引数に指定できるものを指定できます。
new_X に対応した関数の準備
内部で、new_X を呼び出しています。 new_X を使うのに必要な関数を用意する必要が
あります。 たとえば、ABC クラスなら、new_ABC 関数が必要です。
参考
テスト
→ T_ObjectFromStream フォルダ