SAK 図書館
VB テクニック編20 - 数値チェック、文字チェック、日付チェック、時間チェック
■SAK 関数利用規程
・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
・著作権明示部分の改編は認めない。
・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
プログラムを開発することは自由です。
・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
その他有償プロダクトとして配布・販売するには、私の許可が必要です。
(無償のフリーソフトウェアなら、自由に配布しても良い。)
・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
賠償しません。
■数値入力チェック
・数値入力のチェックは、次のようにする。
(数字チェック、全角判別、入力項目チェック、桁数チェック、数字入力、入力制限)
全角で入力されても半角に自動変換される。
最大 6 桁、ゼロサプレス、カンマ編集, 省略値 0、ゼロ OK、マイナス不可。
if ChkVal(text1, "###,##0", "0", OK_ZERO, NO_MINS) = false then
msgbox "数値でないか、桁オーバ、マイナスデータ"
end if
・最大 6 桁、ゼロ埋め, 省略値 000001、ゼロ不可、マイナス不可。
(必須項目チェック)
if ChkVal(text1, "000000", "000001", NO_ZERO, NO_MINS) = false then
msgbox "数値でないか、桁オーバ、ゼロ、マイナスデータ"
end if
■文字入力チェック
・入力文字チェックは、次のようにする。
(全角チェック、半角チェック、英数字チェック、全角判別)
全角で入力されても半角指定の場合は、自動的に半角変換される。
最大 6 桁、省略値 ""、半角英数字のみ、未入力 OK。
ここで言う 6 桁とは、半角を 1 桁、全角を 2 桁とします。
(バイト数チェックによる、バイト長による制限)
(バイトチェック、byte 数チェック、byte チェック、バイト数制限)
(バイト制限、byte 数制限、byte 制限、文字数チェック、文字チェック)
(文字数制限、文字制限、文字列チェック、文字列制限、バイト計算)
(byte 計算、文字数計算、半角区別)
if ChkStr(text1, 6, NO_DEF, HAN_UP, STYPE_HAN_A, OK_NULL) = false then
msgbox "桁オーバ、半角英数字でない"
end if
・最大 6 桁、省略値 "abc"、半角のみ、未入力不可。
(必須項目チェック)
if ChkStr(text1, 6, "abc", HAN_LOW, STYPE_HAN, NO_NULL) = false then
msgbox "桁オーバ、半角でない、未入力"
end if
・最大 6 桁、省略値 ""、未入力 OK。
if ChkStr(text1, 6, NO_DEF, HAN_NO, STYPE_NO, OK_NULL) = false then
msgbox "桁オーバ"
end if
■フォーマット入力チェック
・フォーマット入力のチェックは、次のようにする。
全角で入力されても半角指定の場合は、自動的に半角変換される。
000001-001 形式入力、省略値 ""、半角のみ、ゼロ不可。
00001001、1-1、1.1、1/1、1 1 などの入力が可能。
if ChkFormat(text1, "000000-000", NO_DEF, HAN_HAN, NO_ZERO, NO_ZERO, NO_ZERO, NO_ZERO) = false then
msgbox "桁オーバ、半角でない、ゼロ"
end if
・@@@@@@-001 形式入力、省略値 ""、半角大文字のみ、ゼロ不可。
abcdef001、abc-1、abc.1、abc/1、abc 1 などの入力が可能。
if ChkFormat(text1, "@@@@@@@-000", NO_DEF, HAN_UP, NO_ZERO, NO_ZERO, NO_ZERO, NO_ZERO) = false then
msgbox "桁オーバ、半角でない、ゼロ"
end if
■日付入力チェック
・日付入力のチェックは、次のようにする。
全角で入力されても半角に自動変換される。
29 〜 31 日の入力で、月末日オーバは自動調整される。
20011001、2001.10.1、2001/10/1、2001-10-1、2001 10 1 1/1/1 などの
入力が可能。
尚、日付関係のチェック関数には、
VB テクニック編5 - カレンダー計算、通算日、月末日、うるう年、曜日
の CalcDate 関数が必要である。
if ChkDate(text1, NO_DEF, NO_NULL, OK_SHORT) = false then
msgbox "日付でない、未入力"
end if
■時間入力チェック
・時間入力のチェックは、次のようにする。
全角で入力されても半角に自動変換される。
190100、19:1:0、19/1/0、19-1-0、19 1 0 などの入力が可能。
if ChkTime(text1, NO_DEF, NO_NULL) = false then
msgbox "時間でない、未入力"
end if
■データ入力チェック関数
'** 半角変換定数宣言
Public Const HAN_HAN = 0
Public Const HAN_LOW = 1
Public Const HAN_UP = 2
Public Const HAN_NO = 9
'** 文字タイプ定数宣言
Public Const STYPE_NO = 0
Public Const STYPE_HAN_A = 1
Public Const STYPE_HAN = 2
Public Const STYPE_ZEN = 3
'** チェック定数宣言
Public Const NO_DEF = ""
Public Const OK_ZERO = False
Public Const NO_ZERO = True
Public Const OK_MINS = False
Public Const NO_MINS = True
Public Const OK_NULL = False
Public Const NO_NULL = True
Public Const OK_SHORT = True
Public Const NO_SHORT = False
Public Const LOW_CASE = True
Public Const NO_CASE = False
'=======================================================================
' 数値チェック(テキストコントロール)
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' ft = フォーマット
' "000000000"
' "########0"
' "########0.00"
' "###,###,##0"
' "###,###,##0.00"
' def = デフォルト
' NO_DEF = デフォルトなし
' zr = ゼロチェック
' NO_ZERO = ゼロは許さない
' OK_ZERO = チェックしない
' ms = マイナスチェック
' NO_MINS = マイナスは許さない
' OK_MINS = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = 数値でない
'【処理】
' ・テキストコントロールの内容が数値なら、ft に従ってフォーマットする。
' ・ft が "" のときはフォーマットしない。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkVal() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkVal(ctl As Variant, ft As String, def As Variant, zr As Boolean, ms As Boolean) As Boolean
Dim dt As Double
Dim s As String
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** 数値チェック
On Local Error Resume Next
Err = 0
dt = ctl.Text
If Err <> 0 Then
s = ctl.Text
Else
s = LTrim(Str(dt))
End If
On Local Error GoTo 0
ChkVal = ChkVals(s, ft, zr, ms)
ctl.Text = s
End Function
'=======================================================================
' 文字列チェック(テキストコントロール)
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' ft = フォーマット(フォーマット文字列、または、最大バイト数。)
' "@@@@@@@@@"
' 最大バイト数
' def = デフォルト
' NO_DEF = デフォルトなし
' han = 半角変換モード
' HAN_HAN = 半角にする
' HAN_LOW = 小文字半角にする
' HAN_UP = 大文字半角にする
' HAN_NO = 半角変換しない
' stype = 文字タイプ
' STYPE_NO = チッェクしない
' STYPE_HAN_A = 半角英数字でなければエラー
' STYPE_HAN = 半角でなければエラー
' STYPE_ZEN = 全角でなければエラー
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・テキストコントロールの内容を、ft に従ってフォーマットする。
' ・ft が "" のときはフォーマットしない。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkStr() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkStr(ctl As Variant, ft As Variant, def As Variant, han As Integer, stype As Integer, nu As Boolean) As Boolean
Dim s As String
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** 文字列チェック
s = ctl.Text
ChkStr = ChkStrs(s, ft, han, stype, nu)
ctl.Text = s
End Function
'=======================================================================
' フォーマットチェック(テキストコントロール)
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' ft = フォーマット(4 項目まで。1 項目の定義に "0" と "@" が混在し
' てはならない。"0" = 数字、"@" = 文字。)
' "0000-000000-000"
' "@@@@@@@@@-00"
' "@@@@@@@@@-@@-@@-@@"
' def = デフォルト
' NO_DEF = デフォルトなし
' han = 半角変換モード
' HAN_HAN = 半角にする
' HAN_LOW = 小文字半角にする
' HAN_UP = 大文字半角にする
' z1 = ゼロチェック 1 項目
' NO_ZERO = ゼロは許さない
' OK_ZERO = チェックしない
' z2 = ゼロチェック 2 項目
' z3 = ゼロチェック 3 項目
' z4 = ゼロチェック 4 項目
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・テキストコントロールの内容を、ft に従ってフォーマットする。
' 但し、最大 4 項目のフォーマットしか出来ない。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkFormat() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkFormat(ctl As Variant, ft As String, def As Variant, han As Integer, z1 As Boolean, z2 As Boolean, z3 As Boolean, z4 As Boolean) As Boolean
Dim s As String
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = ctl.Text
ChkFormat = ChkFormats(s, ft, han, z1, z2, z3, z4)
ctl.Text = s
End Function
'=======================================================================
' 日付チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
' short = 西暦年上 2 桁省略入力
' OK_SHORT = 2 桁 → 4 桁変換する
' NO_SHORT = なにもしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・日付フォーマットをする。
' ・入力が省略されているときは、def をセットします。
' ・short が TRUE のとき、99 年までの 2 桁入力がされると、西暦 4 桁年に
' 変換します。
'【著作権】
' ChkDate() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkDate(ctl As Variant, def As Variant, nu As Boolean, short As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
Dim days As Long
Dim yb As Integer
Dim ybnm As String
Dim ybjp As String
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = ctl.Text
rcd = ChkFormats(s, "0000.00.00", HAN_HAN, True, True, True, True)
ctl.Text = s
If nu = False And s = "" Then
ChkDate = True
Exit Function
End If
If rcd = False Then
ChkDate = rcd
Exit Function
End If
'** エラーセット
ChkDate = False
'** 年 2 桁処理
If short Then
a = Left(s, 4)
If a < "0100" Then
If a < "0050" Then
Mid(s, 1, 2) = "20"
Else
Mid(s, 1, 2) = "19"
End If
End If
End If
'** 日付チェック
If Left(s, 4) < "0001" Then Exit Function
a = Mid(s, 6, 2)
If a < "01" Or a > "12" Then Exit Function
a = Right(s, 2)
If a < "01" Or a > "31" Then Exit Function
'** 月末日調整
days = CalcDate(s, yb, ybnm, ybjp)
ctl.Text = s
'** 正常セット
ChkDate = True
End Function
'=======================================================================
' 年月チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
' short = 西暦年上 2 桁省略入力
' OK_SHORT = 2 桁 → 4 桁変換する
' NO_SHORT = なにもしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・年月フォーマットをする。
' ・入力が省略されているときは、def をセットします。
' ・short が TRUE のとき、99 年までの 2 桁入力がされると、西暦 4 桁年に
' 変換します。
'【著作権】
' ChkYYMM() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkYYMM(ctl As Variant, def As Variant, nu As Boolean, short As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = ctl.Text
rcd = ChkFormats(s, "0000.00", HAN_HAN, True, True, True, True)
ctl.Text = s
If nu = False And s = "" Then
ChkYYMM = True
Exit Function
End If
If rcd = False Then
ChkYYMM = rcd
Exit Function
End If
'** エラーセット
ChkYYMM = False
'** 年 2 桁処理
If short Then
a = Left(s, 4)
If a < "0100" Then
If a < "0050" Then
Mid(s, 1, 2) = "20"
Else
Mid(s, 1, 2) = "19"
End If
End If
End If
'** 日付チェック
If Left(s, 4) < "0001" Then Exit Function
a = Right(s, 2)
If a < "01" Or a > "12" Then Exit Function
ctl.Text = s
'** 正常セット
ChkYYMM = True
End Function
'=======================================================================
' 月日チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・月日フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkMMDD() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkMMDD(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
Dim days As Long
Dim yb As Integer
Dim ybnm As String
Dim ybjp As String
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = ctl.Text
rcd = ChkFormats(s, "00.00", HAN_HAN, True, True, True, True)
ctl.Text = s
If nu = False And s = "" Then
ChkMMDD = True
Exit Function
End If
If rcd = False Then
ChkMMDD = rcd
Exit Function
End If
'** エラーセット
ChkMMDD = False
'** 日付チェック
a = Left(s, 2)
If a < "01" Or a > "12" Then Exit Function
a = Right(s, 2)
If a < "01" Or a > "31" Then Exit Function
'** 月末日調整
s = "0001." + s
days = CalcDate(s, yb, ybnm, ybjp)
ctl.Text = Right(s, 5)
'** 正常セット
ChkMMDD = True
End Function
'=======================================================================
' 年チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
' short = 西暦年上 2 桁省略入力
' OK_SHORT = 2 桁 → 4 桁変換する
' NO_SHORT = なにもしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・年フォーマットをする。
' ・入力が省略されているときは、def をセットします。
' ・short が TRUE のとき、99 年までの 2 桁入力がされると、西暦 4 桁年に
' 変換します。
'【著作権】
' ChkYY() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkYY(ctl As Variant, def As Variant, nu As Boolean, short As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkYY = True
Exit Function
End If
rcd = ChkVals(s, "0000", True, True)
ctl.Text = s
If rcd = False Then
ChkYY = rcd
Exit Function
End If
'** エラーセット
ChkYY = False
'** 年 2 桁処理
If short Then
If s < "0100" Then
If s < "0050" Then
Mid(s, 1, 2) = "20"
Else
Mid(s, 1, 2) = "19"
End If
End If
End If
'** 日付チェック
If s < "0001" Then Exit Function
ctl.Text = s
'** 正常セット
ChkYY = True
End Function
'=======================================================================
' 月チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・月フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkMM() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkMM(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkMM = True
Exit Function
End If
rcd = ChkVals(s, "00", True, True)
ctl.Text = s
If rcd = False Then
ChkMM = rcd
Exit Function
End If
'** エラーセット
ChkMM = False
'** 日付チェック
If s < "01" Or s > "12" Then Exit Function
'** 正常セット
ChkMM = True
End Function
'=======================================================================
' 日チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・日フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkDD() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkDD(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkDD = True
Exit Function
End If
rcd = ChkVals(s, "00", True, True)
ctl.Text = s
If rcd = False Then
ChkDD = rcd
Exit Function
End If
'** エラーセット
ChkDD = False
'** 日付チェック
If s < "01" Or s > "31" Then Exit Function
'** 正常セット
ChkDD = True
End Function
'=======================================================================
' 時間チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・時間フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkTime() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkTime(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkTime = True
Exit Function
End If
rcd = ChkFormats(s, "00:00:00", HAN_HAN, False, False, False, False)
ctl.Text = s
If rcd = False Then
ChkTime = rcd
Exit Function
End If
'** エラーセット
ChkTime = False
'** 時間チェック
a = Left(s, 2)
If a < "00" Or a > "23" Then Exit Function
a = Mid(s, 4, 2)
If a < "00" Or a > "59" Then Exit Function
a = Right(s, 2)
If a < "00" Or a > "59" Then Exit Function
'** 正常セット
ChkTime = True
End Function
'=======================================================================
' 時分チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・時分フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkHHMN() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkHHMN(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkHHMN = True
Exit Function
End If
rcd = ChkFormats(s, "00:00", HAN_HAN, False, False, False, False)
ctl.Text = s
If rcd = False Then
ChkHHMN = rcd
Exit Function
End If
'** エラーセット
ChkHHMN = False
'** 時分チェック
a = Left(s, 2)
If a < "00" Or a > "23" Then Exit Function
a = Right(s, 2)
If a < "00" Or a > "59" Then Exit Function
'** 正常セット
ChkHHMN = True
End Function
'=======================================================================
' 分秒チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・分秒フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkMNSC() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkMNSC(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkMNSC = True
Exit Function
End If
rcd = ChkFormats(s, "00.00", HAN_HAN, False, False, False, False)
ctl.Text = s
If rcd = False Then
ChkMNSC = rcd
Exit Function
End If
'** エラーセット
ChkMNSC = False
'** 分秒チェック
a = Left(s, 2)
If a < "00" Or a > "59" Then Exit Function
a = Right(s, 2)
If a < "00" Or a > "59" Then Exit Function
'** 正常セット
ChkMNSC = True
End Function
'=======================================================================
' 時チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・時フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkHH() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkHH(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkHH = True
Exit Function
End If
rcd = ChkVals(s, "00", False, True)
ctl.Text = s
If rcd = False Then
ChkHH = rcd
Exit Function
End If
'** エラーセット
ChkHH = False
'** 時チェック
If s < "00" Or s > "23" Then Exit Function
'** 正常セット
ChkHH = True
End Function
'=======================================================================
' 分チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・分フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkMN() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkMN(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkMN = True
Exit Function
End If
rcd = ChkVals(s, "00", False, True)
ctl.Text = s
If rcd = False Then
ChkMN = rcd
Exit Function
End If
'** エラーセット
ChkMN = False
'** 分チェック
If s < "00" Or s > "59" Then Exit Function
'** 正常セット
ChkMN = True
End Function
'=======================================================================
' 秒チェック
'=======================================================================
'【引数】
' ctl = 【入出力】テキストコントロール
' def = デフォルト
' NO_DEF = デフォルトなし
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・秒フォーマットをする。
' ・入力が省略されているときは、def をセットします。
'【著作権】
' ChkSC() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkSC(ctl As Variant, def As Variant, nu As Boolean) As Boolean
Dim s As String
Dim a As String
Dim rcd As Boolean
'** デフォルトセット
If def <> "" And Trim(ctl.Text) = "" Then ctl.Text = def
'** フォーマットチェック
s = Trim(ctl.Text)
If nu = False And s = "" Then
ChkSC = True
Exit Function
End If
rcd = ChkVals(s, "00", False, True)
ctl.Text = s
If rcd = False Then
ChkSC = rcd
Exit Function
End If
'** エラーセット
ChkSC = False
'** 秒チェック
If s < "00" Or s > "59" Then Exit Function
'** 正常セット
ChkSC = True
End Function
'=======================================================================
' 半角変換
'=======================================================================
'【引数】
' dt = 文字列
' mode = 変換モード
' HAN_HAN = 半角にする
' HAN_LOW = 小文字半角にする
' HAN_UP = 大文字半角にする
'【戻り値】
' string = 半角文字列
'【処理】
' ・文字列を mode に従って半角にして返します。
' ・英数字記号以外の半角変換不能全角文字はそのまま返します。
'【著作権】
' Hankaku() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function Hankaku(dt As Variant, mode As Integer) As String
Dim i As Integer
Dim s As String
Dim a As String
Dim z As String
'** データ整形
s = Trim(dt)
'** 半角変換
For i = 1 To Len(s)
a = Mid(s, i, 1)
If a >= " " And a <= "~" Or a >= "。" And a <= "゚" Then
z = z + a
Else
Select Case a
Case " "
z = z + " "
Case ","
z = z + ","
Case ":"
z = z + ":"
Case "."
z = z + "."
Case "/"
z = z + "/"
Case "−"
z = z + "-"
Case "ー"
z = z + "-"
Case Else
If a >= "0" And a <= "9" Or a >= "A" And a <= "Z" Then
z = z + Chr(Asc(a) + &H7DE1)
Else
If a >= "a" And a <= "z" Then
z = z + Chr(Asc(a) + &H7DE0)
Else
z = z + a
End If
End If
End Select
End If
Next
'** 大文字、小文字変換
Select Case mode
Case HAN_LOW
z = LCase(z)
Case HAN_UP
z = UCase(z)
End Select
'** 半角文字列セット
Hankaku = z
End Function
'=======================================================================
' 数値変換
'=======================================================================
'【引数】
' s = コントロールか文字列
'【戻り値】
' double = 数値
'【処理】
' ・カンマ付き数値文字も含めて全て数値に変換して返します。
'【著作権】
' CnvVal() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function CnvVal(s As Variant) As Double
Dim dt As Double
'** 数値変換
On Local Error Resume Next
if isnull(s) then
dt = 0
else
dt = 0
dt = s
end if
If Err <> 0 Then
CnvVal = 0
CnvVal = Val(s)
Else
CnvVal = dt
End If
On Local Error GoTo 0
End Function
'=======================================================================
' 数値文字列変換
'=======================================================================
'【引数】
' s = コントロールか文字列
'【戻り値】
' string = 数値文字列
'【処理】
' ・カンマ付き数値文字も含めて全て有効な数値文字列に変換して返します。
'【著作権】
' CnvStrVal() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function CnvStrVal(s As Variant) As String
'** 数値文字列変換
CnvStrVal = LTrim(Str(CnvVal(s)))
End Function
'=======================================================================
' 文字変換
'=======================================================================
'【引数】
' s = コントロールか文字列
'【戻り値】
' string = 文字列
'【処理】
' ・IsNull の場合、"" を返す文字変換をする。
'【著作権】
' CnvStr() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function CnvStr(s As Variant) As String
'** 文字変換
On Local Error Resume Next
if isnull(s) then
CnvStr = ""
else
CnvStr = ""
CnvStr = s
end if
On Local Error GoTo 0
End Function
'=======================================================================
' 数値チェック
'=======================================================================
'【引数】
' s = 【入出力】文字列
' ft = フォーマット
' "000000000"
' "########0"
' "########0.00"
' "###,###,##0"
' "###,###,##0.00"
' zr = ゼロチェック
' NO_ZERO = ゼロは許さない
' OK_ZERO = チェックしない
' ms = マイナスチェック
' NO_MINS = マイナスは許さない
' OK_MINS = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = 数値でない
'【処理】
' ・文字列の内容が数値なら、ft に従ってフォーマットする。
' ・ft が "" のときはフォーマットしない。
'【著作権】
' ChkVals() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkVals(s As String, ft As String, zr As Boolean, ms As Boolean) As Boolean
Dim dt As Double
'** エラーセット
ChkVals = False
'** 入力データ半角変換
s = Hankaku(s, HAN_HAN)
'** 数値データチェック
dt = Val(s)
If dt = 0 And s <> String(Len(s), "0") Then Exit Function
s = LTrim(Str(dt))
'** フォーマット、桁チェック
s = Format(s, ft)
If ft <> "" Then
If dt < 0 Then
If Len(s) > Len(ft) + 1 Then Exit Function
Else
If Len(s) > Len(ft) Then Exit Function
End If
End If
'** ゼロチェック
If zr And dt = 0 Then Exit Function
'** マイナスチェック
If ms And dt < 0 Then Exit Function
'** 正常セット
ChkVals = True
End Function
'=======================================================================
' 文字列チェック
'=======================================================================
'【引数】
' s = 【入出力】文字列
' ft = フォーマット(フォーマット文字列、または、最大バイト数。)
' "@@@@@@@@@"
' 最大バイト数
' han = 半角変換モード
' HAN_HAN = 半角にする
' HAN_LOW = 小文字半角にする
' HAN_UP = 大文字半角にする
' HAN_NO = 半角変換しない
' stype = 文字タイプ
' STYPE_NO = チッェクしない
' STYPE_HAN_A = 半角英数字でなければエラー
' STYPE_HAN = 半角でなければエラー
' STYPE_ZEN = 全角でなければエラー
' nu = "" チェック
' NO_NULL = "" は許さない
' OK_NULL = チェックしない
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・文字列の内容を、ft に従ってフォーマットする。
' ・ft が "" のときはフォーマットしない。
'【著作権】
' ChkStrs() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkStrs(s As String, ft As Variant, han As Integer, stype As Integer, nu As Boolean) As Boolean
Dim i As Integer
Dim a As String
'** エラーセット
ChkStrs = False
'** 入力データ半角変換
If han = HAN_NO Then
s = Trim(s)
Else
s = Hankaku(s, han)
End If
'** 無効文字チェック
If InStr(s, "'") > 0 Or InStr(s, Chr(&H22)) > 0 Or InStr(s, ",") > 0 Or InStr(s, chr(&H8168)) > 0 Then Exit Function
'** 半角全角チェック
Select Case stype
Case STYPE_HAN_A
For i = 1 To Len(s)
a = Mid(s, i, 1)
If (a < "0" Or a > "9") And (a < "A" Or a > "Z") And (a < "a" Or a > "z") Then
Exit Function
End If
Next
Case STYPE_HAN
If Len(s) < LenByte(s) Then Exit Function
Case STYPE_ZEN
If Len(s) <> LenByte(s) / 2 Then Exit Function
End Select
'** フォーマット、桁チェック
If IsNumeric(ft) Then
If ft < LenByte(s) Then Exit Function
Else
If ft <> "" And Len(s) <> Len(ft) Then Exit Function
s = Format(s, ft)
End If
'** "" チェック
If nu And s = "" Then Exit Function
'** 正常セット
ChkStrs = True
End Function
'=======================================================================
' フォーマットチェック
'=======================================================================
'【引数】
' ss = 【入出力】文字列
' ft = フォーマット(4 項目まで。1 項目の定義に "0" と "@" が混在し
' てはならない。"0" = 数字、"@" = 文字。)
' "0000-000000-000"
' "@@@@@@@@@-00"
' "@@@@@@@@@-@@-@@-@@"
' han = 半角変換モード
' HAN_HAN = 半角にする
' HAN_LOW = 小文字半角にする
' HAN_UP = 大文字半角にする
' z1 = ゼロチェック 1 項目
' NO_ZERO = ゼロは許さない
' OK_ZERO = チェックしない
' z2 = ゼロチェック 2 項目
' z3 = ゼロチェック 3 項目
' z4 = ゼロチェック 4 項目
'【戻り値】
' boolean = 処理結果
' TRUE = 正常終了
' FALSE = エラー
'【処理】
' ・文字列の内容を、ft に従ってフォーマットする。
' 但し、最大 4 項目のフォーマットしか出来ない。
'【著作権】
' ChkFormats() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Function ChkFormats(ss As String, ft As String, han As Integer, z1 As Boolean, z2 As Boolean, z3 As Boolean, z4 As Boolean) As Boolean
Dim sp As Integer
Dim mk As String
Dim fs As Boolean
Dim a As String
Dim s As String
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
Dim i As Integer
Dim j As Integer
'** 異常終了セット
ChkFormats = False
'** フォーマットマーク個数と種類計算
For i = 1 To Len(ft)
a = Mid(ft, i, 1)
If a = " " Or a = "," Or a = "." Or a = "/" Or a = ":" Or a = "-" Or a = "ー" Then
sp = sp + 1
mk = a
End If
If a = "@" Then fs = True
Next
'** データ整形
ss = Hankaku(ss, han)
s = ss
For i = 1 To Len(s)
a = Mid(s, i, 1)
If a = " " Or a = "," Or a = "." Or a = "/" Or a = ":" Or a = "-" Or a = "ー" Then Mid(s, i, 1) = mk
Next
'** セパレータ付け
i = InStr(s, mk)
If i = 0 Then
If fs Then
s = Left(s + Space(Len(ft)), Len(ft) - sp)
Else
s = Right(String(Len(ft), "0") + s, Len(ft) - sp)
End If
i = InStr(ft, mk)
s1 = Left(s, i - 1) + mk
i = i + 1
j = InStr(i, ft, mk)
If j = 0 Then
s2 = Mid(s, i - 1, Len(ft) - i + 1)
Else
s2 = Mid(s, i - 1, j - i) + mk
i = j + 1
j = InStr(i, ft, mk)
If j = 0 Then
s3 = Mid(s, i - 2, Len(ft) - i + 1)
Else
s3 = Mid(s, i - 2, j - i) + mk
i = j + 1
j = InStr(i, ft, mk)
If j = 0 Then
s4 = Mid(s, i - 3, Len(ft) - i + 1)
Else
s4 = Mid(s, i - 3, j - i) + mk
End If
End If
End If
s = s1 + s2 + s3 + s4
End If
'** 項目分割
s2 = ""
s3 = ""
s4 = ""
i = InStr(s, mk)
s1 = Left(s, i - 1)
i = i + 1
j = InStr(i, s, mk)
If j = 0 Then
s2 = Mid(s, i, Len(s) - i + 1)
Else
s2 = Mid(s, i, j - i)
i = j + 1
j = InStr(i, s, mk)
If j = 0 Then
s3 = Mid(s, i, Len(s) - i + 1)
Else
s3 = Mid(s, i, j - i)
i = j + 1
j = InStr(i, s, mk)
If j = 0 Then
s4 = Mid(s, i, Len(s) - i + 1)
Else
s4 = Mid(s, i, j - i)
End If
End If
End If
'** フォーマット
i = InStr(ft, mk)
If Left(ft, 1) = "@" Then
If ChkStrs(s1, Left(ft, i - 1), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s1, Left(ft, i - 1), z1, True) = False Then
Exit Function
End If
End If
i = i + 1
j = InStr(i, ft, mk)
If j = 0 Then
If Right(ft, 1) = "@" Then
If ChkStrs(s2, Mid(ft, i, Len(ft) - i + 1), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s2, Mid(ft, i, Len(ft) - i + 1), z2, True) = False Then
Exit Function
End If
End If
Else
If Mid(ft, i, j - 1) = "@" Then
If ChkStrs(s2, Mid(ft, i, j - i), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s2, Mid(ft, i, j - i), z2, True) = False Then
Exit Function
End If
End If
i = j + 1
j = InStr(i, ft, mk)
If j = 0 Then
If Right(ft, 1) = "@" Then
If ChkStrs(s3, Mid(ft, i, Len(ft) - i + 1), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s3, Mid(ft, i, Len(ft) - i + 1), z3, True) = False Then
Exit Function
End If
End If
Else
If Mid(ft, i, j - 1) = "@" Then
If ChkStrs(s3, Mid(ft, i, j - i), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s3, Mid(ft, i, j - i), z3, True) = False Then
Exit Function
End If
End If
i = j + 1
j = InStr(i, ft, mk)
If j = 0 Then
If Right(ft, 1) = "@" Then
If ChkStrs(s4, Mid(ft, i, Len(ft) - i + 1), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s4, Mid(ft, i, Len(ft) - i + 1), z4, True) = False Then
Exit Function
End If
End If
Else
If Mid(ft, i, j - 1) = "@" Then
If ChkStrs(s4, Mid(ft, i, j - i), han, STYPE_HAN_A, False) = False Then
Exit Function
End If
Else
If ChkVals(s4, Mid(ft, i, j - i), z4, True) = False Then
Exit Function
End If
End If
End If
End If
End If
s = s1
If s2 <> "" Then s = s + mk + s2
If s3 <> "" Then s = s + mk + s3
If s4 <> "" Then s = s + mk + s4
ss = s
'** 正常終了セット
ChkFormats = True
End Function
■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料