『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
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.