[[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

コメント返信:

[ 一覧(最新更新順) ]


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