Page 64 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼If Then構文が沢山 123 02/9/11(水) 10:35 ┣Re:If Then構文が沢山 Jaka 02/9/11(水) 12:55 ┃ ┗Re:If Then構文が沢山 123 02/9/11(水) 13:20 ┃ ┗Re:If Then構文が沢山 コロスケ 02/9/11(水) 14:01 ┃ ┗Re:If Then構文が沢山 Jaka 02/9/11(水) 14:05 ┃ ┗Re:If Then構文が沢山 つん 02/9/11(水) 14:18 ┗皆さん すごいです。 123 02/9/11(水) 15:08 ─────────────────────────────────────── ■題名 : If Then構文が沢山 ■名前 : 123 ■日付 : 02/9/11(水) 10:35 -------------------------------------------------------------------------
お助けください。 ユーザーフォームのTextBox1をExit(TextBox1_Exit)する際に いくつかの If Then を実行させています。 このIf構文には、TextBox1_KeyDown によって数値を8桁にした数値を 判断して実行する If も含まれています。 TextBox1に数値を入力してEnterを押した場合は、その入力した数値は 8桁に変更され、その8桁の数値を TextBox1_Exit のIf構文が判断するのですが、 Enterを押さずに、カーソル下を押して次のTextBoxへ移動すると TextBox1_KeyDown の8桁数値変換が行われません。 そこで、TextBox1_KeyDown の内容を TextBox1_Exit へ移したのですが、 8桁の数値変換が行われません。 TextBox1_Exit 内のIf構文について、まず8桁の数値変換が行われて、それから 次のIf構文へ進ませるにはどうしたらよいのでしょうか。 どなたか教えてください。宜しくお願いいたします。 |
こんにちは。 コードを提示した方が、レスがつきやすくなると思います。 現時点では、どう言う事なのか良く解りません。 |
▼Jaka さん こんにちは。 恥ずかしながらコードを記します。(変なところがあるかとは思いますが..) Private Sub T_個人番号_Exit(ByVal Cancel As MSForms.ReturnBoolean) If T_個人番号.Value = "" Then Exit Sub Else Dim strTest2 As String Dim Find As Range strTest2 = T_個人番号.Value With ActiveSheet Set Find = .Range(.Cells(1, 2), .Cells(26, 2)).Find(strTest2) If Find Is Nothing Then T_該当なし.Value = "* 該当者がいません。(氏名登録可)" T_氏名.Value = Empty Exit Sub End If Find.Activate Cells(ActiveCell.Row, 1).Select T_氏名.Value = ActiveCell.Offset(0, 0).Value End With End If End Sub 上記のExitコードに以下の内容を取り込みたいのですが (以下の内容をKeyDownではなくExitで実行したい) 単に取り込んだだけでは、6桁数値になりません。 上記コードはT_個人番号(Textbox)内の数値が6桁に なった後に実行されなければなりません。 Private Sub T_個人番号_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then nn = Format(T_個人番号.Value, "000000") T_個人番号 = nn End If End Sub 宜しくお願いいたします。 |
▼123 さん: こんにちは。8桁か6桁か良くわからないのですが、 1.T_個人番号には数字しか入力されない。 2.入力されるデータは常に0詰の8桁数字である必要がある。 3.ExitイベントでFindを開始する。 と考えたときに、 1.KeyPressイベントで数字のみの入力に限定し、 2.入力されたらChangeイベントで8桁の0詰数字に変換する という手順ではいかがですか? これなら、Exitイベントが発生した時に常に"T_個人番号.Value"は8桁の数字になると思います。 違ってたらすいません。(↓こういう事を言いたいのですが...) ではー♪ Private Sub T_個人番号_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) '//入力を数字だけに限定 If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 End Sub Private Sub T_個人番号_Change() '//値が変ったら同時にフォーマット開始 With T_個人番号 '8桁以上の入力は無効 If Len(.Value) > 8 Then .Value = Left(Val(.Value), 8) 'フォーマット .Value = Format(.Value, "00000000") End With End Sub |
>単に取り込んだだけでは、6桁数値になりません。 ???? どの様に取り込んだのでしょうか? Findメソッドと言う物がありますから、変数名にFindとか同名を使うのは止めましょう。 どうしても使いたければ、xxFindとかFindxxにしましょう。 これだとどうなりますか? Private Sub T_個人番号_Exit(ByVal Cancel As MSForms.ReturnBoolean) If T_個人番号.Value = "" Then Exit Sub Else Dim strTest2 As String Dim Find_1 As Range strTest2 = Format(T_個人番号.Value, "000000") T_個人番号.Value = strTest2 With ActiveSheet Set Find_1 = .Range(.Cells(1, 2), .Cells(26, 2)).Find(strTest2) If Find_1 Is Nothing Then T_該当なし.Value = "* 該当者がいません。(氏名登録可)" T_氏名.Value = Empty Exit Sub End If Find_1.Activate Cells(ActiveCell.Row, 1).Select T_氏名.Value = ActiveCell.Offset(0, 0).Value End With Set Find_1 = Nothing End If End Sub |
みなさん、こんにちは。 せっせとやってたら、すでにコロスケさんとJakaさんが・・・ この上、私のを載せるのは無駄なだけだと思いますが、 せっかく頑張ったんで、載せて見ます(自己満足・・コロスケさん、Jakaさんごめんなさい) Jakaさんとほとんど変わらないようですが・・・ '============================================== Private Sub T_個人番号_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim strTest2 As String Dim rFind As Range If T_個人番号.Value = "" Then MsgBox "個人番号を入力してください" Cancel = True T_個人番号.SetFocus Exit Sub End If If IsNumeric(T_個人番号.Value) = False Then MsgBox "数字を入力してください" Cancel = True T_個人番号.SetFocus Exit Sub Else T_個人番号.Value = Format(T_個人番号.Value, "000000") End If strTest2 = T_個人番号.Value With ActiveSheet Set rFind = .Range(.Cells(2, 1), .Cells(4, 2)).Find(strTest2) If rFind Is Nothing Then T_該当なし.Value = "* 該当者がいません。(氏名登録可)" T_氏名.Value = Empty Exit Sub End If rFind.Activate Cells(ActiveCell.Row, 1).Select T_氏名.Value = ActiveCell.Value End With Set rFind = Nothing End Sub '============================================== 私がちょっと気になったのは(Findの件も気になりましたが) 変数の宣言を、コードの途中に入れてることです。 間違いではないのかもしれませんが、通常、変数の宣言は、 プロシージャの一番はじめに入れます。 その方が、後から見るときに、このプロシージャにはどういう変数が使われているかよくわかると思います。 それから、 T_氏名.Value = ActiveCell.Offset(0, 0).Value ってありますが、これって、 ActiveCell.Value で、ええんと違うかな?それともなんか意味あるんでしょうか? |
コロスケさん、Jakaさん、つんさん みなさん ありがとうございました。 すんなり 行きました。 それにしても、みなさん すごいです。 コロスケさん 8桁ではなく、6桁でした。(間違えました) Jakaさん 変数名には注意します。 つんさん 変数は最初にまとめて宣言します。 T_氏名.Value = ActiveCell.Offset(0,0)Valueは その通りActiveCell.Valueです。 Offsetの場所をいろいろと いじっていて(0,0)にしてしまいました。 直しました。 みなさん 本当に助かりました。ありがとうございました。 |