[[20170221201539]] 『未入力を除外するには(TextBox)』(さとし) ページの最後に飛ぶ

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

 

『未入力を除外するには(TextBox)』(さとし)

下記にて入力状態をチェックしていますが、
TextBoxの3と8のみ、チェックから除外する方法を教授ください
よろしくお願いします。

Private Sub appendDateToSheet()

 Dim c As Control
 Dim v As Control

 For Each c In Me.Controls
    If TypeName(c) = "TextBox" Then
        If c.Value = "" Then
            MsgBox "未入力があります"
            c.SetFocus
            Exit Sub
        End If
    End If
 Next

  For Each v In Me.Controls
    If TypeName(v) = "ComboBox" Then
        If v.Value = "" Then
            MsgBox "未入力があります"
            v.SetFocus
            Exit Sub
        End If
    End If
 Next

   With Worksheets("表紙")
.Range("C19").Value = TextBox1.Value
.Range("A12").Value = ComboBox11.Value
.Range("C23").Value = ComboBox10.Value
.Range("D33").Value = "〒" & TextBox8.Value & " " & TextBox3.Value
.Range("AL3").Value = ComboBox1.Value
.Range("AO3").Value = ComboBox2.Value
.Range("AS3").Value = Format(TextBox4.Text, "m/d")
.Range("AL14").Value = ListBox4.Value
.Range("AJ15").Value = ListBox1.Value
.Range("AQ15").Value = ListBox2.Value
.Range("AX15").Value = ListBox3.Value
.Range("BF15").Value = TextBox5.Value
.Range("AJ17").Value = ComboBox7.Value
.Range("AY21").Value = TextBox6.Value
.Range("AZ8").Value = ComboBox8.Value
.Range("AZ12").Value = ComboBox9.Value
.Range("P13").Value = Format(TextBox7.Text, "ggg  e""年 ""m""月 ""d""日""")
     End With

End Sub

Private Sub CommandButton1_Click()

    If MsgBox("データをシートに書込ます。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
    appendDateToSheet
End Sub

それともう一点ですが
一度TextBox8をClickしてしまうと郵便番号を入力すれば抜けられるのですが
入力しないで、ほかに進もうとすると"郵便番号が数字ではありません。"が出て抜けられなくなります
抜けられるようにする方法をお願いします。

Private Sub TextBox8_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    Dim dbRes As ADODB.Recordset
'    Dim dbFld As ADODB.Fields
    Dim strSQL As String
    Dim strZIPCODE As String

    ' 閉じる時に本イベントが発生するのを回避
    If swCLOSE = 1 Then Exit Sub
    ' ハイフンを除いた郵便番号を編集
    strZIPCODE = Replace(Trim(TextBox8.Text), "-", "")
    ' 内容チェック
    If IsNumeric(strZIPCODE) <> True Then
        MsgBox "郵便番号が数字ではありません。", vbExclamation
        Cancel = True
        Exit Sub
    ElseIf Len(strZIPCODE) <> 7 Then
        MsgBox "郵便番号が7桁ではありません。", vbExclamation
        Cancel = True
        Exit Sub
    End If
    ' テーブル名,条件を指定してレコードセットを取得する
    strSQL = "SELECT KEN_KANJI,SHI_KANJI,CHO_KANJI FROM YUBIN WHERE ZIPCODE='" & _
        strZIPCODE & "';"
    Set dbRes = New ADODB.Recordset
    dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly
    If dbRes.EOF <> True Then
        ' レコード発見時は住所をセット

        With dbRes
            TextBox3.Text = .Fields("KEN_KANJI").Value & _
                .Fields("SHI_KANJI").Value & .Fields("CHO_KANJI").Value
        End With
    End If
    dbRes.Close
    Set dbRes = Nothing
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 指定コントロールのみチェックスキップについては、いろんな書き方がありますけど
 以下なんか、わかりやすいのではないでしょうか。

        If TypeName(c) = "TextBox" Then
            Select Case c.Name
                Case "TextBox3", "TextBox8"
                    'Nop
                Case Else
                    If c.Value = "" Then
                        MsgBox "未入力があります"
                        c.SetFocus
                        Exit Sub
                    End If
            End Select
        End If

 で、TextBox8 の抜ける抜けないの件、Exitイベントを使っているのが不具合の元凶です。
 Exitイベントは入力しないで、通り過ぎるだけでも発生しますから。
 データが入力されたときのみチェックする、BeforeUpdate や AfterUpdate を使うべきですね。
 Cancel処理が必要なら BeforeUpdateを。

 ところで、このプロシジャ、TextBox8 の値のみならず TextBox3 の値も参照してますよね。
 もし、TextBox8 への入力時、TextBox3 が未入力、ないしは間違い入力の場合、問題ないのでしょうか?

 ここは、何か別のトリガー(コマンドボタンクリック等)で処理したほうが、やりやすいと思います。

( β) 2017/02/21(火) 22:35


( β)さん
Exitイベントが問題だったのですか 助かりました。
ありがとうございます。
以下にて無事抜けることができるようになりました。
Private Sub TextBox8_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim dbRes As ADODB.Recordset
    Dim strSQL As String
    Dim strZIPCODE As String

    ' 閉じる時に本イベントが発生するのを回避
    If swCLOSE = 1 Then Exit Sub
    ' ハイフンを除いた郵便番号を編集
    strZIPCODE = Replace(Trim(TextBox8.Text), "-", "")
    ' 内容チェック
    If IsNumeric(strZIPCODE) <> True Then
        MsgBox "郵便番号が数字ではありません。", vbExclamation
        Cancel = True
        Exit Sub
    ElseIf Len(strZIPCODE) <> 7 Then
        MsgBox "郵便番号が7桁ではありません。", vbExclamation
        Cancel = True
        Exit Sub
    End If
    ' テーブル名,条件を指定してレコードセットを取得する
    strSQL = "SELECT KEN_KANJI,SHI_KANJI,CHO_KANJI FROM YUBIN WHERE ZIPCODE='" & _
        strZIPCODE & "';"
    Set dbRes = New ADODB.Recordset
    dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly
    If dbRes.EOF <> True Then
        ' レコード発見時は住所をセット

        With dbRes
            TextBox3.Text = .Fields("KEN_KANJI").Value & _
                .Fields("SHI_KANJI").Value & .Fields("CHO_KANJI").Value
        End With
    End If
    dbRes.Close
    Set dbRes = Nothing
End Sub
>ここは、何か別のトリガー(コマンドボタンクリック等)で処理したほうが、やりやすいと思います。
↑どのように編集すればコマンドボタン操作が、可能でしょうか?
すみません。知識が乏しく思いつきません よろしくお願いします
(さとし) 2017/02/22(水) 00:17

 コードをよく読まないままコメントしてしまったんですが、TextBox3 は参照しているのではなく
 TextBox8の郵便番号から住所を取得してそれを、TextBox3 に書きこんでいるんですね。

 私が意図したのは、この処理を、現在の CommandButton1_Click の前半処理として位置付けたらいかがかと
 そういうことだったんですが、更新前の確認で、操作者に住所も視覚的に確認させたいですね。

 ただ、Exit を使おうが BeforeUpdateを使おうが、現行のままではTextBox8 が未入力でも更新されてしまいます。
 (郵便番号が任意入力項目ならそれでもいいわけですけど)

 以下のいずれかでやられてはいかがでしょう。

 1.現行のものをBeforeUpdateに変更したままの形で処理。
  この場合は、CommandButton1_Click で TextBox8 の入力も必須チェックに加える。

 2.CommandButton1_Click の前半に、この処理を持ってきて、TextBox3 への転記後、それが表示され目視確認できる状態で
  MsgBox で、更新していいかを確認する。

 ★ただし、そういったこととは別に、住所は必ず郵便番号からの変換という仕様ならいいのですが
  操作者が、任意の住所を手打ちで入力するということもありうるなら、そのあたりの
  ハンドリングも考慮しなければいけませんね。

  さらに、もし、変換のみ ということであれば、TextBox3 ではなく Label にして
  入力できないようにしておくべきだと思いますが。

( β) 2017/02/22(水) 06:10


 追加で、質問のテーマではないのですが。

 TextBox と ComboBox のチェックをわけて 2回ループさせていますが、

 If TypeName(c) = "TextBox" Or TypeName(c) = "ComboBoxBox" Then

 こうすれば1回でいいですよ。

( β) 2017/02/22(水) 06:27


( β)さん
ありがとうございました。
1回で行けました。
> さらに、もし、変換のみ ということであれば、TextBox3 ではなく Label にして
>  入力できないようにしておくべきだと思いますが。
変換後、番地を入力 例「1-1-10」しています。入力できないのは困ります。
> ★ただし、そういったこととは別に、住所は必ず郵便番号からの変換という仕様ならいいのですが
>  操作者が、任意の住所を手打ちで入力するということもありうるなら、そのあたりの
>  ハンドリングも考慮しなければいけませんね。
住所のみ記入もあり得ますが、現状入力が可能ですが、仕様が違いますか?
(さとし) 2017/02/22(水) 15:48

 >住所のみ記入もあり得ますが、現状入力が可能ですが、仕様が違いますか?

 たとえば、操作者が TextBox3 に 生打ちして住所を入力したとします。
 そのあと、TextBox8 に郵便番号を入力するとせっかく、ちゃんと入力したTextBox3 の住所が
 郵便番号に紐付く定型的なものに無条件で上書きされてしまいますよね?

 TextBox8の郵便番号から住所を抽出してTextBox3 に置き換える時点で、TextBox3 に何か入力があれば
 『置き換えますか?』といったメッセージを出して操作者に判断させるとか、
 市販のはがき作成ソフトなんかでは、別途 〒->住所 とか 〒<-住所 なんていうボタンを設けて
 それをクリックした時に変換を実行するという構えにしているものが多いでしょうかね。

( β) 2017/02/22(水) 16:01


( β)さん
ありがとうございます。
現在に使い方ですが、TextBox8に〒番号を入力し、EnterキーでTabIndexの順番で
TextBox3に移動した時点で、住所が表示できるようになっています。

> TextBox8の郵便番号から住所を抽出してTextBox3 に置き換える時点で、TextBox3 に何か入力があれば
> 『置き換えますか?』といったメッセージを出して操作者に判断させるとか
↑これを可能にするには、どのようなマクロを加えればよろしいのでしょうか?
(さとし) 2017/02/22(水) 16:13


 回答の前に。

 >TextBox8に〒番号を入力し、EnterキーでTabIndexの順番で TextBox3に移動した時点で

 あくまで、今後ユーザーフォームを使った処理コードを作っていくときの一般論ですが
 操作者は、必ずしもTabIndexで誘導される順番にデータを入力するとは限りません。

 ユーザーフォーム上のフォーマットはあくまで固定ですよね。
 それに対して、そこに入力する人は、なにがしかのエビデンスのようなものを見ながら打ち込んでいきます。
 エビデンスによってはユーザーフォームで固定にデザインした通りの順番でデータがあらわれないものも
 少なくありません。

 なかには、そのエビデンスを、え〜っと、一番最初のユーザーフォームの項目は・・・あぁ、これだ、と入力。
 次に、二番目の項目は、え〜っと、・・・ あぁ、これだと、さがしながら入力する人もいるでしょう。

 でも、往々にして、エビデンス基準で、エビデンスの最初の項目は、ユーザーフォームでいえば、あぁ、下のほうのこれだ
 ということで、そのテキストボックスをマウスでクリックして入力。
 エビデンスの二番目の項目は、え〜っと、あぁ、ユーザーフォームの真ん中にあるこれだ。
 こんな入力をする人も少なくありません。

 そうすると、TabIndexで誘導する順番にはならない。操作によっては、全く選ばれないテキストボックスも
 でてくるかもしれない。つまり未入力になる可能性がやまほどある。

 こういうことを念頭に置いて開発していくことが肝要かと思います。

 前置きが長くなりました。

 現在の  ' テーブル名,条件を指定してレコードセットを取得する のコメントの上に

 If TextBox3.TextLength > 0 Then
   If MsgBox("入力済みの住所を置き換えますか?",vbYesNo) = vbNo The Exit Sub
 End If

 こんなコードをいれておくとか。(掲示板上で手打ちしましたので、記述間違いあれば御容赦)

( β) 2017/02/22(水) 17:14


( β)さん
ユーザーフォームの作り込みについての、考え方 想定方法など
いろいろ考えなくてはならないのですね。参考になりました。
ありがとうございました。
また、解らなくなりましたらご指導お願いします。

(さとし) 2017/02/22(水) 17:27


コメント返信:

[ 一覧(最新更新順) ]


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