テキストボックスの値がブランクをエラーにさせない為には?

解決


KEN  2007-02-16 19:05:07  No: 98036

諸先輩方。
ご教示お願いします。
複数のテキストボックスに入れる値を数値とブランク(デフフォルトでブランク)は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


通ってみた  2007-02-16 20:54:01  No: 98037

ざっとしか見てないので違うかもしれませんが、

> If Len(Value) = 0 Or Not Value = "" Then

は、

 If Len(Value) = 0 Or Value = "" Then

なのではないかと・・・
「もし文字列の長さが0もしくは文字列に何も入っていなくない(つまり、何か入っている)場合」となるので、ここで100%処理をせずに帰ってしまうと思いますが

そうならずに動作しているのでしょうか


K・今川  2007-02-16 21:00:52  No: 98038

投稿時の入力ミスだと思うのですが

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


そがっち  2007-02-16 22:18:12  No: 98039

根本的に間違ってるんじゃないかっていう部分は他の方が
書いてくださっているようなので、ちょっと気になった点を。
わざわざ、文字列の中身を1文字ずつ検査してますが、
もしかして例えば「1 2  3」(数字の間にSpaceがある)の
ような場合もOKなんでしょうか?
このあたりの仕様で、ずいぶんと答えが変わってくる気が
しますので、その辺りを明確にした方がいいと思います。

あと、今回の件では問題にはならないかもしれませんが、
VBとOSのバージョンぐらいは書いておいた方がいいと思いますよ。


そがっち  2007-02-16 22:21:15  No: 98040

あ、1文字ずつ検査するのは、符号とか小数点を
認めないようにするためでしょうかね?
何にせよ、補足をお願いしたいところです。


KEN  2007-02-17 00:39:59  No: 98041

通ってみた様、K・今川様、そがっち様
ご指摘ありがとうございます。勝手が分からず申し訳ございません。
K・今川様のご指摘でなんとか解決できました。
ややこしい、構文を記載してしまいすみませんでした。

K・今川様
>'<<=文字列の長さが  0  または  ""  でなければ IsDigit = False。
ここは、FalseではなくてTrueにしたところ、問題なく処理できました。
なんとも単純なミスで大変お手数をお掛けいたしました。

>IsDigit(qty5.Text) の後の Thenty5.Text)は何?
ここは記載間違いでした。すみません。
Or Not IsDigit(qty5.Text) Thenが正しかったです。

そがっち様
ご指摘ありがとうございます。
1 2 3などのスペース入りもエラーとしたかったのです。
これも無事解決できました。

通ってみた様、K・今川様、そがっち様
本当にありがとうございました。


K・今川  2007-02-17 01:58:09  No: 98042

こうゆうのはいかがでしょう。

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


そがっち  2007-02-17 02:24:51  No: 98043

>K・今川さん
SpaceのみはOKということなので、Trimは掛けた方が良さそうですね。
(全角SpaceはNG、とかなら面倒そうですが)

※ちなみに私は最初、
  Trim → 1文字ずつ検査してNot IsNumericならNG
  …とか泥臭いこと考えてしまいました(汗)


KEN  2007-02-17 03:04:11  No: 98044

K・今川様
ご教示ありがとうございます。
ご記載の構文の方がすっきりしていて分かり易いです。
使わさせていただきます。

小生自身、整数のみの数値で考えておりましたが
ここに来て少数点も必要になってきました。
ご教示頂いた構文から小数点をクリアできる様にする
良い方法ございますでしょうか?

テキストボックスには、小数点を含めた数値、もしくは空白
のみをOKとしたいのです。

本文とは若干ずれた内容のご相談で誠に申し訳ございません。


K・今川  2007-02-17 05:10:01  No: 98045

こんな感じでしょうか。

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


K・今川  2007-02-17 05:54:25  No: 98046

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関数  を調べてください。


K・今川  2007-02-17 06:08:48  No: 98047

上の投稿に違いがありましたので修正します。

        Dim K As Long
                  ↓
        Dim K As String

        Value=Trim(Value)      '前後の空白を削除
          ↓
        K    =Trim(Value)      '前後の空白を削除


KEN  2007-02-17 06:37:21  No: 98048

K・今川様

本当にありがとうございます。
自分で考えてTRYする事もせずに、相談してしまい反省しております。
ご教示誠にありがとうございました。

通ってみた様、そがっち様
ご教示誠にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加