マクロで文字列の正誤チェックを行う方法

このQ&Aのポイント
  • マクロを作成して文字列の正誤チェックを行いたい場合、以下の手順で実装できます。
  • セルA1からA20にデータを入力し、確認ボタンを押すと、入力した文字列が指定の形式になっているかを確認します。
  • 入力された文字列が正しい場合は「問題ありません」と表示され、誤りがある場合は「間違っています」と表示されます。
回答を見る
  • ベストアンサー

入力した文字列の正誤チェック

下記の様に動作するマクロを組みたいのですが、自分なりにチャレンジして みましたが、意図した動作が実現できず困っています。ご教授お願い致します。 1.セルA1-A20にデータを入力。 2.予め作っておいた"確認"のコマンドボタンを押すと、入力した文字列が   "○○○○○-○"の7文字で構成される文字列になっているか確認し、   一つでも誤りがあれば"間違っています"、誤りがなければ"問題ありません"   と表示。※○に入る数値は、0-9の数字。 3.A1-A20のすべてのセルにデータを入力しない場合もあるので、空白が  存在した時点でプログラムを終了。 ※私が作ったプログラムは、すべてのセルに入力しないと誤った文字列が    入っているのに、"問題ありません"と表示されてしまいます。

  • MAX33
  • お礼率46% (190/405)

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.6

セルとあるので、Excelマクロかな?違っていたら無視してください。 VBAは標準で正規表現をサポートしていないので、RegExp オブジェクトを作成します。 下記のVBAコードを標準モジュールへ記述のうえ、Sample1を実行してください。 ・A1~空白があるセル(最大A20)までを判定対象とします。 ・正規表現によるマッチングで、一致しない場合は対象セルをセル選択して結果表示。 ・全て一致した場合は「〇件、問題ありません」と表示。 コード的には下記サイトの正規表現によるマッチングコードを書き換えたものになります。 (参考にどうぞ) http://officetanaka.net/excel/vba/tips/tips38.htm ■VBAコード Sub Sample1()   Dim RE, r As Range   Dim myCell As Range, cnt As Integer   Set RE = CreateObject("VBScript.RegExp")   With RE     '正規表現を定義     .Pattern = "[0-9]{5}\-[0-9]" ''検索パターンを設定     .IgnoreCase = False     ''大文字と小文字を区別しない     .Global = True       ''文字列全体を検索     For Each r In Range("A1:A20")       If Len(r.Value) = 0 Then Exit For       '正規パターンの一致確認       If .Test(r.Value) Then         '正解数をカウント         cnt = cnt + 1       Else         '誤っているセルを格納         If myCell Is Nothing Then           Set myCell = r         Else           Set myCell = Union(myCell, r)         End If       End If     Next r   End With   '結果表示   If myCell Is Nothing Then     MsgBox cnt & "件、問題ありません"   Else     myCell.Select     MsgBox myCell.Count & "件の間違いがあります"   End If   Set RE = Nothing   Set myCell = Nothing End Sub

MAX33
質問者

お礼

ありがとうございました。 参考にさせて頂きます。

その他の回答 (5)

回答No.5

個人的にはこっちの方が好きです。 途中で抜け出さないで全部のセルA1~A20をチェックして 不備があるセル全てを選択状態にします。 Sub myCheck_2()   Dim R As Range   Dim S As String   For Each R In Sheets("Sheet1").Range("A1:A20")     If Not R.Value Like "[0-9][0-9][0-9][0-9][0-9]-[0-9]" Then       S = S & "," & R.Address     End If   Next   Debug.Print S   If Len(S) <> 0 Then     S = Mid(S, 2)     MsgBox "Nooooooo"     Range(S).Select   Else     MsgBox "Okkkkkkkkkkkk"   End If End Sub >VBAの質問をされる時は必ず作成されたコードを記載するようにしましょう。 Me too! 質問の趣旨とは離れてしまいますが 必ず20個を正確に入力しなくてはいけないのなら WorkSheetのChangeイベントで入力する都度チェックを行った方が 入力する側にとっては親切だと思います。

MAX33
質問者

お礼

ありがとうございました。 参考にさせて頂きます。

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.4

NotFound404 さんのNO3に回答されてる方法で質問内容はクリアされていると思います。 msgboxの表示はセルアドレスとOK又はNOを表示させた方がどのセルに誤りがあるかユーザーが判断し易いのではかと思い、NotFound404 さんのコードを若干変更したのが下記コードです。 おせっかいな話で申し訳ありません。 VBAの質問をされる時は必ず作成されたコードを記載するようにしましょう。 Sub myCheck() Dim R As Range Dim mystr As String For Each R In Sheets("Sheet1").Range("A1:A20") If R.Value = Empty Then Exit For If Not R.Value Like "[0-9][0-9][0-9][0-9][0-9]-[0-9]" Then mystr = mystr & R.Address(RowAbsolute:=False, ColumnAbsolute:=False) & " NO" & vbCrLf Else mystr = mystr & R.Address(RowAbsolute:=False, ColumnAbsolute:=False) & " OK" & vbCrLf End If Next MsgBox mystr End Sub

MAX33
質問者

お礼

ご教授ありがとうございます。 勉強させて頂きます。

回答No.3

わざわざ Set してもメリットが無いので、こっちにします。 見つかった最初のセルに行くようにしました。 Sub myCheck() Dim R As Range For Each R In Sheets("Sheet1").Range("A1:A20") If Not R.Value Like "[0-9][0-9][0-9][0-9][0-9]-[0-9]" Then MsgBox "Nooooooo" R.Select Exit Sub End If Next MsgBox "Okkkkkkkkkkkk" End Sub

MAX33
質問者

お礼

ご教授ありがとうございます。 勉強させて頂きます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

A列データ最下行を捉えるコードがわからないということかな。 余り現実的でない例題だがやってみた。 作る人によって、相当差があると思う。 例データ A列 B列は右側で、エラー指摘コメント aaaaa-a aaaa-a 入力文字に漏れあり aaaaaa-a 入力文字余分文字あり aaaaa-a aaaaa-a aaa-aa-a 入力文字余分文字あり aaaaa-a aaaaa-a aaaaaaa -が漏れている aaaaa-a aaaaa-a aaaaa-a aaaaa-a aaa-a 入力文字に漏れあり aaaaa-a aaaaa-a aaaaa-a 標準モジュールに Sub test01() lr = Range("A1000").End(xlUp).Row MsgBox lr Select Case lr Case 1 errmsg1 = "入力行なし " MsgBox errmsg1 Exit Sub Case Is > 20 errmsg1 = "入力21行以上" MsgBox errmsg1 Exit Sub Case Else End Select '-- Range("B1:B20").Clear For i = 1 To lr errmsg2 = "" t = Range("A" & i).Value tl = Len(Range("A" & i).Value) '--入力文字数 Select Case tl Case Is < 7 errmsg2 = "入力文字に漏れあり " Case 7 p = InStr(t, "-") MsgBox i & " " & p If p = 0 Then errmsg2 = "-が漏れている" ElseIf p <> 6 Then errmsg2 = "-の前後の文字数が誤り" Else End If Case Is > 7 MsgBox "AAAA" errmsg2 = "入力文字余分文字あり" End Select p = InStr(t, "-") If p = 0 Then errmsg2 = "-が漏れている" End If Range("B" & i) = errmsg2 Next i End Sub Case文の利用とIf文が混じったが、統一することは簡単。 Instrっ関数の部分はMID関数でも似たもの。 「正規表現」を使うともう少し正確にチェックできるかもしれないが、質問者はそこまではいってないと推測した。 ーー 文章で表して、どういうチェックが出来るか列挙してみて、自分の置かれたニーズや自分の技量を考えてチェックする内容を決めるものだ。それ(チェックポイントがなにか)が質問に書いてない。 上記は急いで作ったもので、十分テストすること。 インプット(データ)チェックというのは、内容的に、難しいものだというのがわかりますか。本件は関連チェックが考えられていないのでその分簡単なんですが。 aaaaa-a aaaaa-a

MAX33
質問者

お礼

ご教授ありがとうございます。 勉強させて頂きます。

回答No.1

こんな風? Sub myCheck() Dim Rs As Range, R As Range Set Rs = Range("A1:A20") For Each R In Rs If Not R.Value Like "[0-9][0-9][0-9][0-9][0-9]-[0-9]" Then Set Rs = Nothing MsgBox "Nooooooo" Exit Sub End If Next Set Rs = Nothing MsgBox "Okkkkkkkkkkkk" End Sub

MAX33
質問者

お礼

ありがとうございました。 参考にさせて頂きます。

関連するQ&A

  • Excel 列に入力のある文字列を重複なく取り出す

    Excel2003を使用しています。 下記のようなデータがあったとして、 A列に入っている文字列を右のように重複なく抜き出す 方法はありますでしょうか。 そして、それを1つのセルにまとめることはできますでしょうか? 1つのセルにまとめたものは別シートに表示したいです。 できるだけ簡単な方法がよいです。 A列   欲しいデータ   表示したい形式 A-1    A-1 A-2    A-2 A-3 →  A-3     → A-1,A-2,A-3   A-1 A-2 セルを1つにまとめる方法はいくつかわかるのですが、 列から入力のあるものを取り出す方法がわかりません。 同じような質問を探していたのですが、 見つけきれなかったので、お分かりの方がいらっしゃい ましたら、お教え下さい。 明日までの期限なのですが、どうしてもうまくできずに 困っております。よろしくお願い致します。

  • IF関数で0より大きい数値が入力されたら「あ」と表示、文字列の場合は空白としたい

    エクセル2003です B1に =IF(A1>0,"あ","")とすると「0」のときは、空白となりますが文字列が入力されたときにも「あ」と表示されてしまいます。 A1セルに「0」より大きい数値が入力されたときだけ、B1セルに「あ」と表示したいのです。 よろしく御願いします。

  • A列に文字列または数字を入力したら隣接するD列に今日の日付が入るようにしたいです

    A列に文字列または数字を入力したら 隣接するD列に今日の日付が入るようにしたいです。 (A1に「あ」と入力したら、 D1に「2007/10/25」が自動的に入力されるようにしたいです) これはIF関数を利用するのでしょうか?? どんどんデータが多くなっていちいち数式をオートフィルするのは面倒だし オートフィルタをかけて「空白のセル」を検索した時に、 IF関数で””のセルも空白セルとして認識されるのが嫌なので 数式以外でこの方法を行うことは出来ないでしょうか? よろしくお願い致します。

  • マクロを使って文字が入力されたセル数を数える

    マクロを用いて、文字が入力されたセル数をカウントしたいと考えていますがうまくいかず悩んでおります... 具体的には、セルB1からB1000にデータが入力された場合、左隣のA列に1から番号を付したいと考えています. B列が空白のままの行は、A列も空白にしておきたいです. (セルB1からB1000まで全てにデータが入力された場合、A1からA1000には1から1000までの番号が入る) また、A列に付された番号を判断し、100番毎にA列からE列までセル背景を色分けしていきたいと考えています. (B列が空白ならxlNoneでその行は無色のままにしたい) セル背景の色分けだけであればうまくいったのですが、B列の入力状況により自動でA列に番号(数字)を変化させたら思い通りに動かず困っています. ご教示、宜しくお願いします.

  • エクセルのマクロ(指定列の空白にひとつ上の文字を入力し続ける)

    エクセルのマクロを教えてください。 指定列の空白にひとつ上の文字を入力し続けるマクロです。 A列指定 A2からスタートし、1000行くらいあるデータ 空白があった場合ひとつ上の文字を入力 空白は、2行連続・3行連続となることもあるが大抵は1行空白 この場合、空白セルの上で一番近いデータをコピーする A列のデータは、文字・数字・日付と様々 1000行ある場合もあるが、それ以下の場合もあるので、10行空白が続いたらマクロが自動的に終了 エクセル2003使用 よろしくお願いいたします。

  • 文字列を2つに分ける

    10個近くある異なるブックのシートを、新しい1つのブックにまとめてしまおうと考えています。 手動で1つのブック内の複数シートを選択して、新しいブックにコピーしようとしましたが、1つのセルに入力されている文字列の中に、かなり長い(255字以上)ものが含まれており、コピーした際にデータが捨てられてしまいます。 長い文字列を、事前にマクロで探して、2つのセルに分ける (たとえば、A1に長い文章があるなら、A2にセルを挿入して、文字列を2つにわける) ことは可能でしょうか? 分けたあとにそれぞれが255字以下になっていることも確認したいと思っています

  • Excel関数で、長さ0の文字列(

    Excelで、両軸対数の散布図(X列,Y列)を作成していますが、X列,Y列ともに、データがない部分があります。 X,Yともに他のデータの関数になっており、 データが不適格の場合、空白セルを入力しています。 しかし、空白セルとして、("")を入力すると、 X,Yの散布図が、散布図にならず、困っています。 具体的には、 IF(Y>0, Log(Y),"") といった感じです。 恐らく、空白セルが長さ0の文字列("")と解釈されているからだと思います。 このセルをDeleteで削除すると、グラフはうまく表示されるようですが、それでは、関数が機能しません。 そこで、関数の出力で、完全な空白セルをセルの値にする方法を教えてください。

  • エクセルで入力した文字列を他のセルにも自動的に入力できるようにしたいです。

    エクセルで文字列を入力した場合、指定したセルにも同じ文字列が自動的に入力されるようにしたいと思っています。 調べたところ貼り付け時に形式を選択して貼り付ける「リンク貼り付け」というのがあるので試してみたんですが、 貼り付け先の空白のセルに強制的に0が入力されてしまいます。 リンク貼り付けを保持したまま空白セルを空白セルのままにすることはできないでしょうか。 よろしくお願いいたします。

  • 文字列が入力されている範囲を知る方法について

    各セルにおいて、文字列が入力されている(空白でない) 行の最上端と最下端のセルおよび列の最左端と最右端のセルの 位置を素早く求める方法があれば教えて下さい。

  • 文字列の入力について

    http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H11b2/pm11.html このプログラムを完成させたいのですが、 例えば、「abc dfg hij ・・・」とscanfで文字列入力した場合、空白以降(スペース)が読み取れません。 (「abc」しか読み取れません) スペース以降の文字列もキーボード入力できるようにするにはどうしたらいいのでしょうか?