諸先輩方。
ご教示お願いします。
複数のテキストボックスに入れる値を数値とブランク(デフフォルトでブランク)はOKとし、それ以外の値が入った場合のみ
エラーさせたいのですが、どうしてもブランクはエラーになってしまいます。初心者で申し訳ありません。
どなたかご教示お願致します。
web_checkからIsDigit(数値かチェックするプログラム)呼んでます。
web_checkは、新規登録のボタンをクリックした時に呼んでます。
ckは引数でエラーになったら1を返してプログラム終了させてます。
or で複数項目をチェックするのが間違ってるんでしょうか・・・。
Private Function IsDigit(ByVal Value As String) As Boolean
Dim K As Long
If Len(Value) = 0 Or Not Value = "" Then
IsDigit = False
Exit Function
End If
For K = 1 To Len(Value)
If Not Mid(Value, K, 1) Like "[0-9]" Then Exit Function
Next K
IsDigit = True
End Function
Sub web_check(ByRef ck As String)
If Not IsDigit(qty1.Text) Or Not IsDigit(qty2.Text) Or _
IsDigit(qty3.Text) Or Not IsDigit(qty4.Text) Or Not IsDigit(qty5.Text) Thenty5.Text) Then
Label41.Text = "Sample infomationのqty:数値エラー。"
ck = 1
End If
ざっとしか見てないので違うかもしれませんが、
> If Len(Value) = 0 Or Not Value = "" Then
は、
If Len(Value) = 0 Or Value = "" Then
なのではないかと・・・
「もし文字列の長さが0もしくは文字列に何も入っていなくない(つまり、何か入っている)場合」となるので、ここで100%処理をせずに帰ってしまうと思いますが
そうならずに動作しているのでしょうか
投稿時の入力ミスだと思うのですが
Private Function IsDigit(ByVal Value As String) As Boolean
Dim K As Long
If Len(Value) = 0 Or Not Value = "" Then '<<========文字列の長さが 0 または "" でなければ IsDigit = False
IsDigit = False
Exit Function
End If
For K = 1 To Len(Value)
If Not Mid(Value, K, 1) Like "[0-9]" Then Exit Function '<<======== 数字以外であればFunctionを終了。IsDigit の返値は?
Next K
IsDigit = True
End Function
Sub web_check(ByRef ck As String)
If Not IsDigit(qty1.Text) Or Not IsDigit(qty2.Text) Or _
IsDigit(qty3.Text) Or Not IsDigit(qty4.Text) Or Not IsDigit(qty5.Text) Thenty5.Text) Then
'<<========IsDigit(qty3.Text)は Not ではない?
IsDigit(qty5.Text) の後の Thenty5.Text)は何?
Label41.Text = "Sample infomationのqty:数値エラー。"
ck = 1
End If
根本的に間違ってるんじゃないかっていう部分は他の方が
書いてくださっているようなので、ちょっと気になった点を。
わざわざ、文字列の中身を1文字ずつ検査してますが、
もしかして例えば「1 2 3」(数字の間にSpaceがある)の
ような場合もOKなんでしょうか?
このあたりの仕様で、ずいぶんと答えが変わってくる気が
しますので、その辺りを明確にした方がいいと思います。
あと、今回の件では問題にはならないかもしれませんが、
VBとOSのバージョンぐらいは書いておいた方がいいと思いますよ。
あ、1文字ずつ検査するのは、符号とか小数点を
認めないようにするためでしょうかね?
何にせよ、補足をお願いしたいところです。
通ってみた様、K・今川様、そがっち様
ご指摘ありがとうございます。勝手が分からず申し訳ございません。
K・今川様のご指摘でなんとか解決できました。
ややこしい、構文を記載してしまいすみませんでした。
K・今川様
>'<<=文字列の長さが 0 または "" でなければ IsDigit = False。
ここは、FalseではなくてTrueにしたところ、問題なく処理できました。
なんとも単純なミスで大変お手数をお掛けいたしました。
>IsDigit(qty5.Text) の後の Thenty5.Text)は何?
ここは記載間違いでした。すみません。
Or Not IsDigit(qty5.Text) Thenが正しかったです。
そがっち様
ご指摘ありがとうございます。
1 2 3などのスペース入りもエラーとしたかったのです。
これも無事解決できました。
通ってみた様、K・今川様、そがっち様
本当にありがとうございました。
こうゆうのはいかがでしょう。
Private Function IsDigit(ByVal Value As String) As Boolean
Dim K As Long
K= String(Len(Value), "#")
If (Value Like K) = True Then
IsDigit = True
Else
IsDigit = False
End If
'IsDigit = (Value Like K)'上の If 〜 End Ifと同じ処理です。
End Function
Kに文字列と同じ数の#を入れる。
#はLikeで一文字の数字を示すもので文字列と
同じ数の#と比較すれば文字列が数値かどうか
比較できます。
例: 文字列が三文字の場合
("123" Like "###") = True
("1r2" Like "###") = False
("1 2" Like "###") = False
また、文字列の長さが0でもTrueになります。
("" Like "" ) = True
ただ、符号、小数点は数値として認識されません。
("-12" Like "###") = False
("1.2" Like "###") = False
>K・今川さん
SpaceのみはOKということなので、Trimは掛けた方が良さそうですね。
(全角SpaceはNG、とかなら面倒そうですが)
※ちなみに私は最初、
Trim → 1文字ずつ検査してNot IsNumericならNG
…とか泥臭いこと考えてしまいました(汗)
K・今川様
ご教示ありがとうございます。
ご記載の構文の方がすっきりしていて分かり易いです。
使わさせていただきます。
小生自身、整数のみの数値で考えておりましたが
ここに来て少数点も必要になってきました。
ご教示頂いた構文から小数点をクリアできる様にする
良い方法ございますでしょうか?
テキストボックスには、小数点を含めた数値、もしくは空白
のみをOKとしたいのです。
本文とは若干ずれた内容のご相談で誠に申し訳ございません。
こんな感じでしょうか。
Private Function IsDigit(ByVal Value As String) As Boolean
Dim K As Long
Dim I As Integer
Value=Trim(Value) '前後の空白を削除
'小数点が二つ以上あれば数値ではない。
If Len(Value)-Len(Replace(Value,".","")) >= 2 Then
IsDigit=False
Exit Function
End If
K = ""
For I = 1 To Len(Value)
K = K & "[0-9.]"
Next
If (Value Like K) = True Then
IsDigit = True
Else
IsDigit = False
End If
End Function
まず、前後のSpaceを取り除く。
小数点が二個以上の場合は数値ではないのでエラーにする。
そして、"[0-9.]"を文字の数だけ繋げる。
それを文字列と比較する。
"[0-9.]"は一つの文字が 0〜9 または . なら True
詳しくは Help で Like演算子を調べてください。
例: 文字列が三文字の場合
("123" Like "[0-9.][0-9.][0-9.]") = True
("1.2" Like "[0-9.][0-9.][0-9.]") = True
("1r2" Like "[0-9.][0-9.][0-9.]") = False
("1 2" Like "[0-9.][0-9.][0-9.]") = False
また、文字列の長さが0でもTrueになります。
("" Like "" ) = True
ただ、符号、は数値として認識されません。
("-12" Like "[0-9.][0-9.][0-9.]") = False
Helpを見ていたところ、もっと簡単にできるものを見つけてしまいました。(^^;)
Private Function IsDigit(ByVal Value As String) As Boolean
Dim K As Long
Value=Trim(Value) '前後の空白を削除
IsDigit=IsNumeric(K) 'Kが数値であればTrue
If K="" Then '""は数値にならないので
IsDigit = True
End If
End Function
これなら符号、小数点があってもTrueになります。
詳しくは Help で IsNumeric関数 を調べてください。
上の投稿に違いがありましたので修正します。
Dim K As Long
↓
Dim K As String
Value=Trim(Value) '前後の空白を削除
↓
K =Trim(Value) '前後の空白を削除
K・今川様
本当にありがとうございます。
自分で考えてTRYする事もせずに、相談してしまい反省しております。
ご教示誠にありがとうございました。
通ってみた様、そがっち様
ご教示誠にありがとうございました。
ツイート | ![]() |