[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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)
失礼しました。 文字列では計算できませんね。 (暗黙の型変換されると思ったのだけど。)
↓ Sheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100
(INA)
相変わらず、実行エラーが出てしまうのですが、何かいけないところが解らない状態です。今しばらく、ご指導していただけないでしょうか?
今度はどこの行で、どのようなエラーが発生するのですか?
(INA)
Sheets("調整").Cells(9, 5).Value = cdbl(TextBox2.Text) / 100
ここで、デバック 実行エラー13が出てしまいます。
どっちの行ですか?
TextBox2に数値を入力していますか?
あとは、これまでの記述に問題はないので、 私が知らされていないマクロによるものでは? (INA)
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で割っているからとか・・・。 (川野鮎太郎)
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は必ずしもセットでなくても良いんですね。_〆\(..;) メモメモ ありがとうございます。 (川野鮎太郎)
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)
>入力は「負の数」も入力します。
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)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.