• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:セルの中の文字判定の方法)

セルの中の文字判定の方法

このQ&Aのポイント
  • セルの中のテキストの英文字と数字が全て半角であるかどうか、カタカナが全て半角であるかどうかをチェックする方法について教えてください。
  • 全ての英文字と数字が半角であり、全てのカタカナが半角である場合はOKとし、混在している場合はエラーとする方法が知りたいです。
  • テキストまたはセルの色を変えてエラーを表示する方法も教えてください。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.8

チェックしたい文字があるセル範囲を選択してマクロを実行する形式です。    やはり細かな定義が気になります。  「カタカナ」とは何か。モジュールでは「ァ」(全角カタカナの小さいア)から「ン」までとしていますが、小さい「ケ」などもあります。モジュールの最初を必要な文字に変更してください。記号も同じです。円マークは独自に処理しています。    また、カタカナは混在だけがダメですが、最初に半角・全角どちらに色を付けるか決めてしまうと正しい場合(半角だけ、全角だけ)にも色を塗ったりしかねません。そのため、最初に出てきた方は色を塗らずに2つ目の種類を塗るようにしています。    やっていることは整理できたと思うんですが、メッセージを作り出すのにモジュールの半分程度を使っているかもしれません。     >~当の文字の色を変える機能を追加することは可能なのでしょうか? 赤で表示するようにしてみました。   >記号のOK/NGの条件は >●¥(円)は常に全角=OK 半角=NG このようにしてみましたが他とは異質な感じでモジュールが長くなりました。Like演算子の¥(円)の結果が?でした。長くなるので円マークに対するメッセージを特別に作るとかはしていません。   >●「」()。、・はカナが全角のときは全角、半角のときは半角で」統一されていればOK このようにしました。     標準モジュール(Excel2010です)   Public Const OK_ALNM = "[A-z 0-9]" '英数字半角 Public Const NG_ALNM = "[A-z 0-9]" '英数字全角 Public Const HanKANA = "[ァ-ン ゛゜ 「」()。,・]" 'カタカナ半角 Public Const ZenKANA = "[ァ-ン 「」()。、・]" 'カタカナ全角 Sub test01()   Dim OK_KANA As String, NG_KANA As String 'カタカナ許容、不許容   Dim msgAry As Variant 'メッセージ     msgAry = Array("", "は全て半角です。", "は全て全角です。", _              "に全角/半角が混在しています。")      Dim rg As Range     'セル   Dim str As String     '文字列   Dim elm As String     '1文字   Dim L As Integer     '文字カウンタ      '英数字・カタカナの有無、0:有無,1:半角,2:全角,3:混在   Dim chkALNM(3) As Boolean   Dim chkKANA(3) As Boolean   Dim okKana As Integer, ngKANA As Integer 'チェックするカタカナ区分      For Each rg In Selection     rg.Font.ColorIndex = xlAutomatic     str = rg.Value     For L = 1 To Len(str)       elm = Mid(str, L, 1)       If elm = "\" Then         Call fontColorRed(rg, L)       ElseIf StrConv(elm, vbNarrow) Like OK_ALNM Then '英数字         chkALNM(0) = True         If elm Like OK_ALNM Then           chkALNM(1) = True         ElseIf elm Like NG_ALNM Then           chkALNM(2) = True: Call fontColorRed(rg, L)         End If       Else         'カタカナ         If chkKANA(0) = False Then 'カタカナの1文字目           chkKANA(0) = True           '最初のカタカナで全角半角どちらをOKにするか決定           If elm Like HanKANA Then             OK_KANA = HanKANA: NG_KANA = ZenKANA             okKana = 1: ngKANA = 2: chkKANA(okKana) = True           Else             OK_KANA = ZenKANA: NG_KANA = HanKANA             okKana = 2: ngKANA = 1: chkKANA(okKana) = True           End If         Else  'カタカナ2文字目以降           If elm Like OK_KANA Then             chkKANA(okKana) = True           ElseIf elm Like NG_KANA Then             chkKANA(ngKANA) = True: Call fontColorRed(rg, L)           End If         End If       End If     Next          '判定の整理(混在を「3」で確定)     If chkALNM(1) And chkALNM(2) = True Then '英数字       chkALNM(3) = True           '確定       chkALNM(1) = False: chkALNM(2) = False 'クリア     End If     If chkKANA(1) And chkKANA(2) = True Then 'カタカナ       chkKANA(3) = True           '確定       chkKANA(1) = False: chkKANA(2) = False 'クリア     End If          'メッセージの整形     Dim msgALNM As String, msgKANA As String '出力メッセージ     Dim idxALNM As Integer, idxKANA As Integer 'メッセージのindex     msgALNM = "英数字": If chkALNM(0) = False Then msgALNM = ""       idxALNM = -(chkALNM(1) * 1 + chkALNM(2) * 2 + chkALNM(3) * 3)     msgKANA = "カタカナ": If chkKANA(0) = False Then msgKANA = ""       idxKANA = -(chkKANA(1) * 1 + chkKANA(2) * 2 + chkKANA(3) * 3)          rg.Offset(0, 1) = msgALNM & msgAry(idxALNM) & _              msgKANA & msgAry(idxKANA)          Erase chkALNM, chkKANA   Next End Sub 'フォントを赤にする Sub fontColorRed(rg As Range, L As Integer)   rg.Characters(Start:=L, Length:=1).Font.ColorIndex = 3 End Sub

roid_moon
質問者

お礼

何度も丁寧なアドバイスありがとうございます! ご指摘の通り、定義のあいまいな部分でいろいろと考えなくてはいけないことが多く、御礼も遅れてしまっていました。 申し訳ありません。 現状まだこの問題が解決できていないのですが、非常に丁寧且つわかり易いアドバイスをいただいたので、こちらの回答をベストアンサーにさせていただきます。 tom04さんにも非常にすばらしいアドバイスをいただいたのでお二方につけたい気持ちでいっぱいなのですが、今回は申し訳ありません。 条件定義をもう少し煮詰めて再トライするつもりでいますが、その際行き詰ったらまた改めて質問させていただくつもりですので、そのときはよろしくお願いいたします。

その他の回答 (7)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.2です。 前回のコードは全て削除して↓のコードにしてみてください。 Sub Sample2() Dim i As Long, k As Long, str As String Dim cnt1 As Long, cnt2 As Long, cnt3 As Long Dim cnt4 As Long, cnt5 As Long, cnt6 As Long Dim myMsg1 As String, myMsg2 As String, myMsg3 As String Dim myMsg4 As String, myMsg5 As String, myMsg6 As String myMsg1 = "英数は全て全角。" myMsg2 = "英数は全て半角。" myMsg3 = "英数は全角・半角混在。" myMsg4 = "カナ・記号は全て全角。" myMsg5 = "カナ・記号は全て半角。" myMsg6 = "カナ・記号は全角・半角混在。" Range("A:A").Font.ColorIndex = xlAutomatic Range("C:D").ClearContents For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row For k = 1 To Len(Cells(i, "A")) str = Mid(Cells(i, "A"), k, 1) If StrConv(str, vbWide) Like "[A-z 0-9]" Then '←全角文字 cnt1 = cnt1 + 1 '←英数すべての数 If str Like "[A-z 0-9]" Then '←全角文字 cnt2 = cnt2 + 1 '←全角英数文字数 Else cnt3 = cnt3 + 1 '←半角英数文字数 End If Else If StrConv(str, vbWide) Like "[ア-ン ¥ 「 」 ( ) 、 。 ・]" Then cnt4 = cnt4 + 1 '←カナ・記号すべての数 If Not str Like "[ア-ン ¥ 「 」 ( ) 、 。 ・]" Then '←全角文字 cnt5 = cnt5 + 1 '←カナ・記号半角文字数 Else cnt6 = cnt6 + 1 '←カナ・記号全角文字数 End If End If End If Next k If cnt1 > 0 Then If cnt1 = cnt2 Then Cells(i, "C") = myMsg1 ElseIf cnt1 = cnt3 Then Cells(i, "C") = myMsg2 Else Cells(i, "C") = myMsg3 End If End If If cnt4 > 0 Then If cnt4 = cnt5 Then Cells(i, "C") = Cells(i, "C") & myMsg5 ElseIf cnt4 = cnt6 Then Cells(i, "C") = Cells(i, "C") & myMsg4 Else Cells(i, "C") = Cells(i, "C") & myMsg6 End If End If For k = 1 To Len(Cells(i, "A")) str = Mid(Cells(i, "A"), k, 1) If str Like "[0-9 A-z ア-ン ( ) \ , . -]" Then '←0,9,A,zは全角、アとンとそのほかは半角! Cells(i, "A").Characters(Start:=k, Length:=1).Font.ColorIndex = 3 End If Next k If InStr(Cells(i, "C"), "混在") > 0 Then Cells(i, "B") = "NG" Else Cells(i, "B") = "OK" End If If InStr(Cells(i, "A"), "\") > 0 Then Cells(i, "B") = "NG" Cells(i, "C") = Cells(i, "C") & "\の半角あり。" End If cnt1 = 0 cnt2 = 0 cnt3 = 0 cnt4 = 0 cnt5 = 0 cnt6 = 0 Next i End Sub ※ 今回は結果をC列に表示し、B列は「OK」か「NG」を表示するようにしてみました。 ※ 細かい検証はしていませんので、お望み通りでなかったらごめんなさいね。m(_ _)m

roid_moon
質問者

お礼

上記のエラー、新たしいファイルで作り直したら起きなくなりました! 何が原因だったのかは不明なままです。。。 お騒がせしました。 望みどおりの機能です、ありがとうございます! 自分でもこんな風にできるようになるために、勉強させていただきます! ありがとうございます。

roid_moon
質問者

補足

ありがとうございます! 試してみたのですが、実行すると 「リストの作成 リストに変換するデータ範囲を指定してください」 とメッセージが出て進まなくなります。。。。 お願いしてばかりではダメだと思うので、じっくりスクリプトを確認してみます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

>かなり長文になる場合が多いので、制限がある場合はその文字数に分けてチェックするようにしたいと思います。 回答No.4、5では文字列の長さを255文字としてあります。「MID(A1,ROW(A$1:A$255),1)」 1つのセル内の文字数はExcelの最大行数(10^6)と同数まで可能と思います。 >No.4は「入力したすうしきがただしくありません」 何を根拠に正しくないのですか? 当方では添付画像のように模擬データで検証しています。 数式がどのような論理で組み込まれているかを理解して頂けないと数式の誤りを指摘できないはずです。 Excelのエラーメッセージであればその旨の記載をすべきです。 >No.5は計算結果が「#NAME?」と表示されてしまいます。 範囲に名前を付けるような処理を行っていませんので、そのエラーは考えられません。 回答No.5については数式を再確認した結果、Ctrl+Shift+Enterで確定しなくても通常通りで問題ないようです。 提示した数式はC1へ入力し、下へコピーします。右へのコピーは考慮されていません。 尚、D列はチェック用に処理したもので別の数式を使っています。

roid_moon
質問者

お礼

今回はVBAを利用したほうが目的に即しているようですので、そちらで検討したいと思います。 何度も丁寧なアドバイスいただき、ありがとうございました

roid_moon
質問者

補足

回答ありがとうございます。 言葉足らずでふかいなおもいをさせてしまったようでしたらもうしわけありません。 >「入力したすうしきがただしくありません」 こちらExcelのエラーメッセージです(変換ミスしていますが)。 詳細な補足ありがとうございます。 今後の参考にさせていただきます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.5

回答No.4の追加です。 英数及び英記号の全てが半角のとき「正」でその他は「誤」との判断で良いとすれば下記の数式で良いと思います。 貼付画像はExcel 2013での検証結果です。 =IF(A1="","",IF(AND(SUMPRODUCT(IFERROR((CODE(MID(A1,ROW(A$1:A$255),1))<128)*1,0))=SUMPRODUCT(IFERROR((CODE(MID(ASC(A1),ROW(A$1:A$255),1))<128)*1,0)),SUMPRODUCT(IFERROR((CODE(MID(A1,ROW(A$1:A$255),1))<128)*1,0))>0),"正","誤")) 数式は回答No.4と同様にCtrl+Shift+Enterで確定してください。

roid_moon
質問者

補足

回答ありがとうございます Excel 2013でNo.4と5でいただいた数式を試してみたのですが、No.4は「入力したすうしきがただしくありません」、No.5は計算結果が「#NAME?」と表示されてしまいます。 コピペミスかもしれないのでもう一度じっくり見てみます

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.4

>英数字が半角、且つ カナは全て全角 >或いは >英数字が半角、且つ カナも全て半角 >の場合が正で、それ以外がエラーというチェックがしたいのです 英数の全角と指数の半角が混在するときはエラーですか? 文字列の長さの最大値は何文字ですか? 関数の組み合わせでも可能と思いますが難解な数式になるようです。 考え方としては英数の文字数をカウントして、それが全て半角であるか否かチェックすれば良いでしょう。 半角の英数と英記号は文字コードが127以下であることに着目すればSUMPURODUCT関数で含まれる文字数を検出できます。 全角文字の文字コードは16bitであり、文字コードが256以上であることに着目すれば前述のようにSUMPURODUCT関数で文字数を検出できます。 これらのことからSUMPURODUCT関数の引数を適切に与えて比較すれば目的の結果が得られます。 目的に完全一致しないと思いますが下記の数式を参考にアレンジしてみると良いでしょう。 =IF(A1="","",IF(SUMPRODUCT(IFERROR((CODE(MID(A1,ROW(A$1:A$255),1))<128)*1,0))=LEN(A1),"すべて半角英数",IF(SUMPRODUCT(IFERROR((CODE(MID(A1,ROW(A$1:A$255),1))<256)*1,0))=LEN(A1),"すべて半角",IF(SUMPRODUCT(IFERROR((CODE(MID(A1,ROW(A$1:A$255),1))>255)*1,0))=LEN(A1),"すべて全角","半角/全角混在")))) この数式はExcel 2007以降のバージンで動作します。 尚、IFERROR関数の返り値は配列が必要なので数式を入力後にCtrl+Shift+Enterキーの打鍵で確定してください。

roid_moon
質問者

補足

回答ありがとうございます >英数の全角と指数の半角が混在するときはエラーですか? はいそうです。英数は全て半角のみが正で、それ以外の「英数に全半角混在」「英数が全角のみ」はエラーです。 >文字列の長さの最大値は何文字ですか? これは一定していません。 かなり長文になる場合が多いので、制限がある場合はその文字数に分けてチェックするようにしたいと思います。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

関数では難しいですね。ユーザー定義関数を作ってみました。   質問には「記号」という表現がありますが、ほとんど説明がありませんね。 「記号」とは何のことを表していて、英数の扱いで全て半角のみ認めるのか、「。」(句読点)などをどうするかよく分かりません。今は、許可する半角記号を11行目で、     strANK = "+-*/" & "0123456789"   のようにセットしています。変更があれば「"+-*/"」部分を修正してください。 メッセージの場合分けも少ないように思いました。組み合わせを増やしています。 また、カタカナの濁音と半濁音もチェックしています。結構長くなってしまいました。     標準モジュール使用(Excel2010)   「 シートで =混在チェック(A1) のように使用します。」   Function 混在チェック(Str As String)   Dim L As Integer    '文字列カウンタ   Dim elm As String   '1文字   Dim ANK As String   'アルファベットと数値   Dim Kana As String   'カタカナ   Dim strANK As String  'アルファベットと数値と記号      Application.Volatile      '最初の「""」内に許可する半角の記号をセットします   strANK = "+-*/" & "0123456789"   strANK = strANK & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"   strANK = strANK & "abcdefghijklmnopqrstuvwxyz"      '英数字・記号とカタカナに分離   For L = 1 To Len(Str)     elm = Mid(Str, L, 1)     If InStr(strANK, StrConv(elm, vbNarrow)) > 0 Then       ANK = ANK & elm     Else       Kana = Kana & elm     End If   Next      '英数字・記号のチェック   'all半角:1、その他:0、なし:9   Dim chkANK As Integer   If Len(ANK) > 0 Then     If ANK = StrConv(ANK, vbNarrow) Then       chkANK = 1     Else       chkANK = 0     End If   Else     chkANK = 9   End If      'カタカナのチェック   'all半角:1、all全角:2、その他:0、なし:9   Dim chkKana As Integer   If Len(Kana) > 0 Then     If Kana = StrConv(Kana, vbKatakana + vbNarrow) Then       chkKana = 1     ElseIf Kana = StrConv(Kana, vbKatakana + vbWide) Then       chkKana = 2     Else       chkKana = 0     End If   Else     chkKana = 9   End If      'メッセージの編集   Dim strMsg As String 'メッセージ      Select Case chkANK     Case 0       strMsg = "×英数に全角/半角が混在しています。"     Case 1       strMsg = "○英数は全て半角です。"     Case 9      End Select      Select Case chkKana     Case 0       strMsg = strMsg & "×カナに全角/半角が混在しています。"     Case 1       strMsg = strMsg & "○カナは全て半角です。"     Case 2       strMsg = strMsg & "○カナは全て全角です。"     Case 9        End Select      混在チェック = strMsg End Function

roid_moon
質問者

補足

> 質問には「記号」という表現がありますが、ほとんど説明がありませんね。 説明不足で申し訳ありません。 記号のOK/NGの条件は ●¥(円)は常に全角=OK 半角=NG ●「」()。、・はカナが全角のときは全角、半角のときは半角で」統一されていればOK それ以外の記号はまだルールが固まっていなくて。。。。 上記のような状態なので、どう説明すればいいかわからず触れていませんでした。 提案していただいたコードは望んでいた機能に非常に近く、また解説もわかりやすくてとても勉強になります。 本当にありがとうございます。 望んでいることが複雑且つあいまいなのに、すごく的確なご提案をいただけて、嬉しく思います。 もし可能であれば、なのですが、No.2のご回答のように該当の文字の色を変える機能を追加することは可能なのでしょうか? 上記のように記号の条件が複雑なので、自動のチェックが無理でも目視で比較しやすくしたいのです。 VBAの使い方自体良くわかっていないので、比較してみても良くわからず、お手すきの時間があったらアドバイスをいただけると嬉しいです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! VBAでの一例です。 ↓の画像のようにA1セルからデータはあり、B列に結果を表示し A列の全角英数・半角カナのフォント色を「赤」にしてみました。 Sub Sample1() Dim i As Long, k As Long, str As String Dim cnt1 As Long, cnt2 As Long, cnt3 As Long Dim cnt4 As Long, cnt5 As Long, cnt6 As Long Dim myMsg1 As String, myMsg2 As String, myMsg3 As String Dim myMsg4 As String, myMsg5 As String, myMsg6 As String myMsg1 = "英数は全て半角です。" myMsg2 = "英数は全て全角です。" myMsg3 = "英数に全角/半角が混在しています。" myMsg4 = "カナは全て全角です。" myMsg5 = "カナは全て半角です。" myMsg6 = "カナに全角/半角が混在しています。" Range("A:A").Cells.Font.ColorIndex = xlAutomatic Range("B:B").ClearContents For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, "A").Font.ColorIndex = xlAutomatic For k = 1 To Len(Cells(i, "A")) str = Mid(Cells(i, "A"), k, 1) If StrConv(str, vbNarrow) <> " " Then If StrConv(str, vbNarrow) Like "[A-z 0-9]" Then cnt1 = cnt1 + 1 If Not str Like "[A-z 0-9]" Then '←アルファベット、数値は半角 cnt2 = cnt2 + 1 Cells(i, "A").Characters(Start:=k, Length:=1).Font.ColorIndex = 3 Else cnt3 = cnt3 + 1 End If ElseIf StrConv(str, vbNarrow) Like "[ア-ン]" Then '←「ア」と「ン」は半角 cnt4 = cnt4 + 1 If Not str Like "[ア-ン]" Then '←「ア」と「ン」は全角 cnt5 = cnt5 + 1 Cells(i, "A").Characters(Start:=k, Length:=1).Font.ColorIndex = 3 Else cnt6 = cnt6 + 1 End If End If End If Next k If cnt1 > 0 Then If cnt1 = cnt2 Then Cells(i, "B") = myMsg2 ElseIf cnt1 = cnt3 Then Cells(i, "B") = myMsg1 Else Cells(i, "B") = myMsg3 End If End If If cnt4 > 0 Then If cnt4 = cnt5 Then Cells(i, "B") = Cells(i, "B") & myMsg5 ElseIf cnt4 = cnt6 Then Cells(i, "B") = Cells(i, "B") & myMsg4 Else Cells(i, "B") = Cells(i, "B") & myMsg6 End If End If cnt1 = 0 cnt2 = 0 cnt3 = 0 cnt4 = 0 cnt5 = 0 cnt6 = 0 Next i End Sub ※ おそらくこの画面上では半角の「ア」と「ン」は全角のまま画面に表示されていると思いますので、 コピー&ペーストした後に「ア」と「ン」の部分はコードのコメント通り半角に手直しして マクロを試してみてください。 ※ 半角カナの濁点の処理まで考える気力がありませんので、濁点は考慮していません。 (濁点が半角カナというコトはその前の文字は当然半角カナになると思うので・・・ ※ 1文字ずつ舐めるように検索していますので、そこそこ時間を要すると思います。m(_ _)m

roid_moon
質問者

補足

回答ありがとうございます VBAは今回の事案で初めて触れたので、何をどう調べてよいかもあいまいで、説明もつたなくてすみません。 提案していただいたコードは望んでいた機能に非常に近く、すごく参考になります。 特に文字意色がつくところが直感的でわかりやすいです。 後出しで申し訳ないのですが記号も色がつくようにすることは可能でしょうか? 記号のOK/NGの条件は ●¥(円)は常に全角=OK 半角=NG ●「」()。、・はカナが全角のときは全角、半角のときは半角で」統一されていればOK (それ以外の記号はまだルールが固まっていない) なので、¥「」()。、・が半角のとき、文字色を変えるにはどうしたらよいのでしょう? 合わせてアドバイスいただけると大変助かります。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.1

条件付書式で塗りつぶしの色指定は以下の数式で指定します。 =AND(A1<>"",NOT(OR(EXACT(A1,ASC(A1)),EXACT(A1,JIS(A1))))) 文字で表記するときは次の数式で良いでしょう。 =IF(EXACT(A1,ASC(A1)),"すべて半角です",IF(EXACT(A1,JIS(A1)),"すべて全角です","全角/半角混在です")) 添付画像はExcel 2013で検証した結果です。

roid_moon
質問者

補足

申し訳ないのですが教えていただいた内容では意図した結果と違うのです。 「allゼンカク」のような半角英字+全角カナの場合も、混在(エラー)と表示されてしまいます。 英数字が半角、且つ カナは全て全角 或いは 英数字が半角、且つ カナも全て半角 の場合が正で、それ以外がエラーというチェックがしたいのです。 説明が足りなかったようで申し訳ありません。

関連するQ&A