• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelでカンマやハイフンでの区切り文字について)

Excelでカンマやハイフンでの区切り文字について

このQ&Aのポイント
  • ExcelでB列にカンマやハイフンで区切られた数字があり、E列に指定した数字の左からの順番を表示するにはどのような式を使用すれば良いでしょうか。
  • カンマやハイフンで区切られた数字の中で、指定した数字の左からの順番を求める方法について教えてください。
  • ExcelのB列にはカンマやハイフンで区切られた数字がありますが、指定した数字の左からの順番を求めるにはどうすればよいですか。

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

  • ベストアンサー
回答No.3

No.2 です。すみません、No.2 のコードでは、文字列中で「指定」した数よりも前と後ろにそれぞれ ( ) が登場する場合に、正しく計算できないことが分かりました。下のコードに差替えをお願いいたします。 変更点は、変数 y をなくして y1 と y2 を設置し、「If x > 1 Then」以下を少し修正しました。 なおこのコードであっても、「二重の」( ) には対応していません。1,((2,3),4),5 などのことです。 Function OON(ByVal s1 As String, ByVal s2 As String)   Dim s3 As String, s4 As String, x As Integer, y1 As Integer, y2 As Integer, z As Integer   s3 = Replace(Replace(s1, "-", ","), "=", ",")   If s3 = s2 Or s3 Like s2 & ",*" Then     x = 1   ElseIf s3 Like "*," & s2 & ",*" Then     x = InStr(1, s3, "," & s2 & ",") + 1   ElseIf s3 Like "*(" & s2 & ",*" Then     x = InStr(1, s3, "(" & s2 & ",") + 1   ElseIf s3 Like "*," & s2 & ")*" Then     x = InStr(1, s3, "," & s2 & ")") + 1   ElseIf s3 Like "*," & s2 Then     x = Len(s3) - Len(s2) + 1   Else     x = 0   End If   If x > 1 Then     y1 = InStrRev(s3, "(", x)     y2 = InStrRev(s3, ")", x)     z = InStr(x, s3, ")")     If y1 > y2 And z > 0 Then       s4 = Left(s3, y1)     Else       s4 = Left(s3, x)     End If     OON = Len(s4) - Len(Replace(s4, ",", "")) + 1   Else     OON = x   End If End Function

mzakom
質問者

お礼

おお!思ってた通りの事が見事にできました。素晴らしい回答ありがとうございます。 ユーザー関数の仕組みは私の知識ではまだ理解出来ないですが、後学のために参考にさせて貰います。 ありがとうございましたm(_ _)m

その他の回答 (3)

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

>数字は必ず1~18の2桁の間になります。作業列も可です。 作業用のシートを使うと目的通りに処理できそうです。 添付画像は1つの例です。 詳しい説明が必要であれば補足してください。

mzakom
質問者

お礼

画像付きでわかりやすい回答ありがとうございます。 今後の参考にさせて貰いますm(_ _)m

回答No.2

( ) がなければ、易しくないながらもまあできますが、例えば「3」と指定して「13」の位置で引っかかったりするとダメなので、前後の「,」を含めて位置を検索するといった工夫が必要でしょう。 ( ) があるとなると、( ) の位置やその間に含まれる数の個数が一定していないので、ものすごく長大・難解な数式が必要になってしまいそうです。 なので、ユーザー定義関数を作ってしまいましょう。下のコードを標準モジュールなどに貼り付けたら、次式をセルに記入してください。これで大体うまく行ってないでしょうか。 E2 =oon(b2,E$1) Function OON(ByVal s1 As String, ByVal s2 As String)   Dim s3 As String, s4 As String, x As Integer, y As Integer, z As Integer   s3 = Replace(Replace(s1, "-", ","), "=", ",")   If s3 = s2 Or s3 Like s2 & ",*" Then     x = 1   ElseIf s3 Like "*," & s2 & ",*" Then     x = InStr(1, s3, "," & s2 & ",") + 1   ElseIf s3 Like "*(" & s2 & ",*" Then     x = InStr(1, s3, "(" & s2 & ",") + 1   ElseIf s3 Like "*," & s2 & ")*" Then     x = InStr(1, s3, "," & s2 & ")") + 1   ElseIf s3 Like "*," & s2 Then     x = Len(s3) - Len(s2) + 1   Else     x = 0   End If   If x > 1 Then     y = InStrRev(s3, "(", x)     z = InStr(x, s3, ")")     If y * z Then       s4 = Left(s3, y)     Else       s4 = Left(s3, x)     End If     OON = Len(s4) - Len(Replace(s4, ",", "")) + 1   Else     OON = x   End If End Function

  • mayoke
  • ベストアンサー率25% (16/62)
回答No.1

FIND関数で開始位置(X)を特定して、 1文字目からX文字目までの文字数から 1文字目からX文字目までのデリミタ(,等)を消した文字数を差し引けば出るんじゃない? (E2セルの場合) =LEN(LEFT(B2,FIND($E$1,B2)))-LEN(SUBSTITUTE(LEFT(B2,FIND($E$1,B2)),",",""))+1 あとはハンドリングの調整が必要かな。 (該当文字が無い場合や1つ目の時の動きなど) 参考までに。

mzakom
質問者

補足

回答ありがとうございます。 SUBSTITUTE関数は勉強になりました。おかげで、ハイフンやカンマ等を削除して順番が出せました。 しかし、()内の同順判定の方法で躓いています(^^;) ちなみに指定した数字が「該当なし」というのは存在しないので大丈夫です。

関連するQ&A

専門家に質問してみよう