『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
なるほどです =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.