文字数の入力エラーメッセージと書式

このQ&Aのポイント
  • 質問文は、入力された文字の長さをチェックし、7桁でない場合にエラーメッセージを表示する処理についてです。
  • さらに、入力された文字の先頭が「0」または「00」の場合、入力された文字数に「0」または「00」を含んで郵便番号の書式(000-0000)でエラーメッセージを表示させたいという要件があります。
  • この処理は、VBAを使用してワークシートの変更イベントに実装されています。入力エラーメッセージは、「7桁で入力してください。」というメッセージとして表示されます。
回答を見る
  • ベストアンサー

数字「0」の入力を文字数としてカウント

入力した文字数が7桁でないとエラーメッセージを表示する処理(下記)を作成しました。 入力した文字の先頭が「0」の場合、または「00」の場合に、「0」「00」を含む文字数をカウントし、 エラーメッセージを表示させ、更に表示書式を”000-0000”(郵便番号)としたい。 ご教示をお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim wCellVal As String With Worksheets("Sheet1") wCellVal = .Cells(Target.Row, Target.Column).Value End With If Target.Address(False, False) = "A1" Then If Len(wCellVal) <> 7 Then '文字数チェック MsgBox "7桁で入力してください。", vbOKOnly + vbExclamation, "入力エラー" Exit Sub End If End If End Sub よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

アタマゼロのチェックとハイフン表示を両立する方法は無いと、お話ししてあります。 またご相談の事をやるには文字列書式にするしかないとも、お話ししました。 >数字「0」の入力を文字数としてカウント 標準、数値、郵便番号の書式設定のセルでは、エクセルは「アタマにゼロを添えて入力された」と知る事が出来ません。なので文字列書式にします。 準備: A列の書式設定を文字列にしておく シートモジュールに記載する: private sub Worksheet_Change(byval Target as excel.range)  dim h as range  dim buf as string  on error resume next  for each h in application.intersect(target, range("A:A"))   if h <> "" then    h.numberformat = "@"    buf = replace(h.value, "-", "")    if len(buf) <> 7 then     msgbox "N/A" & vblf & h.value     application.enableevents = false     h.clearcontents     application.enableevents = true    else     application.enableevents = false     h = format(buf, "000-0000")     application.enableevents = true    end if   end if  next end sub その他機能については、随意に自力で追加してください。

Fred028548
質問者

お礼

ご指摘いただいていたにも拘らず、理論的に考える能力が足りず、申し訳ありませんでした。 お手数をお掛けし、感謝し尽くせません。 本当にありがとうございました。

その他の回答 (2)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

>入力した文字の先頭が「0」の場合、または「00」の場合に、「0」「00」を含む文字数をカウントし、エラーメッセージを表示 郵便番号には「001-0010」と言うのが存在しますよ。 http://www.post.japanpost.jp/cgi-zip/zipcode.php?pref=1&city=1011020&id=101 セルに「数値で入力している場合」には「0010010」と打ち込むと「10010」になっちゃいます。 なので「7桁かどうか」では正しく判定できません。 北海道は、頭の3桁が001~099になっているので、それを考慮して下さい。7桁縛りにしてはいけません。 >更に表示書式を”000-0000”(郵便番号)としたい。 「セルの書式」の表示形式の「その他」の所に「郵便番号」がありますよ。 最も簡単なエラー判定は「入力した数値が10000~9999999の範囲にあるかどうか?」です(もしセルに数値で入力するなら) OKの範囲が「0~9999999」じゃない理由は「頭の3桁の範囲が001~999」だからです。 因みに、後ろの4桁は「0000から9999まで、何でもあり」なので、チェックしてはいけません(「上記に記載がない場合」の郵便番号は、後ろ4桁が「0000」になります。また、事業所の個別郵便番号は、後ろ4桁が「9010」など大きい数字になります)

Fred028548
質問者

お礼

ご教示、ありがとうございました。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

wCellVal = .Cells(Target.Row, Target.Column).Value を wCellVal = .Cells(Target.Row, Target.Column).Text に If Len(wCellVal) <> 7 Then を If Len(wCellVal) <> 8 Then に変更すればよろしいかと。 Textは表示形式を適用して取得。Valueはセルの数値のみ取得。 なので、Textの場合、ハイフンも取得するので、8桁あるかで判断。 Private Sub Worksheet_Change(ByVal Target As Range) Dim wCellVal As String With Worksheets("Sheet1") wCellVal = .Cells(Target.Row, Target.Column).Text End With If Target.Address(False, False) = "A1" Then If Len(wCellVal) <> 8 Then '文字数チェック MsgBox "7桁で入力してください。", vbOKOnly + vbExclamation, "入力エラー" Exit Sub End If End If End Sub

Fred028548
質問者

補足

早速、ありがとうございます。 ”01234567”と入力した時、目論見では、文字数オーバーなので、エラー表示して欲しいのですが、先頭の「0」を除いて処理されて、”123-4567 ”と表示され、エラーも出ません。 言葉足らずで申し訳ありませんでした。 ”01234567”の「0」をカウントして、入力エラーにしたいのですが、何か方策ありますでしょうか? お手数をお掛け致しますが、よろしくお願い致します。

関連するQ&A

  • VBAの入力規則について質問です。

    VBAの入力規則について質問です。 Excelで、D列は全角50文字(半角100文字)以内の入力を可能とし、 それ以上の入力の場合、エラーを表示させたいと思います。 全角と半角をバイト数で判別し、以下のようなコードを考えましたが、 全角の場合しかうまくできません。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ByteCount As Long ByteCount = LenB(StrConv(Target, vbFromUnicode)) If Target.Column = 4 Then Select Case ByteCount Case Is > 100 With Target.Validation .Add _ Type:=xlValidateTextLength, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=1, Formula2:=100 .ErrorTitle = "入力エラー" .ErrorMessage = "全角50文字(半角100文字)以内で入力してください。" .IgnoreBlank = False End With Case 1 To 100 With Target.Validation .Add _ Type:=xlValidateTextLength, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=1, Formula2:=50 .ErrorTitle = "入力エラー" .ErrorMessage = "全角50文字(半角100文字)以内で入力してください。" .IgnoreBlank = False End With End Select End If End Sub アドバイスをよろしくお願いいたします。

  • 列が対象のChangeイベントの入力セル選択

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myrang As Range 'K列に入力した時 If Target.Column = 11 And Target.Count = 1 Then With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7) Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False) End With If myrang Is Nothing Then Dim intret As Integer       '☆ intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly, "エラー発生") Else      処理2のコード End If Target.Offset(2, 0).Select End If     End sub 以上のコードがあります。 ’☆のメッセージボックスを出し、OKを押したとき、入力したセルを選択して終了させたいのですが、 今のままでは、最後の Target.Offset(2, 0).Select を選択してしまいます。 どのようにすればいいのでしょうか?

  • excel マクロでの特殊文字入力方法

    マクロで特殊文字入力は出来ないのでしょうか? やりたい内容は、セルをダブルクリックした時に✓を表示させたいのです。 セルをダブルクリックした時に○を表示するマクロが、下記の通りである時、 ○の代わりに✓を表示させたいのですが、VBAで○の所に✓で書き換えると ?と表示されてしまいます。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) With Target If .Value = "○" Then .Value = "" Else .Value = "○" End If End With End Sub

  • SelectionChangeイベント 文字列エラ

    エクセルvbaなのですが セルをクリックしたときに、該当する値ならメッセージを表示させる際に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = 1Then MsgBox "" End If End Sub ならエラーにならずに動くのに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "運賃" Then MsgBox "" End If End Sub のように文字列にすると、型が一致しません。 と言うエラーになります。 If Target.Value = "運賃" Then の時でも、空白セルや数値が入ったセルをクリックした際はエラーになりません。 どのような型にすればいいのでしょうか? 実際、「運賃」と言う値が入ってるセルをクリックしても同じエラーが発生します。

  • VBAの時間入力について

    先日、時間を文字列で、HH:mmのフォーマット入力するPGを教えて頂き、 内容理解をしているのですがわからない部分があります。 ★の部分の条件で、00:00も入力したいです。 ご存知か方がおられましたら教えてください。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から 'Intersect:http://officetanaka.net/excel/vba/tips/tips118.htm 'Is Nothing:nullではない 'Selection.Count <> 1:選択数が1以下ではない(<> :等しくない) ' Not IsNumeric(Target):数値ではない If Intersect(Target, Columns(12)) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub ' 'Target:セルの値は24:00以下 '2つの数値の除算を行いし,その剰余を返す 'Mod:2つの数値の除算を行いし,その剰余を返す '★ここで00:00時も入力したい。 If Target <= 2400 And Target Mod 100 < 60 Then ' Application.EnableEvents = False ' With Target ' If Len(Target) = 3 Then .Value = 0 & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then .Value = Left(Target, 1) & ":" & Right(Target, 2) Else .Value = Left(Target, 2) & ":" & Right(Target, 2) End If .NumberFormatLocal = "hh:mm" ' End With ' Application.EnableEvents = True ' Else MsgBox "入力値が不正です。" ' With Target ' .Value = "" .Select End With Exit Sub ' End If End Sub 'この行まで

  • 数字と数字のー(ハイフン)は消去しないVBA

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myAsc As Integer, InSP As Integer, myFlag As Integer Dim myStr As String If Intersect(Target, Range("B4:CH4")) Is Nothing Then Exit Sub If Application.CountBlank(Target) > 0 Then Exit Sub Application.EnableEvents = False Target = StrConv(Target, vbUpperCase + vbNarrow) myStr = Target.Value InSP = 0: myFlag = 0 For i = 1 To Len(myStr) myAsc = Asc(Mid(myStr, i, 1)) If Not (myAsc >= 65 And myAsc <= 90) Then If Not (myAsc >= 48 And myAsc <= 57) Then If myAsc = 32 Then InSP = i Else MsgBox ("-(ハイフン)は使用出来ません。クリアします。" & "" & Mid(myStr, i, 1) & "") Target.Select ' Selection.ClearContents Application.EnableEvents = True Exit Sub End If ElseIf myFlag = 0 And InSP = 0 Then myFlag = i End If End If Next If myFlag <> 0 Then Target.Value = Left(myStr, myFlag - 1) & Mid(myStr, myFlag, 99) End If Application.EnableEvents = True End Sub B4:CH4の範囲で半角英数字の小文字で入力したら自動で大文字となり、-(ハイフン)を入力したら文字がクリアされるVBAがあります。 質問ですが先ほどのVBAで英字と数字の間のー(ハイフン)はクリア対象となり、数字と数字の間にー(ハイフン)の場合はクリアしないVBAはどの様にすれば良いでしょうか? ※「GRE-879」の時は消去対象となり、「GRE868-76」の時は消去しない感じです。

  • 数字入力の省略方法について教えてください

    ●前にご指導いただいた、質問の関連質問をさせていただきます。 ●3月24日に、QNo.2861054 「数字入力の省略方法について教えてください 」でご指導いただいた者です。 http://oshiete1.goo.ne.jp/qa2861054.html -------- ●その時の質問内容 エクセル初心者です。 F列に数字を入力していますが、入力する数字の下2桁は必ず 00なので、それを省略して入力したい。 ・123,400円を1234と入力し123,400と表示したい。 ●その時ご指導いただいた回答 (回答者:nobu555様) ------------------- マクロです。 シート名を右クリックしてコードの表示で出てきたシートに 下記をコピーして見てください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 6 Then Exit Sub If Selection.Count > 1 Then Exit Sub Application.EnableEvents = False On Error GoTo line If IsNumeric(Target.Value) Then Target.Value = Target.Value * 100 line: Application.EnableEvents = True End Sub コピーしたら、終了してエクセルに戻り、 F列に数値を入力すると100倍になります。 ------------------- ・おかげさまで、思ったとおりの処理が出来て感謝しております。 ●別件の下記条件でも使用させていただきたく、お願い致します。 入力列が、AG列・Ak列・Ao列・AS列と複数列となり、他はまったく同じです。 宜しくお願い致します。

  • Excel セルをクリックするだけで入力(エクセル2003)

    http://questionbox.jp.msn.com/qa915096.html からの転載で申し訳ありません。 この中で、jindonさまの方法で、2つの文字の入れ替えはできました。 ------------------------------------------------ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) With Target If .Row=1 And .Column=1 Then If .Value = "○" Then .Value = "" Else .Value = "○" End If End If End With End Sub ------------------------------------------------ そこで、例えば○△×のように、順番に3つの文字を入れ替えるにはどう記述すればよいでしょうか? よろしくお願いいたします。

  • 特定の文字を、入力文字数に含めない方法は(VB.NET)

    VB.NETにて特定の文字を、入力文字数に含めないようにするにはどのような処理を行ったらよいのでしょうか? 以下は実際に試みた方法です。「型 'TextBox' でパブリック メンバ 'TextLength' が見つかりません。」というエラーがおきました。 Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress 'マイナスかドットであるか判定 If e.KeyChar = "-" OrElse e.KeyChar = "." Then sender.TextLength = sender.TextLength - 1 End If End Sub

  • エクセル:文字列のバイト数が欲しい

    セルB1に、  半角スペース、全角2文字、半角スペース、 と入力しました。 このシートの別のセルに、 =Len(B1)と入力すると4と表示され、 =LenB(B1)と入力すると6と表示されますので、 間違いなく「半角スペース・全角2文字・半角スペース」がB1に入っているはずです。 このシートのコードに、 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$L$1" Then     MsgBox LenB(Cells(1, 2).Value)   End If End Sub と打ちました。 ここでシート上のセルL1に何か入力するとメッセージボックスが出るのですが、 メッセージボックスに出る値は8です。 何が原因でしょうか。 6が表示されて欲しいのですが(文字列のバイト数が欲しい)、 どのようにコードを書けばよいでしょうか。 実際にB1に入れていた文字は、 1B です。 (半角スペース・全角数字1・全角英字B・半角スペース)

専門家に質問してみよう