Rikuo2000
@Rikuo2000 (Rikuo Tsuchida)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Excelの分割、統合について

Q&A

Closed

ここでExcelの質問は場所違いかもしれませんが失礼します

Excelで一つのセルの最後だけ異なるものを一つの文字列で表示しているものをそれぞれ自動で分解させることは可能でしょうか

hello1,2.3

hello1
hello2
hello3

にしたいです
現状コピーで増やして不要な部分を削除して対応してます
ご存じの方がいましたらご教授願います。
また逆に

hello1
hello2
hello3

hello1,2,3

とかにできる方法もあれば教えていただけると幸いです

0

3Answer

ユーザ定義関数で実装してみました

scr1.png scr2.png

Public Function Bunkai(aCell As String, prefix As String, position As Long) As Variant
    Bunkai = CVErr(xlErrNA)
    If Left(aCell, Len(prefix)) <> prefix Then Exit Function
    Dim result As String
    Dim ary As Variant: ary = Split(aCell, ",")
    Dim index As Long: index = LBound(ary) + position - 1
    If position = 1 Then
        result = ary(index)
    Else
        result = prefix & ary(index)
    End If
    Bunkai = result
End Function

Public Function Renketsu(aRange As Range) As Variant
    Renketsu = CVErr(xlErrNA)
    Dim row As Range, col As Range, cell As Range
    Dim result As String
    Dim maxLen As Long, maxString As String
    For Each col In aRange
        For Each cell In col
            If maxLen < Len(cell.Value) Then
                maxLen = Len(cell.Value)
                maxString = CStr(cell.Value)
            End If
        Next
    Next
    Dim matchLen As Long
    Dim nof As Boolean
    matchLen = 1
    Do While (matchLen < maxLen) And (Not nof)
        For Each col In aRange
            For Each cell In col
                If Left(maxString, matchLen) <> Left(cell, matchLen) Then nof = True
            Next
        Next
        If Not nof Then matchLen = matchLen + 1
    Loop
    matchLen = matchLen - 1
    If matchLen < 1 Then Exit Function
    Dim nos As Boolean
    result = Left(maxString, matchLen)
    For Each col In aRange
        For Each cell In col
            If Not nos Then
                nos = True
                result = result & Right(cell, Len(cell) - matchLen)
            Else
                result = result & "," & Right(cell, Len(cell) - matchLen)
            End If
        Next
    Next
    Renketsu = CVar(result)
End Function
3Like

Comments

  1. @Rikuo2000

    Questioner

    ありがとうございます

  2. 解決であれば、当Q&Aをクローズしてください

VBAを使えばいくらでもできそうなきがしますが、Excel関数だけだと少し厳しそうですね(当方Excelに精通していないのでお力になれない)

hello1,2.3

hello1
hello2
hello3

こちらに関してだけ、条件は少し異なるのですが出力は同じものができたのでご報告いたします。

=CONCATENATE("hello", ROW())とするとhello + 行数 で出力されるようになります。

2Like

Comments

  1. @Rikuo2000

    Questioner

    ありがとうございます

最新バージョンのExcelであれば、計算式だけで横に並べることはできます。

=LEFT(A1,FIND(",",A1)-2)&TEXTSPLIT(SUBSTITUTE(A1,LEFT(A1,FIND(",",A1)-2),""),",")

clip_1.png

逆については、範囲を指定するならこんな感じです。

=LEFT(A1,LEN(A1)-1)&SUBSTITUTE(TEXTJOIN(",",TRUE,A1:B3),LEFT(A1,LEN(A1)-1),"")

clip_3.png
この場合、helloの部分はA1セルを使うので他のセルがhelloで始まっていなくてもこの結果になってしまいます。

helloの部分が同じかどうかを判定した上でということであれば、縦に累積的に計算するしかないかも知れません。

=IF(LEFT(A1,LEN(A1)-1)=IFERROR(LEFT(INDIRECT("R[-1]C[-1]",FALSE),LEN(INDIRECT("R[-1]C[-1]",FALSE))-1),""),INDIRECT("R[-1]C",FALSE)&","&RIGHT(A1,1),A1)

clip_5.png

2Like

Comments

  1. @Rikuo2000

    Questioner

    ありがとうございます

Your answer might help someone💌