[[20041026102453]] 『VBA:TextBoxの流れ』(さんちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:TextBoxの流れ』(さんちゃん)

いつもお世話になっております。
ユーザーフォームにTextBoxを1〜13まで作り、コマンドボタンを1つ作って有ります。TextBoxの入力値を入力した時点で判定させて、コマンドボタンでシートに貼り付けていますが、タブオーダーでTextBox1〜13にセットして最後にコマンドボタンへ行きますが、2回押してしまうと2重に入力してしまいます。コマンドボタンを押した時点で、TextBox2を選択させたいのでTextBox2.SetFocusの構文を入れたのですが、デバックとなってしまいます。何方か、よい方法を教えていただけないでしょうか?

エクセル 97  Win95です。

 Private Sub TextBox2_AfterUpdate() 
    Sheets("調整").Activate 
    Sheets("調整").Cells(9, 5).Value = TextBox2 / 100  ←デバック発生 
 End Sub 
 
 Private Sub CommandButton2_Click() 
 Dim i As Integer 
    For i = 14 To 20 
       If Me.Controls("Label" & i).Caption = "NG" Then 
          MsgBox "規格を満足してません" 
          Exit Sub 
       End If 
    Next i 

    For i = 14 To 20 
       If Me.Controls("Label" & i).Caption = "" Then 
          MsgBox "入力されていません" 
          Exit Sub 
       End If 
    Next i 

    For i = 14 To 20 
       If Me.Controls("Label" & i).Caption = "判定" Then 
          MsgBox "入力されていません" 
          Exit Sub  
       End If  
    Next i 

    Sheets("調整").Cells(9, 4).Value = Format(Date, "yyyy/m/d") 
    Sheets("調整").Cells(9, 3).Value = TextBox1.Text 

    Call Macro3  
    Call UserForm_Initialize 

    TextBox2.SetFocus     ←TextBox2を選択して〜
 End Sub


 読みづらかったので、コードを編集しました。

 > Sheets("調整").Cells(9, 5).Value = TextBox2 / 100  ←デバック発生 
 何エラーでしょうか? ひとまず、プロパティの省略はタブーですので。
   ↓ 
 Sheets("調整").Cells(9, 5).Value = TextBox2.Text / 100

 (INA)


(INA)様、ありがとうございます。
実行エラー 13 
型が一致しません。
と表示されます。


 失礼しました。
 文字列では計算できませんね。 (暗黙の型変換されると思ったのだけど。)

   ↓ 
 Sheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100

  (INA)


(INA)さん、ありがとうございます。
ご指摘のところ、CDbl(TextBox2.Text)に変更しました。・・・入力ミスでしたが、とりあえずはTextBoxの入力値に /100 されて、Sheetに入力されていたので気が付きませんでした。

相変わらず、実行エラーが出てしまうのですが、何かいけないところが解らない状態です。今しばらく、ご指導していただけないでしょうか?


 今度はどこの行で、どのようなエラーが発生するのですか?

  (INA)
 

コマンドボタン2を押したとき、処理を終了後 TextBox2を選択してほしいのですが、『TextBox2.SetFocus』

Sheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100

ここで、デバック 実行エラー13が出てしまいます。


 どっちの行ですか?

 TextBox2に数値を入力していますか?

 あとは、これまでの記述に問題はないので、
 私が知らされていないマクロによるものでは?  
  (INA)  
 

TextBox1〜13ですが、1個追加して 1〜14あり、1〜7についてはSheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100 これと同じです。(Text2←は、当然それぞれに変更してあります)TextBox8〜13は、入力値の判定をLabelに表示させています。(以下に記載)、その他、ユーザーホームを開いたときの処理です。(以下に記載)

Private Sub TextBox8_AfterUpdate()

Sheets("調整").Activate

Sheets("調整").Cells(9, 11).Value = CDbl(TextBox8.Text) / 100

If (TextBox8.Text > -21) And (TextBox8.Text < 31) Then

Label14.Caption = "OK"

Else: Label14.Caption = "NG"

End If

End Sub
 
Private Sub UserForm_Initialize()

Dim NO As Integer

Dim a As Integer

Dim j As Integer

NO = Sheets("調整").Range("C10")

Me.TextBox1 = NO + 1

For a = 2 To 14

Me.Controls("TextBox" & a) = ""

Next a

For j = 14 To 20

Me.Controls("Label" & j) = "判定"

Next j

End Sub 

Sheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100  ←ここで、実行エラー13が出てしまいます。


 Me.Controls("TextBox" & a) = "" ←ここで空白が代入されている?
 それを100で割っているからとか・・・。
 (川野鮎太郎)


(川野鮎太郎)さん、ありがとうございます。手っ取り早くPrivate Sub UserForm_Initialize()
を、削除してやってみたところ、動きます。もう少しがんばって見ます。 
 

分かりません?(;;) 
>Me.Controls("TextBox" & a) = "" ←ここで空白が代入されている? 
Me.Controls("TextBox" & a) = clear にしてみました。が、解決できず
今わかっている事は、Private Sub UserForm_Initialize()を削除すると、コマンドボタンを押して処理した後TextBox2を選択してくれます。ただしTextBox2〜14まで、前回の入力が残ってしまうので、コマンドボタン処理後に、以下の構文を入れたのですが、現象は同じ

For a = 2 To 14

Me.Controls("TextBox" & a) = ""

Next a 

TextBox2を入力しないで、コマンドボタンを押すと、正常に動作する。なにか後一息のところなのに(;;)、なぜなんでしょう???


 なんとなくですが・・・
Private Sub TextBox2_AfterUpdate()  ←これって、TxetBox2が変化したときのイベントですよね。

 だから値を空白にすると、イベントが発生してエラーになるのでは?
 Private Sub TextBox2_AfterUpdate()  
 If TextBox2="" Then Exit Sub
     Sheets("調整").Activate
     Sheets("調整").Cells(9, 11).Value = CDbl(TextBox8.Text) / 100
 End If
 End Sub としたらどうかな・・・。
 まったくの山勘です(^_^A;
 (川野鮎太郎)


(^^)いやー、なるほど 
>だから値を空白にすると、イベントが発生してエラーになるのでは?
読んだ瞬間に、納得しました。ほんとに助かりました。勉強になります!

(INA)さん、(川野鮎太郎)さん・・・・本当に、ありがとうございました。今夜はぐっすり眠れそうです。


 一点だけ…
 >If TextBox2="" Then Exit Sub
これは一行で完結しているIf文ですので、End Ifは不要です。
書くなら
 Private Sub TextBox2_AfterUpdate()  
     If TextBox2.Text = "" Then Exit Sub
     Sheets("調整").Activate
     Sheets("調整").Cells(9, 5).Value = CDbl(TextBox2.Text) / 100
 End Sub
と書くか、あるいは
 Private Sub TextBox2_AfterUpdate()  
     If TextBox2.Text = "" Then
         Exit Sub
     End If
     Sheets("調整").Activate
     Sheets("調整").Cells(9, 5).Value = CDbl(TextBox2.Text) / 100
 End Sub
と書くか。
また今回問題なのは「CDbl」での型変換が出来ないという点なのですから、
TextBox2にDouble型としてふさわしくない値が来た場合、と考える方が良いのかな、とも。
それがありえない作りなら無視しても良いでしょうけれど。
 
そしてその場合、Sheets("調整").Cells(9, 5).Valueの値はどうあるべきなのか。
これはさんちゃんがこのマクロに期待する動きとしてどこまで求めるか次第なので
単なる私の老婆心。

 >だから値を空白にすると、イベントが発生してエラーになるのでは?
イベントの連鎖はVBにつき物の悩ましい問題です。
コードから値をセットした時のChangeイベントや
SetFocusした場合のGotFocusイベント、LostFocusイベント等では要注意です。
(ご近所PG)


 >これは一行で完結しているIf文ですので、End Ifは不要です。
 なるほど、IFとEnd Ifは必ずしもセットでなくても良いんですね。_〆\(..;) メモメモ
 ありがとうございます。
 (川野鮎太郎)


(ご近所PG)さん、さらに参考になる書き込みありがとうございます。IF/End If 関係勉強になりました。
TextBoxへ入力した「数値」を、その時点で判定させて、コマンドボタンで入力した数値を貼り付けるだけのもので、、判定にNGが有れば、警告MsgBoxを出すものです。
今、作業が一部変更が入り、TextBox4の入力値がOKであれば、TextBox7.SetFocusしたいのですが、なぜか同じようなエラーが出ています。がんばって勉強します。また、何か有りましたら、ご教授ください。ありがとうございました


 textbox に数値しか入力しないのであれば、入力制限をするのもよいかと。

 Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii.Value
    Case 48 To 57
    Case Else
        KeyAscii.Value = 0
    End Select
 End Sub

 Private Sub UserForm_Activate()
    TextBox1.IMEMode = fmIMEModeDisable
 End Sub

   (INA)


(INA)さん、ありがとうございます。入力は「負の数」も入力します。Case 48 to 57 この部分で、0〜9の数字以外を規制しているのでしょうか?よろしければ、48 57の意味をご教授ください。

 >入力は「負の数」も入力します。

 Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii.Value
    Case 45, 48 To 57
    Case Else
        KeyAscii.Value = 0
    End Select

    If TextBox1.Text <> "" And KeyAscii.Value = 45 Then
        KeyAscii.Value = 0
    End If
 End Sub

 Private Sub UserForm_Activate()
    TextBox1.IMEMode = fmIMEModeDisable
 End Sub
 

 >48 57の意味
 「ヘルプより」
 KeyPress イベント
 ANSI コードまたはシフト JIS コードに対応する文字キーのいずれかを押すと発生します。
 KeyPress イベントの構文は、次の指定項目から構成されます。

 構文
 Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)

 指定項目  内容 
 object   必ず指定します。オブジェクトの名前を指定します。 
 KeyANSI  必ず指定します。
          標準の ANSI コードまたはシフト JIS コードを表す整数値を指定します。 

 文字コード
http://bit-drive.e-words.ne.jp/p/r-ascii.html

    (INA)  

INAさん、川野鮎太郎さん、ご近所PGさん、細かな説明アドバイス、参考になるアドレスまで頂き、大変ありがとうございました。 早速お気に入りに追加しました。これで、完璧に完成できます。

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.