• ベストアンサー

セル内の数字も混じった文字列から特定パターンの数字列を取り出す

またまたお世話になります。  (1)セル内に1つまたは2つのハイフンでつながる数字列を含む文字列(ブランクも含みます)がある場合にそこからその数字列のみを取り出す方法をアドバイス願います。  例 cを文字、xを数字(最大7桁)とします。 セル内の文字列 cccccc cccc cccc xxxxxxx-xx-x ccccccc cccc cccc からxxxxxxx-xx-x を取り出して文字列として別のセルに置く方法です。 (2) もしこのxxxxxxx-xx-x が[ と ] で囲まれていた場合はもう少し容易になりますか?  よろしくお願いします。  

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

「最高7桁」というのは、条件が曖昧ですね。 じゃぁ最低は ? となりますよね。 まぁいいけど・・・ 一応、 *-**-* のバターンにマッチするものを複数カンマで区切って返します。 そんなに長い文字をセルに入れてどうするのぉ~ 大きなお世話か? Function GetNumber(s As String) As String Dim n As Integer Dim StrOut As String Dim StrBlk As String Dim Chk As Boolean Dim Cnt As Integer Do   StrBlk = ""   Chk = False   For n = 1 To Len(s)     If InStr("1234567890-", Mid(s, n, 1)) > 0 Then       Chk = True       StrBlk = StrBlk & Mid(s, n, 1)     Else       If Chk = True Then Exit For     End If   Next n   If Len(StrBlk) > 5 And Left(Right(StrBlk, 2), 1) = "-" And _       Left(Right(StrBlk, 5), 1) = "-" Then     Cnt = Cnt + 1     If Cnt = 1 Then       StrOut = StrBlk     Else       StrOut = StrOut & "," & StrBlk     End If   End If   s = Mid(s, n) Loop While Len(s) > 5 GetNumber = StrOut End Function

filefish
質問者

お礼

Ja7awuさん、再度ありがとうございます。うまくいったようです。 Module1とModule2ができるとModule1を消さないとModule1が先に実行されてしまうようです。 Module1と2をKeepしておいてそれぞれ別個に作動させることはできるんですよね。私はユーザー定義関数を勉強しておく必要がありそうですね。 

その他の回答 (3)

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

問題の意味を良く捉えられていないのですが B1セルに=IF(ISERROR(FIND("fgh",A1)),"",A1)のような関数式ではダメでしょうか。 A1セルにfghを含むasdfghなどが、入っていれば B1にその文字列を入れる。

filefish
質問者

お礼

imogashiさんありがとうございます。 ハイフンの前後の数字は任意でまたその長さも可変なのでご提示の方式が仕えるかどうか不明です。 またお願いします。 

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

まぁ、位置も桁数も不定なら、ユーザー定義関数を使うことでしょうね。 それで良かったら、次のように操作してみてください。簡単で~す。 ・ Alt + F11 でメニューから[挿入]-->[挿入]-->[標準モジュール]で開いた  コードウィンドウに下記コードをコピーして貼り付けます。 ・ Alt + Q でコードウィンドウを閉じ、シートに戻り、 例えば、セルA1にその文字列が入っているとして、セルB1などに  =GetNumber(A1) と入力します。 これで希望どおり表示されると思います。 ※ 数字および "-" は、半角とします。 Function GetNumber(s As String) As String Dim n As Integer Dim StrOut As String Dim chk As Boolean For n = 1 To Len(s)   If InStr("1234567890-", Mid(s, n, 1)) > 0 Then     chk = True     StrOut = StrOut & Mid(s, n, 1)   Else     If chk = True Then Exit For   End If Next n GetNumber = StrOut End Function  

filefish
質問者

補足

ja7awuさん、ありがとうございます。 部分的に大成功です。 但し数字とハイフンが入っていればすべて持ってきてしまいます。 xxxxxxx-xx-x の形があるときのみを取り出したいときにはどうすればよろしいでしょうか? 又、この組み合わせが1セル内に複数あるときもその複数をカンマで区切って出してくれれば最高なんですが. もしよろしければお願いします。  

  • kamiero
  • ベストアンサー率31% (88/282)
回答No.1

(1) Xの開始位置が一定なら、(Cの長さが一定なら)データ→データの区切り位置 でデータを切ってしまうのが早いです。 Cの長さが不規則でも、Xはハイフンでつながっているので、データ→区切り位置 で、スペースで切ってしまえば、X以降だけが別のセルにすることはできます。 (2) はい。特定の文字で囲われているのなら、それをもとに、データ→データの区切り位置→ で、記号できってあげればよろしいかと。 参考まで。

filefish
質問者

お礼

kamieroさんありがとうございます。  データの区切り位置の挿入は一行ごとにやらねばならないように思いますので、多数行を一度にやるには不向きかと思われます。説明が不足して申し訳ありません.次回又おねがいします。