• ベストアンサー

excelにて記号を取り出したい

お世話になります。 セルの中に、例えば「アアア@イイイ」といったような記号が含まれている文字列があります。その中の記号を検出したいのですが、うまくいきません。 最終的にやりたいことは、そのセルの中に記号が含まれている場合、エラー表示を出したいのですが、VLOOKUPなどを使ってみても、数式的にエラーになるばかりで、うまくいかないのです。 ※記号単体でVLOOKUPを使うと確かに抽出されるのですが、文字列に紛れ込むと、検索しないみたいです。 なんとかならないものでしょうか。(ちなみに記号は不特定です)

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

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

ユーザー関数(VBA)を定義すれば、正規表現度々使わなくても簡単なコードです。 Function kigou(a) x = "@#$%&()=" For i = 1 To Len(x) p = InStr(a, Mid(x, i, 1)) If p > 0 Then kigou = Mid(x, i, 1) & "がある" Exit Function End If Next i kigou = "記号がない" End Function ーーー (1)どの文字が記号かは x = "@#$%&()=" のところで書き連ねて列挙する。 (2)最初に見つかった記号を返して終わりとしている。 記号を全て列挙もコードを少し変えて可能(注) 例データ A列   B列 aah@wert @がある a%%ggh %がある dffghhh$jku $がある asdfg 記号がない B1は =kigou(A1) 以下式を複写 (注) Function kigou2(a) x = "@#$%&()=" s = "" For i = 1 To Len(x) p = InStr(a, Mid(x, i, 1)) If p > 0 Then s = s & Mid(x, i, 1) & "," End If Next i If s = "" Then kigou2 = "記号がない" Else kigou2 = Left(s, Len(s) - 1) & "あり" End If End Function ーー 例データA5B7 as#3fg4 #あり asdfg 記号がない sddd$gg&6yy $,&あり B5に=kigou2(A5)

その他の回答 (8)

noname#204879
noname#204879
回答No.8

arimasouitirouさん、再度の割り込みをお許しください。m(__)m [ANo.6 maron--5]さんへのコメント、 懇切丁寧で、かつ、非常に分かり易い解説を多謝です。お蔭様でよく理解できました。と同時に maron--5 さんが Excel の性質に熟知された達人であることを再認識いたしました。 私にとって“目から鱗”的なポイントは次の事柄でした。 1.=FIND($D$1:$D$4,A1) は =FIND({"@";"#";"$";"*"},A1) と等価であること 2.式中の該当部分を指定して[再計算実行キー](F9)を叩くと計算結果が、上から順に次のように配列表示されること   ={7;#VALUE!;#VALUE!;#VALUE!}   ={#VALUE!;#VALUE!;8;#VALUE!}   ={#VALUE!;7;#VALUE!;#VALUE!}   ={#VALUE!;#VALUE!;#VALUE!;#VALUE!}   ={#VALUE!;#VALUE!;#VALUE!;5} 3.=COUNT(FIND($D$1:$D$4,A1)) は数値の個数を返すので、そのまま上から順に 1、1、1、0、1 になるかと思ったら、そうではないこと。でも Shift+Ctrl+Enter を実行して {=COUNT(FIND($D$1:$D$4,A1))} とすればOKなこと。 4.しかし、=COUNT(FIND({"@";"#";"$";"*"},A1)) の場合は、Shift+Ctrl+Enter を実行してもしなくても、上から順に 1、1、1、0、1 になるようです。 実は、上のステップ3と4の違いがイマイチ理解できていません。 5.ステップ3の冒頭に示す式の場合は「INDEX関数を加えることで、先ほどの配列数式を同じ結果」になること 6.ステップ4の性質から、最終式はINDEX関数なしの次式でもOKのようですね。   =IF(COUNT(FIND({"@";"#";"$";"*"},A1)),"エラー","") ありがとうございました。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.7

◆間違いがありましたので、訂正します(A1をB1に) ★COUNT(INDEX(FIND($D$1:$D$4,A1),)) 1)この式をB1に入力して、下にコピーしてください。 2)数式バーの式全体を指定して、「F9」を押してくださいB2が「1」になりましたでしょうか。 ★その他、読みにくい個所がありますがおゆるしください

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.6

mike g さんへ(お役に立てれば幸いです) ◆maronは式を理解したり、回答する場合の確認にこの方法(「F9」)を使っていますので、それを使いながら説明させていただきます ★FIND($D$1:$D$4,A1) 1)B1を指定して、数式バーの「=IF(COUNT(INDEX(FIND($D$1:$D$4,A1),)),"エラー","")」の内 FIND($D$1:$D$4,A1) の部分のみ指定して、「F9」を押してください 2){7;#VALUE!;#VALUE!;#VALUE!} と表示されたはずです 3)これは、$D$1:$D$4 の範囲の一番目の($D$1)@が、A1の文字列の7番目にあることを示しています 4)また、その他が#VALUE!ということは、その他の記号はA1に含まれていないことになります ★=COUNT(FIND($D$1:$D$4,A1)) 1)この式を一度B1に入力してみてください 2)COUNTとSUMは数式にERRORがあっても計算してくれる、便利な関数です 3)B1の帰り値は、「1」です。この式を下にコピーしてください 4)B2は「0」になります。 5)次に、B2で数式バーの、COUNT(FIND($D$1:$D$4,A2)) を指定して、「F9」を押してください。「1」になります 6)また、B2で数式バーを指定して、Shift+Ctrl+Enter を押してください。同じく「1」になります 7)ですから、式を=IF(COUNT(FIND($D$1:$D$4,A1)),"エラー","") にして、Shift+Ctrl+Enterを押して、下にコピーすると同じ結果になります(この配列数式の回答でもいいと思います) ※A1の式が「1」になったのは、たまたまA1に一番上にある@があったためです ★COUNT(INDEX(FIND($D$1:$D$4,A1),)) 1)この式をA1に入力して、下にコピーしてください。 2)数式バーの式全体を指定して、「F9」を押してくださいA2が「1」になりましたでしょうか。 3)INDEX関数を加えることで、先ほどの配列数式を同じ結果になります。 3)配列数式の「Shift+Ctrl+Enter を押す」手順を回避できます 4)質問者の方がよく配列数式を理解されず、「Shift+Ctrl+Enter を押す」手順を省略や間違ったりされることがあるので このINDEX関数を使った式を回答しました(maronの勝手ですが) 5)INDEX関数は、配列を顕在化させることができるようです

noname#204879
noname#204879
回答No.5

割り込みで失礼します。 [ANo.4]の maron--5さん、 いつも勉強させてもらっています。 今回の回答式を分解してみましたが、どうしても理解できず、眠れなくなって困っています。(^_^) COUNT(INDEX(FIND($D$1:$D$4,A1),)) の部分を解説していただけないでしょうか? お願いします。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.4

      A          B    C    D 1   qqwqed@wedwe   エラー      @ 2   qeedwqe$sadsad  エラー       # 3   uwguwg#       エラー       $ 4   fyu                     * 5   dstd*uuydfc     エラー B1=IF(COUNT(INDEX(FIND($D$1:$D$4,A1),)),"エラー","") ★下にコピー

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

正規表現を使った、ユーザー定義関数はいかがでしょうか ....................A.................B...............C ..1....aaa@aaaa.....[@\-\*].........TRUE ..2....aaa-aaaa.....[@\-\*].........TRUE ..3....aaa*aaaa.....[@\-\*].........TRUE ..4......aaaaaaa.....[@\-\*].......FALSE B列に、チェック対象の文字群を、全体を[]で囲って記述します。[abcdefg]とすれば、a~gをチェックする事になります。 ここで、-や、*は演算子と判断されるため、頭に\をつけています。 関数はC列に入れてあります。 そのままVBAで使っても使えるはずです。(重いと思うので、大量に使うにはVBAで処理した方が良いでしょう) 詳細は参考URLなどをご覧下さい。 Function searchWord(targetString As String, patternString As String) As Boolean Dim regEx As Object, Matches As Object, match As Object Set regEx = CreateObject("VBScript.RegExp") regEx.MultiLine = False regEx.Pattern = patternString regEx.IgnoreCase = False '大文字小文字を区別する regEx.Global = False '一個見つかったら終了 Set Matches = regEx.Execute(targetString) If Matches.Count > 0 Then searchWord = True Else searchWord = False End If Set Matches = Nothing Set regEx = Nothing End Function

参考URL:
http://officetanaka.net/excel/vba/tips/tips38.htm
  • keirika
  • ベストアンサー率42% (279/658)
回答No.2

A1に文字列があると仮定します。 =IF(LEN(A1)=LEN(SUBSTITUTE(SUBSTITUTE(A1,"@",""),".","")),"OK","ERROR") でどうでしょうか。

arimasouitirou
質問者

補足

ご回答ありがとうございます。 確かに、ERRORになります。う~~~んですが、これだと指定する記号を全部SUBTITUTEで括らないといけませんよね~~? (範囲指定とかできれば、別表にでも記載するのですが;;) 記号が2つ3つならいいんですが、6個ぐらいありますので、この方法だとちょっと面倒だし、数限りあるという気がするのですが…わかがままでしょうか。 本当、申し訳ありません。

noname#77845
noname#77845
回答No.1

補足してください。 「ちなみに記号は不特定です」 と書かれていますが、 「a」、「A」、「@」、「$」 エクセルから見たら全て記号です。 何をもって記号と判断したら良いのでしょう?

arimasouitirou
質問者

補足

すみません、補足します。 いわゆる、「-」とか「*」とか「@」とかです。 でも、文字列に紛れているので(文字列は2バイト文字ではないです) 例:aaa@bbb.com ←の、「@」と「.」を検出し、それらが含まれている場合、エラーを表示させたい。 …というようなことなんですが…。できますでしょうか。

関連するQ&A

  • エクセルで特殊記号を普通の文字に認識させたい

    お世話になります。 A列にサイト名、B列にURLが入っています。 C列に次のような文字列が出るように式を入れたいのですが、 エラーでうまくいきません。 <ahref="(Bの文字列)"target="_blank">(Aの文字列)</a> <"などの特殊記号を数式ととらえているようです。 C列にどのような数式を入れれば改善されるでしょうか?

  • エクセルで並び替えが出来ない…!

    エクセルでセルに 文字(というかデータ)をたくさんの行にわたって入力し 右側の別列に数式を入力し特定の文字を抽出し 下に連続データを複写していきました。そして その抽出した文字の列をソートしようとしたのですが 並び替えできません。 原因はもともと連続した数式だからだと思いますが… それを式としてでなく抽出した文字として並び替えることは出来ませんか?? 回答よろしくお願いします。

  • エクセル 特定の文字列を抽出・挿入

    例えば A列にあるセルの中から特定の文字列を検索・抽出して、その特定の文字列だけB列に挿入していく関数はありますか? またはA列にあるセルの中から特定の文字列に挟まれた文字列を検索・抽出してその特定の文字列だけB列に挿入していく関数はありますか? マクロを組まないと難しいのでしょうか?

  • Excelの関数について

    エクセルで表を作っているのですが、関数についてひとつ質問です。 VLOOKUPなどの検索関数で、検索値として参照する値にひとつのセルの中の一定の文字列を指定したい場合はどうすればよいのでしょうか? MID関数で抽出しようとしたのですが、どうも関数で抽出した値はエラーが出るようで・・・。どなたかわかる方いらっしゃったら回答お願いします。

  • エクセルで列にある記号の数をカウントしたい

    エクセルで列にある記号の数をカウントしたいのですが、どうすればいいのでしょうか。 列の中には■ ◎ ☆ が各行にあり、その列の中に各文字がいくつあるのかが確認したいのです。 集計のセルは複数に(各記号ごと)なってもかまいません。 初歩的な質問かもしれませんが、どうぞよろしくお願いします。

  • エクセル:数式の結合

    お世話になります。 A1セルに =B1 A2セルに =B2+C2 A3セルに =B3+C3+D3 ・・・ という式があるとします。 ここにそれぞれのF列の数式を追加したいと思います。 A1セル =B1+(F1の数式) A2セル =B2+C2+(F2の数式) A3セル =B3+C3+D3+(F3の数式) ・・・ となるようにしたいのですがどのようにすればよろしいでしょうか? 結果だけであれば足し合わせればよいのですが数式を書き換えたいというのが希望です。 (最終的にはA列の数式とF列の数式をあわせてひとつの列にしてしまいたいのです) 置換や関数ではどのようにしたらいいかわかりませんでした。 (マクロは手を出したことがありません) 文字列の結合ならCONCANTATE関数でできるのですが中の数式をうまく結合するには・・・ と考えていっても無理でした。 すみませんがお教えください。

  • 指定した文字数分の文字列を抽出し、検索(VBA)

    いつもお世話になっております。 指定した文字数分の文字列を抽出し、他のシートから抽出した文字列を検索して表示するのに セルBB2に =IF(AW2="",VLOOKUP(LEFT(N2,2),商品マスタ!$M$21:$N$67,2,0)) という数式を入れています。 セルBB2のみではなくBB列でずっと同じ処理をするため、マクロで処理しようと思うのですがなにぶん未熟でいい方法がわかりません。 Mid関数を使えばいいのかな、とは考えましたが、どう書けばいいのかわからず前にすすめません・・・・ どなたかご教授いただければ幸いです。

  • 特定の記号の数による、任意の文字行からの抽出。

    文字行がありB2からB15まで、A列の記号で表しています。文字行は任意です。 B列の文字行を特定の記号の数で抽出するとB2からB8までをC列からG列までのように表せます。 A列  B列     C列    D列  E列   F列   G列 1記号・ 文字行 抽出記号    2〇・・△△〇・・・〇・・・・・〇・・・・・〇・・・・・△△・・・〇                3△・・△△〇・・・〇・・・・・〇・・・・・〇・・・・・〇・・・・・△△                  4凵・・凵〇〇・・・凵・・・・・凵・・・・・凵・・・・・〇〇・・・〇〇                   5И・・凵И△・・・凵・・・・・凵・・・・・И・・・・・凵・・・・・凵                6・・・・И△△・・・И・・・・・△△・・・△△・・・И・・・・・И 7・・・・△△△・・・△△△・△△△・△△△・△△△・△△△      8・・・・凵И△・・・△・・・・・И・・・・・凵・・・・・凵・・・・・凵 /・・・・ 15・・・ 特定の記号の数:4種 B2:B8で、列に 1)〇が総数2コ 2)凵が2コ 3)Иが1コ で、 空白なしとします。 こんな文字行があり、特定の記号の数を1)2)3)とすると、C列からG列のようになります。 文字列に空白がない、こんな抽出をしたいのですが、 このような抽出はどうすればよいでしょうか、どなたか教えていただけませんか。 よろしくおねがいします。

  • Excel INDIRECT

    お世話になります。 INDIRECT関数で、 =INDIRECT("A1")は、=A1と同じように、A1セルを参照しますが、 =VLOOKUP(A1,B1:C19,2,FALSE)を、==INDIRECT("VLOOKUP(A1,B1:C20,2,FALSE)”)で囲むと#REF!エラーになります。 目的は、A2セルにSheet2!B1:C20の範囲を示す文字列を入れて、=INDIRECT("VLOOKUP(A1,"&A2&",2,FALSE)”)としたいと思っています。 #REF!エラーの原因を教えていただけないでしょうか。 よろしくお願いします。

  • エクセル-抽出したデータや文字列を消さない方法

    他のファイルから例えばVLOOKUP関数で数値や文字列を抽出する場合、そのファイルが消えた場合抽出したデータや文字列も消えてしまいます。ファイルが消えてもデータや文字列を残すには別のセルにコピーして形式を選択して貼り付ければよいのですが、そうしなくても簡単に別のセルに数値や文字列として残す方法はないでしょうか。回答よろしくお願いいたします。

専門家に質問してみよう