web-dev-qa-db-ja.com

Excelの「テキストから列へ」機能の結果を「正しく整列」するにはどうすればよいですか?

次のデータでテキストから列への機能を使用している場合は、「;」を使用します区切り文字として:

foo; bar; qux; baz; toast;
quux; jam; Beans;

結果のセルのグリッドに「左揃え」の結果が表示されます。

 |foo   |bar   |qux   |baz   |toast |
 |quux  |jam   |beans |      |      |

しかし、私はそれらを「正しく整列」させたいと思います。

 |foo   |bar   |qux   |baz   |toast |
 |      |      |quux  |jam   |beans |

これどうやってするの?

注:「右揃え」は正しい用語ではない可能性があることを知っています。

|   foo|   bar|   qux|   baz| toast| 
|  quux|   jam| beans|      |      |

しかし、これは私が求めているものではありません。ですから、私が説明していることについて誰かがより良い用語を提案できるなら、そうしてください。

補遺:別のアプローチとして、Excelを使用してセルを再配置する方法を知っている人がいる場合

 |a   |b   |c   |d   |    |    |    |    |    |
 |n   |m   |o   |p   |q   |    |    |    |    |
 |e   |f   |g   |h   |i   |j   |k   |l   |    |
 |n   |m   |o   |p   |q   |    |    |    |    |
 |x   |    |    |    |    |    |    |    |    |

になります

 |    |    |    |    |    |a   |b   |c   |d   |
 |    |    |    |    |n   |m   |o   |p   |q   |
 |    |e   |f   |g   |h   |i   |j   |k   |l   |
 |    |    |    |    |n   |m   |o   |p   |q   |
 |    |    |    |    |    |    |    |    |x   |

それならそれもうまくいくでしょう。

4
Some_Guy

次の数式を使用すると、データを、説明したとおりに右寄せされたテキストから列に簡単に解析できる形式にすばやく変換できます。

Excel snip

D5式(存在しない場合はセミコロンを追加します):

=IF(RIGHT(B5,1)<>";",B5&";",B5)

G5式(必要な数のセミコロンを追加):

=REPT(";",5-(LEN(D5)-LEN(SUBSTITUTE(D5,";",""))))&D5

結果をコピーしてからPaste-Special-as-Valuesを実行すると、テキストから列への変換に適した原材料が得られます。

解決策は、列の最大数が固定されているかどうかに依存します。ここでは、5つ。 G5の数式は、シートの他の場所に「生成する列の数」セルを追加し、ハードコードされた5値の代わりにこの新しいセルを参照することで一般化できます。

さらに、データの末尾にセミコロンが常に含まれることが保証されている場合は、D5:D7の中間ステップは不要です。

EDIT:コメントでのSome_Guyの観察によれば、このメソッドは、すべての行がlackに構築されている場合にも機能します。末尾のセミコロン。

4
hBy2Py

すでに述べたように、これはテキストから列への標準機能ではなく、Excelでこれを行うための固有の方法もありません。ただし、このVBAはそれを行います(入力されたセルの間に空白がないと仮定)-

Sub test()
Dim lrow As Integer
lrow = Cells(Rows.Count, "A").End(xlUp).Row

Dim lcol As Integer
lcol = Cells("1", Columns.Count).End(xlToLeft).Column

Dim lfcol As Integer
Dim dif As Integer
For i = 1 To lrow
    lfcol = Cells(i, Columns.Count).End(xlToLeft).Column
    dif = lcol - lfcol
    For j = lfcol To 1 Step -1
        If dif = 0 Then Exit For
        If Not Cells(i, j) Is Nothing Then
            Cells(i, j + dif) = Cells(i, j)
            Cells(i, j) = vbNullString
        End If
    Next
Next
End Sub
2
Raystafarian

これを行うための別のVBAルーチンがあります。 Text to Columnsを実行してから、データを配置する長方形の範囲(つまり、列A最大フィールド)×行)を選択して、このマクロを実行します。教材については、---(MS OfficeにVBAを追加するにはどうすればよいですか? を参照してください。

Sub Copy_Right()
    For Each rr In Selection.Rows
        For cn = Selection.Columns.Count To 1 Step -1
            If Len(rr.Cells(1, cn)) > 0 Then Exit For
        Next cn
        ' cn is now the (relative) column number of the last cell in this row
        ' that contains (non-blank) data.
        my_offset = Selection.Columns.Count - cn
        ' my_offset is how many columns to the right we need to move.
        ' If my_offset = 0, the row is full of data (or, at least,
        ' the last column contains data; there may be blank cells
        ' to its left), so there’s nowhere to move it.
        ' If cn = 0, the row is empty, so there’s nothing to move.
        If cn = 0 Or my_offset = 0 Then
            ' Nothing to do.
        Else
            For cn = Selection.Columns.Count To 1 Step -1
                If cn > my_offset Then
                    ' Copy data to the right.
                    rr.Cells(1, cn) = rr.Cells(1, cn - my_offset)
                Else
                    ' Set the cells on the left to blank.
                    rr.Cells(1, cn) = ""
                End If
            Next cn
        End If
    Next rr
End Sub

このwillは、埋め込まれた空白セルを処理します(例:the;quick;;fox;)正しく。そうでなければ、この答えと他の答えの違いは単に恣意的な個人的な好みであり、他の答えは私が理解できない方法で優れている可能性があります。

2
Scott