[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『未入力を除外するには(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
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
>住所のみ記入もあり得ますが、現状入力が可能ですが、仕様が違いますか?
たとえば、操作者が TextBox3 に 生打ちして住所を入力したとします。 そのあと、TextBox8 に郵便番号を入力するとせっかく、ちゃんと入力したTextBox3 の住所が 郵便番号に紐付く定型的なものに無条件で上書きされてしまいますよね?
TextBox8の郵便番号から住所を抽出してTextBox3 に置き換える時点で、TextBox3 に何か入力があれば 『置き換えますか?』といったメッセージを出して操作者に判断させるとか、 市販のはがき作成ソフトなんかでは、別途 〒->住所 とか 〒<-住所 なんていうボタンを設けて それをクリックした時に変換を実行するという構えにしているものが多いでしょうかね。
( β) 2017/02/22(水) 16:01
> 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.