[[20250717134903]] 『1~5,8「半角」などで、~の間にある整数をカンマax(チナスキー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『1~5,8「半角」などで、~の間にある整数をカンマで区切りたい』(チナスキー)

 1~5,8 と作業用セルに入力すると、
 別の出力セルでは、1,2,3,4,5,8と打ち出すようにしたいです。
 同様に、1,3~5 と作業用セルに入力すると、
 1,3,4,5と出力セルに出すようにしたいです。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 元データで,や~の出現回数はそれぞれ1回だけなのだろうか?

 それとも
 1,3~6,8
 や
 1~3,5~8
 のように複数出てくることもあるのだろうか?
(ねむねむ) 2025/07/17(木) 14:08:37

 あああ、、たしかに。。複数出てくるかもしれません、、
 入力する人のクセによります。。
(チナスキー) 2025/07/17(木) 14:12:38

 =LAMBDA(x,TEXTJOIN(",",,
            MAP(TEXTSPLIT(x,","),
               LAMBDA(str,
                 IF( ISERROR(SEARCH("~~",str)),
                     str,
                     LET(s,TEXTBEFORE(str,"~"),e,TEXTAFTER(str,"~"),TEXTJOIN(",",,SEQUENCE(e-s+1,,s)))
                 )
               )
            )
        )
  )(A1)

 もっといい式があるんじゃないかとおもいつつ
(´・ω・`) 2025/07/17(木) 14:27:35

 (´・ω・`)さん
 早々にありがとうございます!
 勉強不足ですみません。こちらは、、A1が作業セルと考えるんでしょうか?
(チナスキー) 2025/07/17(木) 14:43:06

 (´・ω・`) さん。
 些細なことだけど。

 SEARCH関数の代わりにFIND関数にしたら"~"の検索ですむのでは?
(ねむねむ) 2025/07/17(木) 14:47:40

改行もそのままコピー&ペーストでいいんでしょうか。。
(チナスキー) 2025/07/17(木) 14:51:48

 なるほどです
 =LAMBDA(x,TEXTJOIN(",",,
            MAP(TEXTSPLIT(x,","),
               LAMBDA(str,
                 IF( ISERROR(SEARCH("~~",str)),
                     str,
                     LET(s,TEXTBEFORE(str,"~"),e,TEXTAFTER(str,"~"),TEXTJOIN(",",,SEQUENCE(e-s+1,,s)))
                 )
               )
            )
        )
  )("1,2,5~10")

 作業セルという意味が私にはわかりませんが

 A1のセルの値を対象にしてます
 別のセルの値を対象にするなら、最後のA1の部分を書き換えてください。
 改行も含めてそのまま貼り付けていいですが、最初の=の前の空白は削除して下さい
(´・ω・`) 2025/07/17(木) 14:56:48

 書き込む式を間違えました。 FIND関数にしました
 =LAMBDA(x,TEXTJOIN(",",,
            MAP(TEXTSPLIT(x,","),
               LAMBDA(str,
                 IF( ISERROR(FIND("~",str)),
                     str,
                     LET(s,TEXTBEFORE(str,"~"),e,TEXTAFTER(str,"~"),TEXTJOIN(",",,SEQUENCE(e-s+1,,s)))
                 )
               )
            )
        )
  )("1,2,5~10")
(´・ω・`) 2025/07/17(木) 14:58:11

 ちょっとだけみじかく
 =LAMBDA(x,TEXTJOIN(",",,
            MAP(TEXTSPLIT(x,","),
               LAMBDA(str,
                 IFERROR(
                    LET(s,TEXTBEFORE(str,"~"),e,TEXTAFTER(str,"~"),TEXTJOIN(",",,SEQUENCE(e-s+1,,s))),
                    str
                 )
               )
            )
        )
  )(A1)
(´・ω・`) 2025/07/17(木) 15:28:47

 横から失礼します。
 内容ではなく、使い方についての質問者さんへのTips提供です。

 下記の部分を参照範囲にコピーペイストして名前定義しておけば(名前はお好きに付けて下さい。myreplとか)、
 =LAMBDA(x,TEXTJOIN(",",,
            MAP(TEXTSPLIT(x,","),
               LAMBDA(str,
                 IFERROR(
                    LET(s,TEXTBEFORE(str,"~"),e,TEXTAFTER(str,"~"),TEXTJOIN(",",,SEQUENCE(e-s+1,,s))),
                    str
                 )
               )
            )
        )
  )

 =myrepl("1,2,5~10")
 とか、
 =myrepl(A1)
 などと入力するだけで済みます。

 難点があるとすれば、
 あとから名前定義の内容を確認しようとすると読みづらいものになっている、という点ですか。
 これは、ワークシートのどこかに、頭に ' を付けて式を残しておくとよいと思います。

 名前定義の際に、頭に半角スペースが入らないように気を付けて下さい。
(xyz) 2025/07/17(木) 15:50:17

 Function MySeq(s As String) As String
     Dim i As Long, res As String
     Dim minNum As Long, maxNum As Long
     minNum = 2 ^ 32: maxNum = -1: res = ""

     For i = 1 To Len(s)
         If IsNumeric(Mid(s, i, 1)) Then
             res = res + Mid(s, i, 1)
         ElseIf res <> "" Then
             minNum = VBA.Min(minNum, CLng(res))
             maxNum = VBA.Max(maxNum, CLng(res))
             res = ""
         End If
     Next i

     If res <> "" Then
         minNum = VBA.Min(minNum, CLng(res))
         maxNum = VBA.Max(maxNum, CLng(res))
     End If

     If maxNum = -1 Then Exit Function
     res = ""

     For i = minNum To maxNum
         res = res & i & ","
     Next i

     MySeq = Left(res, Len(res) - 1)
 End Function
(デボラ) 2025/07/17(木) 19:19:36

 今気づきましたが5〜8は補完しないんですね.
 失礼しました
(デボラ) 2025/07/17(木) 19:29:30

 こんなのも。
=LET(x,IFERROR(TEXTSPLIT(A1,"~",",")*1,""),
y,BYROW(x,LAMBDA(r,TEXTJOIN(",",,SEQUENCE(MAX(r)-MIN(r)+1,,MIN(r))))),
TEXTJOIN(",",,y))
(んなっと) 2025/07/17(木) 20:27:18

 んなっとさん なるほどです

 VBAで書いてみました
 Function ExpandSeries(ByVal str) As String
   Dim s As String, r As String
   Dim i As Long, j As Long
   str = Replace(str, " ", "")
   If str = "" Then Exit Function
   s = Split(str, ",")(0)
   r = Mid(str, Len(s) + 2)
   If s Like "*#~#*" Then
      i = Val(Split(s, "~")(0))
      j = Val(Split(s, "~")(1))
      s = ""
      For k = i + 1 To j
          s = s & "," & k
      Next
      s = i & s
   End If
   ExpandSeries = s & IIf(r = "", "", "," & ExpandSeries(r))
 End Function
(´・ω・`) 2025/07/17(木) 20:47:48

Function ExpandRanges(inputStr As String) As String
    Dim parts() As String
    Dim result As String
    Dim i As Long, startNum As Long, endNum As Long
    Dim temp As String

    inputStr = Replace(inputStr, " ", "") ' 空白を削除
    parts = Split(inputStr, ",")

    For i = LBound(parts) To UBound(parts)
        If InStr(parts(i), "~") > 0 Then
            startNum = Val(Split(parts(i), "~")(0))
            endNum = Val(Split(parts(i), "~")(1))
            If startNum > 0 And endNum >= startNum Then
                Dim j As Long
                For j = startNum To endNum
                    result = result & j & ","
                Next j
            End If
        Else
            If IsNumeric(parts(i)) Then
                result = result & Val(parts(i)) & ","
            End If
        End If
    Next i

    ' 最後のカンマを削除
    If Right(result, 1) = "," Then
        result = Left(result, Len(result) - 1)
    End If

    ExpandRanges = result
End Function

(みちくさ) 2025/07/27(日) 09:11:36


 標準モジュール
 -------------------------
 Public Function ExpSeq(s)
    Dim a() As String
    a = Split(s, ",")

    Dim i As Long, p As Long
    For i = 0 To UBound(a)
        p = InStr(a(i), "~")
        If p > 0 Then
            Dim j As Long, buf As String: buf = ""
            For j = Val(a(i)) To Val(Mid(a(i), p + 1))
                buf = buf & "," & j
            Next
            a(i) = Mid(buf, 2)
        End If
    Next
    ExpSeq = Join(a, ",")
 End Function
 -------------------------

 =ExpSeq(A1)

(hatena) 2025/07/27(日) 22:45:21


 UDF

 セルに =Order(A1) の様に使用

 標準モジュールへ
 Function Order$(s$)
    Dim r As Range, x, i&, y
    x = Split(s, ",")
    For i = 0 To UBound(x)
        y = Split(x(i), "~")
        If UBound(y) = 1 Then x(i) = Join(WorksheetFunction.Sequence(1, y(1) - y(0) + 1, y(0)), ",")
    Next
    Order = Join(x, ",")
End Function
(jindon) 2025/07/28(月) 15:14:32

 チナスキー様
 ここまで多くの回答がついている状況で、特に返答がないということは解決済みなのでしょうか。
 他の回答者様の時間を奪わないよう、「解決した」と一言添えておくと良いかと思います。
 血の気の多い人もいるので、いつ噛みつかれるかわかりませんよ。
 現状ここまで放置していると、誰かに噛みつかれそうな雰囲気が出てきています。
 治安維持の為にも、ご配慮いただけると幸いです。

 ※私の回答がズレていたことはご容赦ください。
(デボラ) 2025/07/28(月) 20:05:27

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.