按字母顺序重新排列具有多个值的单元格[Excel]

按字母顺序重新排列具有多个值的单元格[Excel],excel,vba,Excel,Vba,我有一个Excel文件,其中一个单元格有多个值,用逗号分隔。例如:纽约、芝加哥、洛杉矶。现在我想按字母顺序重新排列这个细胞,比如:芝加哥,洛杉矶,纽约。有没有一种简单的方法可以做到这一点?假设您的数据是A1格式的,请使用文本对具有分隔宽度的列进行排序,并选择逗号作为分隔符。拆分单元格时,将其全部选中并按字母顺序排序。然后在另一个细胞中使用 =A1 & ", " & B1 & ", " C1 等等。如果您想在VBA中实现这一点(根据您的标签),一个好的起点是在录制宏时执行

我有一个Excel文件,其中一个单元格有多个值,用逗号分隔。例如:纽约、芝加哥、洛杉矶。现在我想按字母顺序重新排列这个细胞,比如:芝加哥,洛杉矶,纽约。有没有一种简单的方法可以做到这一点?

假设您的数据是A1格式的,请使用文本对具有分隔宽度的列进行排序,并选择逗号作为分隔符。拆分单元格时,将其全部选中并按字母顺序排序。然后在另一个细胞中使用

=A1 & ", " & B1 & ", " C1
等等。如果您想在VBA中实现这一点(根据您的标签),一个好的起点是在录制宏时执行上述操作,然后根据需要进行编辑

编辑

这一点也不漂亮,但它是使用VBA遍历每一行的起点

Dim i As Integer, lastRow As Integer, curRng As Range

lastRow = Range("A10000").End(xlUp).Row

For i = 1 To lastRow
Cells(i, 1).Select
Set curRng = Range(ActiveCell, ActiveCell.End(xlToRight))
    curRng.Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=curRng, _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange curRng
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
Next i

假设您的数据是A1格式,请使用文本分隔宽度的列,并选择逗号作为分隔符。拆分单元格时,将其全部选中并按字母顺序排序。然后在另一个细胞中使用

=A1 & ", " & B1 & ", " C1
等等。如果您想在VBA中实现这一点(根据您的标签),一个好的起点是在录制宏时执行上述操作,然后根据需要进行编辑

编辑

这一点也不漂亮,但它是使用VBA遍历每一行的起点

Dim i As Integer, lastRow As Integer, curRng As Range

lastRow = Range("A10000").End(xlUp).Row

For i = 1 To lastRow
Cells(i, 1).Select
Set curRng = Range(ActiveCell, ActiveCell.End(xlToRight))
    curRng.Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=curRng, _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange curRng
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
Next i

使用SPLIT函数首先将逗号分隔的值列表存储在数组中,然后根据需要对数组进行排序,然后使用JOIN函数再次创建逗号分隔的值列表

例如:

myArray = SPLIT(Cell.Value, ",")
Call SomeSortFunction(myArray)
myString = JOIN(myArray, ",")
Cell.Value = myString

使用SPLIT函数首先将逗号分隔的值列表存储在数组中,然后根据需要对数组进行排序,然后使用JOIN函数再次创建逗号分隔的值列表

例如:

myArray = SPLIT(Cell.Value, ",")
Call SomeSortFunction(myArray)
myString = JOIN(myArray, ",")
Cell.Value = myString

您需要将单元格中的值字符串保存到函数中,然后循环使用逗号进行列表拆分:

Array = Split(yourString, ",")
然后循环通过它:

For i = 0 To UBound(Array)
要查找每个值的第一个字母,我将使用如下内容:

Left(Array(i), Len(Array(i)) - 1)

然后可以按字母顺序对其排序。您可以使用函数交换值。

您需要将单元格中的值字符串保存到函数中,然后循环使用逗号进行列表拆分:

Array = Split(yourString, ",")
然后循环通过它:

For i = 0 To UBound(Array)
要查找每个值的第一个字母,我将使用如下内容:

Left(Array(i), Len(Array(i)) - 1)

然后可以按字母顺序对其排序。您可以使用函数来交换周围的值。

试试这个。以下代码将读取列
A
中的值,并在列
B
中给出所需的结果

Sub SortString()
    Dim MyArray As Variant, varSwap As Variant
    Dim i As Long, min As Long, max As Long, LastRow As Long
    Dim str As String
    Dim MyRange As Range
    Dim IsSwapped As Boolean

    LastRow = Cells(Rows.Count, "A").End(xlUp).Row

    Set MyRange = Range("A1:A" & LastRow)
    For Each cell In MyRange
        MyArray = Split(cell.Value, ",")

        min = LBound(MyArray)
        max = UBound(MyArray) - 1
        Do
            IsSwapped = False
            For i = min To max
                If MyArray(i) > MyArray(i + 1) Then
                    varSwap = MyArray(i)
                    MyArray(i) = MyArray(i + 1)
                    MyArray(i + 1) = varSwap
                    IsSwapped = True
                End If
            Next
            max = max - 1
        Loop Until Not IsSwapped

        For i = LBound(MyArray) To UBound(MyArray)
            Debug.Print MyArray(i)
            If str = "" Then
                str = Trim(MyArray(i))
            Else
                str = str & ", " & Trim(MyArray(i))
            End If
        Next i
        cell.Offset(0, 1).Value = str
        str = ""
    Next cell
End Sub

试试这个。以下代码将读取列
A
中的值,并在列
B
中给出所需的结果

Sub SortString()
    Dim MyArray As Variant, varSwap As Variant
    Dim i As Long, min As Long, max As Long, LastRow As Long
    Dim str As String
    Dim MyRange As Range
    Dim IsSwapped As Boolean

    LastRow = Cells(Rows.Count, "A").End(xlUp).Row

    Set MyRange = Range("A1:A" & LastRow)
    For Each cell In MyRange
        MyArray = Split(cell.Value, ",")

        min = LBound(MyArray)
        max = UBound(MyArray) - 1
        Do
            IsSwapped = False
            For i = min To max
                If MyArray(i) > MyArray(i + 1) Then
                    varSwap = MyArray(i)
                    MyArray(i) = MyArray(i + 1)
                    MyArray(i + 1) = varSwap
                    IsSwapped = True
                End If
            Next
            max = max - 1
        Loop Until Not IsSwapped

        For i = LBound(MyArray) To UBound(MyArray)
            Debug.Print MyArray(i)
            If str = "" Then
                str = Trim(MyArray(i))
            Else
                str = str & ", " & Trim(MyArray(i))
            End If
        Next i
        cell.Offset(0, 1).Value = str
        str = ""
    Next cell
End Sub

看到这篇文章,可以看到一个宏,它显然满足了你的要求:看到这篇文章,可以看到一个宏,它显然满足了你的要求:我如何按照每列的字母顺序对它们排序?在本例中,如果B1变成纽约、C1芝加哥和D1洛杉矶。我如何重新安排他们成为B1芝加哥、C1洛杉矶和D1纽约?我有450.000行,每行有一个单元格,单元格中有1到4个值。我需要它们都按行排序如何按字母顺序按列排序?在本例中,如果B1变成纽约、C1芝加哥和D1洛杉矶。我如何重新安排他们成为B1芝加哥、C1洛杉矶和D1纽约?我有450.000行,每行有一个单元格,单元格中有1到4个值。我需要按行分类谢谢。这几乎是可行的,只是它总是在单元格的末尾存储第一个值。例如:a,b,f,l,o,u,i,z,x,y给出b,f,i,l,o,u,x,y,z,a@user30058-让我检查一下。@user30058-只要将行
如果MyArray(i)>MyArray(i+1)替换为
如果Trim(MyArray(i))>Trim(MyArray(i+1)),然后
。空间可能会带来问题。让我知道它现在是否工作。谢谢。这几乎是可行的,只是它总是在单元格的末尾存储第一个值。例如:a,b,f,l,o,u,i,z,x,y给出b,f,i,l,o,u,x,y,z,a@user30058-让我检查一下。@user30058-只要将行
如果MyArray(i)>MyArray(i+1)替换为
如果Trim(MyArray(i))>Trim(MyArray(i+1)),然后
。空间可能会带来问题。让我知道它现在是否工作。