【问题标题】:How can I sort a a table with VBA with given text condition?如何在给定文本条件下使用 VBA 对表格进行排序?
【发布时间】:2016-05-17 20:19:11
【问题描述】:

我使用的软件可以在下图中生成类似的输出:

我想根据RetValue后面的数字对这个表进行排序。

有没有一种简单的方法可以用 VBA 做到这一点?

【问题讨论】:

  • 使用宏记录器?

标签: vba excel


【解决方案1】:

我一直非常喜欢在单元格中存储数字。特别是在 Excel 中,数字值得存储,以便进行计算。那么,为什么不将数字 36(例如)与

.NumberFormat = """RetValue ""00""Y"""

那么您仍然可以看到RetValue 36Y,但实际上只有36 是单元格的.Value,您可以进行计算。

不过,要对上表进行排序,没有什么特别需要考虑的。由于所有单元格都以相同的字符串开头,因此所有单元格都将正确排序。唯一的“问题”将是RetValue 4Y,因为它不是两位数。

再一次,我会尝试正确格式化它。如果这不是一个选项,那么我会选择here 提供的任何解决方案来提取数字,然后对其进行排序。在此过程中,我将(如上所述)仅将数字存储在 cell.Value 中,并将其周围的文本包装为 .NumberFormat,以便将来进行更多计算(如有必要)。

之后,您可以使用以下解决方案对表格进行排序: Sort range without sorting it in a spreadsheet

它使您可以选择在将结果粘贴到工作表之前将其作为内存中的数组进行排序,或者使用 UDF(作为数组公式输入)。

未来注意事项:请不要发布图片,而是发布我们可以复制以进行测试的格式化文本。

【讨论】:

  • 一个好主意! (+1)
【解决方案2】:

我不会使用 VBA,而是使用 Split Text Into Multiple Cells 并在 Filter/Sort 中按新创建的“__Y”列进行排序。

【讨论】:

    【解决方案3】:

    A1 到 B4 中的数据,在 C1 中输入:

    =--LEFT(MID(A1,FIND(" ",A1)+1,9999),LEN(MID(A1,FIND(" ",A1)+1,9999))-1)
    

    然后运行录制的宏:

    Sub Macro1()
        Range("A1:C4").Select
        Application.CutCopyMode = False
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C1:C4"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range("A1:C4")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End Sub
    

    【讨论】:

    • 当你和我刚刚准备了如此出色的排序代码(包括 UDF)时,为什么还要发布“新”排序代码:stackoverflow.com/questions/37239107/…
    • @Ralph 在这种特殊情况下,我想强调使用记录代码以及“帮助器”列........但是你的方法显然是最好的答案!
    • 当然,你是对的。对于大多数基本的 VBA 代码 (+1),宏记录器是一个经常被遗忘且使用不足的助手
    【解决方案4】:

    此操作可能不需要 VBA。

    您可以在 C 列中插入以下公式(假设 A 列中的 RetValue 和 B 列中的值,并且您的数据从第 3 行开始)。

    =MID(A3, FIND(" ",A3,1)+1, FIND("Y",A3,FIND(" ",A3,1))-10)

    您可以按 C 列排序。

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2021-04-27
      • 2022-01-10
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多