- ベストアンサー
Excelでカンマやハイフンでの区切り文字について
- ExcelでB列にカンマやハイフンで区切られた数字があり、E列に指定した数字の左からの順番を表示するにはどのような式を使用すれば良いでしょうか。
- カンマやハイフンで区切られた数字の中で、指定した数字の左からの順番を求める方法について教えてください。
- ExcelのB列にはカンマやハイフンで区切られた数字がありますが、指定した数字の左からの順番を求めるにはどうすればよいですか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (3)
- bunjii
- ベストアンサー率43% (3589/8249)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
( ) がなければ、易しくないながらもまあできますが、例えば「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)
FIND関数で開始位置(X)を特定して、 1文字目からX文字目までの文字数から 1文字目からX文字目までのデリミタ(,等)を消した文字数を差し引けば出るんじゃない? (E2セルの場合) =LEN(LEFT(B2,FIND($E$1,B2)))-LEN(SUBSTITUTE(LEFT(B2,FIND($E$1,B2)),",",""))+1 あとはハンドリングの調整が必要かな。 (該当文字が無い場合や1つ目の時の動きなど) 参考までに。
補足
回答ありがとうございます。 SUBSTITUTE関数は勉強になりました。おかげで、ハイフンやカンマ等を削除して順番が出せました。 しかし、()内の同順判定の方法で躓いています(^^;) ちなみに指定した数字が「該当なし」というのは存在しないので大丈夫です。
お礼
おお!思ってた通りの事が見事にできました。素晴らしい回答ありがとうございます。 ユーザー関数の仕組みは私の知識ではまだ理解出来ないですが、後学のために参考にさせて貰います。 ありがとうございましたm(_ _)m