[リストへもどる]
一括表示

投稿時間:2004/07/27(Tue) 12:20
投稿者名:たてまつ
URL :
タイトル:
0(ゼロ)を取得する方法を教えてください
テキストボックスに入力された 0(ゼロ) という値を取得したいのですが
どのようにすればよろしいでしょうか?
現在は 0 は値が""になってしまいます。

現状は
publicで整数型を宣言している
2つのフォームのうち、1つ(テキストボックスがあるほうのフォーム)では取得できます
もうひとつの、引用して処理する方のフォーム(テキストボックスのないほう)が "" となります。

VBは独学ですので、質問の仕方もこれでよいのか不安が残りますが
どうぞよろしくお願いします。

投稿時間:2004/07/27(Tue) 12:38
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 0(ゼロ)を取得する方法を教えてください
> 現在は 0 は値が""になってしまいます。
何も入力されていないのが 0 ではありません。
0 が取得したければ 0 を入力して下さい。

但し、下記のような場合は、0が取得できますが、感心しません。

Private Sub Command1_Click()
    Text1.Text = ""
    Debug.Print Val(Text1.Text)
End Sub

取得している部分のコードを投稿して下さい。(取得できる方とできない方の両方)

投稿時間:2004/07/27(Tue) 12:39
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 0(ゼロ)を取得する方法を教えてください
> テキストボックスに入力された 0(ゼロ) という値を取得したいのですが
> どのようにすればよろしいでしょうか?

内容が「0」であろうと、「12」であろうと、「abc」であろうと、
取得する手順は、変わらないと思いますよ。
  Dim s As String
  s = TextBox1.Text

なお、Form2から、Form1上の Public X As Integer に値を代入する場合であれば、
「Form1.X = 123」などと書く事ができます。


> publicで整数型を宣言している
> 2つのフォームのうち、1つ(テキストボックスがあるほうのフォーム)では取得できます
> もうひとつの、引用して処理する方のフォーム(テキストボックスのないほう)が "" となります。
恐らく、変数のスコープ(有効範囲)が間違っています。
「""になる方」では、未定義の変数を使おうとして、暗黙の変数宣言がなされたため、
Variant型の変数(初期値はEmpty値)になっているのでしょう。

変数定義を確実に行うために、各モジュールの先頭に、『Option Explicit』と
書いておく事をおすすめします。

投稿時間:2004/07/27(Tue) 13:57
投稿者名:たてまつ
URL :
タイトル:
Re: 0(ゼロ)を取得する方法を教えてください
早々の返信を頂きましてありがとうございます。

>恐らく、変数のスコープ(有効範囲)が間違っています。
>「""になる方」では、未定義の変数を使おうとして、暗黙の変数宣言がなされたため、
>Variant型の変数(初期値はEmpty値)になっているのでしょう。

このご指摘はごもっともで、とりあえずクリアするようにしのいでいました。(汗)

ということで、フォーム1(テキストボックスあり)
       フォーム2(テキストボックスなし)
の両方を、正しく修正しましたところ、フォーム1、2ともに0を取得できませんでした。


public a = As Integer
以下b,cも同様
--------------------------
a <= 18 And b = Empty And c = Empty


これだと、aは1以上でないと取得してくれません
b,cは テキストボックスは空欄でも値が 0 になってしまいます。

ちなみにテキストボックスの内容(及びa,b,c)は「年齢」を入力させるもので
どうしても0を取得して他に代入したいです。

またご教授いただけますでしょうか?
よろしくお願いいたします。

投稿時間:2004/07/27(Tue) 15:23
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: 0(ゼロ)を取得する方法を教えてください
> ということで、フォーム1(テキストボックスあり)
>        フォーム2(テキストボックスなし)
> の両方を、正しく修正しましたところ、フォーム1、2ともに0を取得できませんでした。

「正しく修正した」との事ですが、

> public a = As Integer

あきらかに、この宣言は文法違反ですよ。(エラーになります) (^^;)


コードを掲示板に直接入力するのではなく、『実際に状況を再現可能な最低限のコード』を
コピーして貼り付けてください。現状では、状況が正しく伝わっていませんので、
適切な回答を返す事ができません。


> a <= 18 And b = Empty And c = Empty
「Empty値」を格納可能なのは、「Variant型」だけです。
Integer型の変数であれば、Empty値になる事はありません。

また、もしもVariantだったとしても、「 = Empty」による比較は、
正しい結果とはなりません。替わりに「IsEmpty関数」を使ってください。

# 「"" = Empty」「0 = Empty」「Empty = Empty」は、すべて True を返しますが、
# 「IsEmpty("")」「IsEmpty(0)」「IsEmpty(Empty)」は、False, False, True となります。



> これだと、aは1以上でないと取得してくれません
> b,cは テキストボックスは空欄でも値が 0 になってしまいます。

その前に、「a〜c に TextBoxの値を代入している部分」を見せてください。
値を代入している部分に問題があるか、もしくは、変数宣言に問題があるか、です。


ちなみに、Form1 上に宣言した Public a As Integer と、
Form2  上に宣言した Public a As Integer は、
それぞれ別の変数として認識されますので、注意してください。

(Form1.a の値を変更したとしても、Form2.a の値は変化しません)

投稿時間:2004/07/27(Tue) 16:38
投稿者名:たてまつ
URL :
タイトル:
Re^3: 0(ゼロ)を取得する方法を教えてください
ご面倒をおかけして申し訳ありません。

If〜thenの処理はsubプロシージャが入り組んでいますので
すごく簡単にピックアップしてみたのですが
これでよろしいでしょうか?
変数名が日本語で、大変恥ずかしいのですが
お願いいたします。


Public 子_1 As Integer   '子の年齢
Public 子_2 As Integer
Public 子_3 As Integer      ここまで標準モジュールです


ここからフォーム1です
Private Sub 試算_Click()
   子_1 = Val(ko1.Text)   
   子_2 = Val(ko2.Text)
   子_3 = Val(ko3.Text)

  If 子_1 <= 18 And 子_2 = Empty And 子_3 = Empty Then

    kisogoukei.caption = "0"

  End if

End Sub


Private Sub Command1_Click()

    Unload Me
    Form2.Show

End Sub

これを実行し、テキストボックスのko1に0を入力すると
子_1は0歳であるということを取得しました。
(kisogoukei.caption = "0"ができました)
(再テストしたところ、前のメッセージと異なってしまいました。申し訳ありません)
ko1のテキストボックスと、kisogoukeiのラベルは同じフォーム1内にあります。


次に、フォーム2へ

If 子_1 <= 18 And 子_2 = Empty And 子_3 = Empty Then

    Image1.Visible = True   'デフォルトはFalse
End if



この結果は、form1のko1の値が1以上であれば、Image1を表示してくれますが
0だと表示できません。

といった感じです。

フォーム1でのifの結果は、フォーム2で使用することはなく
フォーム1と同じ条件判断をして
表示させるものは別指定しています。

お手数をおかけしますが
どうぞよろしくお願いいたします。

投稿時間:2004/07/27(Tue) 17:32
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: 0(ゼロ)を取得する方法を教えてください
まだ、ソースコードを手書きしていませんか?
クリップボードからコピーしているのであれば、ソースコード中に
全角空白のインデントが含まれる事は無いと思うのですが…。

# インデントだけを修正した、という事ならば、良いのですけれども。


> Public 子_1 As Integer   '子の年齢
> Public 子_2 As Integer
> Public 子_3 As Integer      ここまで標準モジュールです

各モジュールには、「Option Explicit」を付けておいた方が良いと思いますよ。
これを付けておかないと、変数名の付け間違いなどによる誤動作に気が付きにくくなりますから。


> Private Sub 試算_Click()
>    子_1 = Val(ko1.Text)   
>    子_2 = Val(ko2.Text)
>    子_3 = Val(ko3.Text)

テキストボックスに、数値以外の文字が入力される事はありますか?

たとえば、 ko1.Text = "12,345" だった場合、[子_1] は 12 になりますし、あるいは、
ko1.Text = "1.2%" などが入力されると、Val関数がエラーになります。注意してください。


>   If 子_1 <= 18 And 子_2 = Empty And 子_3 = Empty Then

確認のため、判定文の前に、
   Debug.Print "子_1="; 子_1, TypeName(子_1)
   Debug.Print "子_2="; 子_2, TypeName(子_2)
   Debug.Print "子_3="; 子_3, TypeName(子_3)
というコードを置いて、各変数の内容とデータ型を確認してみてください。
Empty という値が表示される事は無いと思います。

先にも書きましたが、子_2 や 子_3 は Integer型ですので、
これらが Empty になる事はありえません。

もし、数字の「0」として判定したいのであれば、
   If 子_1 <= 18 And 子_2 = 0 And 子_3 = 0 Then
のようにしてみてください。



> 次に、フォーム2へ
> If 子_1 <= 18 And 子_2 = Empty And 子_3 = Empty Then
>     Image1.Visible = True   'デフォルトはFalse
> End if

Form2の方の処理の流れを見直してみてください。

Form1.Command1 をクリックすると、Form1はUnloadされ、Form2が表示されるわけですよね。

その場合、Form2を表示する前に、Form1.試算をクリックしていなかった場合、
[子_1], [子_2], [子_3]の変数の値が変化しない事になりますよ。
(特に何もしていなければ、これらの変数は 0 のまま、という事です)


かといって、フォーム2側の If文判定の直前に、
  [子_1] = Val(Form1.ko1.Text)
といったコードを含めてしまうのも NG です。
なぜなら、Form2 を表示した時には、既にForm1はUnloadされていますので、
この時点では、テキストボックスに入力した値も消えているからです。


> この結果は、form1のko1の値が1以上であれば、Image1を表示してくれますが
「1以上」ではなく、「18以上」なのでは?


> 0だと表示できません。
「子_1 が 18以上の時、または 0 の時に表示する」という意味なら、
『If 子_1 >= 18 Or 子_1 = 0 Then』になりますね。

投稿時間:2004/07/27(Tue) 23:07
投稿者名:いちゆ
Eメール:
URL :
タイトル:
Re^6: 0(ゼロ)を取得する方法を教えてください
……いや、あの…ココまでやるんだったら、出来れば.frmファイルをメモ帳とかで開いて、オブジェクトの定義までやってくれると嬉しいんだが(дll

投稿時間:2004/07/28(Wed) 03:03
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^7: 0(ゼロ)を取得する方法
> ……いや、あの…ココまでやるんだったら、出来れば.frmファイルをメモ帳とかで開いて、オブジェクトの定義までやってくれると嬉しいんだが(дll
あ、それは思いました。(^^;)

ついでに書くと、投稿時に「図表モード」にしてもらえるとありがたいです。(^^;)
「強制改行」で投稿されると、インデントが見えなくなってしまうので…。

投稿時間:2004/07/28(Wed) 00:04
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^6: 0(ゼロ)を取得する方法
>> 先にも書きましたが、子_2 や 子_3 は Integer型ですので、
>> これらが Empty になる事はありえません。
> ただ、コードの左に赤い丸印をつけて実行し
> その部分が何を取得しているかを確認してみると
> Empty と出てます。

という事は、それらの変数は、標準モジュールで宣言されている
      Public 子_1 As Integer '整数型
      Public 子_2 As Integer
      Public 子_3 As Integer
とは別物である、という事になるかと思います。


> オブジェクトのcaptionにemptyは出ませんが
LabelやFormのCaptionプロパティは、String型ですね。
Emptyを持てるのは、Variant型のみなので、CaptionがEmptyになる事もないはずです。

> では、子_2 子_3には入力がない空欄の場合(第2子、第3子はいない場合)
「第2子」、「第3子」という言葉の意味が良く分かりませんが、
入力があるのは、Form1.ko2.Text であって、子_2 ではありませんよね。

> 空欄を認識させるためには
> どのようなコードが必要でしょうか
テキストボックスが空欄(空の文字列)だった場合、元々のソースにある
  子_2 = Val(ko2.Text)
によって、子_2 には 0 が代入されていますよね。

もし、「0」と空文字列を区別する必要があるなら、「Public 子_2 As Integer」では
表現できませんので、データ型を変更するか、もしくは、空かどうかを判定するために
別の変数を用意する必要があります。(区別する必要が無いなら、そのままでOKです)


> 年齢入力用のテキストボックスは3つあり
> 一人っ子の場合は、ko1のみの入力となり
すみません。こちらは、たてまつさんが作られているプログラムの仕様は、
ほとんど知りませんので、「一人っ子」などの用語を出されても、何の事だか、
話に付いていけないです。。。

# 話の前後関係から、仕様をある程度 類推する事はできますけれども。


> ko2 ko3 は空欄(データはない)ということも認識させたいのです。
今回のテキストボックスは、「年齢入力用」との事でしたよね。
と言う事は、負数が入力される事は無いのでしょうか?

もし、負数の入力がありえないなら、例えば
   If ko2.Text = "" Then
       子_2 = -99999
   Else
       子_2 = Val(ko2.Text)
   End If
のように、『空ならば、-99999を入れておく』ような仕様にされては如何でしょう?

もし、生前年齢も許容させる仕様だとすれば、先述したように、
  案1) 「空欄かどうかを管理する変数」を、別に作っておく。
  案2) データ型 Integerではなく、String や Variant などにしておく。
のいずれかで対応する事になるかと思います。

> > > この結果は、form1のko1の値が1以上であれば、Image1を表示してくれますが
> > 「1以上」ではなく、「18以上」なのでは?
あ、失礼。「18以下」の間違いです。

> いいえ、1〜18で返してくれます。
提示された If 文には、「1以上」という表現はありませんよね。
という事は、「子1 が 0 だった場合」も Image1 は表示されてしまうと思いますよ。

> 子_1 <= 18 And 子_2 = 0 And 子_3 = 0 Then
> ここでも、
> 子_1 = 0
> は0歳だよ と認識してくれません
If文の直前で、値を(0固定で)代入してみたら、認識してくれますよね。
  子_1 = 0
  子_2 = 0
  子_3 = 0
  If 子_1 <= 18 And 子_2 = 0 And 子_3 = 0 Then

直前に代入すれば認識されうのならば、考えられる原因としては、

可能性1) Form2内で使っている[子_1]と、標準モジュールの[子_1]が別の変数となっている。
         (例えば、Form2上に、子_1 という変数やコントロールが存在するなど)

可能性2) 子_1 の値を、うっかり書き変えてしまっている部分がある。

などでしょうか。


> プログラムがempty と0 は選択されているものは同じであるという判断をしている気がします。
まずはヘルプで、Empty について調べて見てください。

Empty とは特殊な値で、「If Empty = 0 Then」と、「If Empty = "" Then」は、
どちらも成立するようになっているのです。そのため、「=」で比較するのではなく、
IsEmpty 関数で比較する必要があるのです。

……ただ、それ以前の問題として、TextBoxのTextプロパティにしても、
「Public 子_2 As Integer」にしても、そもそも Empty 値が入ってくる事は
ありえないので、根本的な問題は、もっと前の部分にあるのだと思います。


> すごくコードが多いのですが一度詳しく検証していただけませんでしょうか?
乗りかかった船ですので、時間の空いた時にでも、少し眺めてみますが…
それぞれのコントロール名などが分かりませんので、結果は期待しないでください。


なお、既に御存知かと思いますが、VB6では「変数名」や「プロシージャ名」あるいは、
「コントロール名」などに、日本語の文字を使うべきでは無いとされています。

予期せぬ動作をする可能性がありますので、すべて英数字の名前にされる事を強くお奨めします。
http://support.microsoft.com/default.aspx?scid=kb;ja;418924

投稿時間:2004/07/28(Wed) 04:34
投稿者名:たてまつ
URL :
タイトル:
Re^7: 0(ゼロ)を取得する方法
本当にありがとうございます


>   案1) 「空欄かどうかを管理する変数」を、別に作っておく。
>   案2) データ型 Integerではなく、String や Variant などにしておく。
> のいずれかで対応する事になるかと思います。

空欄と、0をきっちり識別してくれる変数の定義の仕方を詳しく教えていただけますか?
マイナスの数字に置き換えるのは、できればやりたくないです。
フォーム1の数字を使ってフォーム2で計算し、結果を出したいので。
(マイナスの場合のコードを書けばよいのかもしれませんが)


> 「子1 が 0 だった場合」も Image1 は表示されてしまうと思いますよ。

そうなんです。
コード上では子1が0でもimage1は表示されると思うのですが
それができないのが、今回の最大の問題なのです。

>
> 可能性1) Form2内で使っている[子_1]と、標準モジュールの[子_1]が別の変数となっている。
>          (例えば、Form2上に、子_1 という変数やコントロールが存在するなど)
これはないです。(そのつもりです)オブジェクト名は、すべて変えてありますし
1以上を入力することによって、実行できるので、よいのではないかと思うのですが。

> 可能性2) 子_1 の値を、うっかり書き変えてしまっている部分がある。
そのうっかりとは・・・・?
書き換えているつもりはないのですが・・・ 不安

> まずはヘルプで、Empty について調べて見てください。
>
> Empty とは特殊な値で、「If Empty = 0 Then」と、「If Empty = "" Then」は、
> どちらも成立するようになっているのです。そのため、「=」で比較するのではなく、
> IsEmpty 関数で比較する必要があるのです。

ヘルプで以前見たのですが、今回教えていただいたので
よく分かりました。ありがとうございます

>
> ……ただ、それ以前の問題として、TextBoxのTextプロパティにしても、
> 「Public 子_2 As Integer」にしても、そもそも Empty 値が入ってくる事は
> ありえないので、根本的な問題は、もっと前の部分にあるのだと思います。
>
根本的な問題の原因などが分かればもうすごく嬉しいです。
頼りにさせていただいてます。
その分かなりご迷惑をおかけしますが。
すみません。

私も今回のアドバイスを手がかりに
もう一度、考え直してみます。

重複しますが
空欄と、0をきっちり識別してくれる変数の定義の仕方を詳しく教えていただけますか?

よろしくお願いいたします。

投稿時間:2004/07/28(Wed) 09:34
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^8:ゼロを取得する方法
# No.9797の投稿が削除されている…。
# [編集]するつもりで、間違えて[削除]してしまったのかな?


> >   案1) 「空欄かどうかを管理する変数」を、別に作っておく。
> >   案2) データ型 Integerではなく、String や Variant などにしておく。
> > のいずれかで対応する事になるかと思います。
> 空欄と、0をきっちり識別してくれる変数の定義の仕方を詳しく教えていただけますか?

案1) の方は、たとえば、標準モジュールで、
    Public gHasValue1 As Boolean
    Public gAge1 As Integer
のような変数を宣言しておき、Form1側では
    If Text1.Text = "" Then
        gHasValue1 = False
    Else
        gHasValue1 = True
        gAge1 = CInt(Text1.Text)
    End If
のようにしておく、という事です。

そうすれば、Form2側では、
  「gHasValue1 が False なら空欄とみなし、True なら gAge を年齢として扱う」
のように判定できますよね。
あるいは、この2つの変数をまとめたユーザー定義型を作ると言う手もあるかと。


案2)の方は、
    Public gAge1 As Variant
に対して、
    If Text1.Text = "" Then
        gAge1 = Empty
    Else
        gAge1 = CInt(Text1.Text)
    End If
のように代入し、IsEmpty関数で空欄判定を行うような方法です。
あるいは空欄時には Null値 を代入し、IsNull 関数で判定するのも良いでしょう。


> (マイナスの場合のコードを書けばよいのかもしれませんが)
どちらにしても、「空欄だった場合」という例外処理を書く必要があるのですから、
それが「マイナスだった場合」というコードで処理する事になっても、大差は無いのでは。

  '標準モジュール
  Public Const EMPTY_VALUE As Integer = -32768
  Public gAge1 As Integer

  'Form1
    If Text1.Text = "" Then
        gAge1 = EMPTY_VALUE
    Else
        gAge1 = CInt(Text1.Text)
    End If

  'Form2
    If gAge1 = EMPTY_VALUE Then
        MsgBox "空です。"
    ElseIf gAge1 >= 0 And gAge1 <= 18 Then
        MsgBox "18歳以下です。"
    Else
        MsgBox "19歳以上です。"
    End If

> > 「子1 が 0 だった場合」も Image1 は表示されてしまうと思いますよ。
> そうなんです。
「18以下」ではなく、「1〜18」にしたいのであれば、
   If Age <= 18 Then
ではなく、
   If (Age >= 1 And Age <= 18) Then
のような条件にする必要があるかと。0〜18ならば、
   If (Age >= 0 And Age <= 18) Then
ですよね。


> コード上では子1が0でもimage1は表示されると思うのですが
> それができないのが、今回の最大の問題なのです。
前回の投稿の繰り返しになりますが、If文の判定直前に、
変数に 0 を直接代入すれば、Image1 は表示されるのでしょうか?

直前に代入すれば表示されるのであれば、その時点での変数の値が
「0ではない値になっていた」と判断せざるを得ません。

逆に、直前に0を代入しても表示されないのであれば、
「If文の判定条件を見直す必要がある」という事になるかと。


> > 可能性2) 子_1 の値を、うっかり書き変えてしまっている部分がある。
> そのうっかりとは・・・・?
> 書き換えているつもりはないのですが・・・ 不安
大丈夫だとは思いますが、念のため、Visual Basic の
ウォッチウィンドウ や ローカルウィンドウ機能で確認して下さい。

VB6の場合は、[デバッグ]-[ウォッチ式の追加]というメニュー項目です。
そこで、"子_1"という変数名を指定し、[プロシージャ]は"(すべてのプロシージャ)"とし、
[モジュール]には標準モジュールの名前を指定しておきます。

そして、「式の内容が変化した時に中断」を選べば、式の内容が変化した時に、
プログラムの実行が一時停止されるようになります。


> > ……ただ、それ以前の問題として、TextBoxのTextプロパティにしても、
> > 「Public 子_2 As Integer」にしても、そもそも Empty 値が入ってくる事は
> > ありえないので、根本的な問題は、もっと前の部分にあるのだと思います。
> 根本的な問題の原因などが分かればもうすごく嬉しいです。

Integer型変数には、Empty を代入しようとしても、Emptyにはならないのです。たとえば、

Private Sub Form_Load()
    Dim X As Integer
    X = Empty
    If IsEmpty(X) Then
        MsgBox "Emptyです。"
    Else
        MsgBox TypeName(X) & "型です。"
    End If
End Sub

この場合、『Integer型です。』と表示されることはあっても、
『Emptyです。』と表示されることはありませんよね。

ですから、提示いただいたコードで、 子_1 などの変数に Empty が入るとしたら、
Variant型で宣言された、同名の変数がどこかにあるのではないか…と勘繰ってしまうのです。

投稿時間:2004/07/28(Wed) 10:48
投稿者名:たてまつ
URL :
タイトル:
Re^9:ゼロを取得する方法
いつも本当にご親切にありがとうございます。

> ですから、提示いただいたコードで、 子_1 などの変数に Empty が入るとしたら、
> Variant型で宣言された、同名の変数がどこかにあるのではないか…と勘繰ってしまうのです。

私もそれを疑うことに集中してみました。
ただ、自分ではなかなか見つけることができませんでした。(先入観が入るためでしょうか?)

結論から申しますと、格好悪いコード(もともとダメなのですが)で
乗り切ることができました。

格好悪いと申しますのは、子の年齢に対しては、一切変数を使わない方法です。
それと、フォーム1をUnloadしていたので
Hideにしてみたところ、とりあえず、望む結果を得ることができました。
すごく初歩的な方法で、恥ずかしいくらいです。

ただこれでは、自分でも読みにくいような気がします。
しかも、変数を使えない自分がとってもくやしいです。

今回ご教授いただきました内容で
再度作り直してみようと思います。(早速取り掛かっています)
親切にいろいろ教えていただきましたことありがとうございました。
心から感謝しております。

このあと、form2の印刷へと進むのですが
また問題が発生してしまったら
その時はこれに懲りず、お世話いただければと思っております。

ありがとうございました。