【问题标题】:How to Sort Excel Column S.T. Rows w/ Null/Empty Column Cell Go On Top?如何对 Excel 列 A.T. 进行排序带有/空/空列单元格的行在顶部?
【发布时间】:2013-06-21 10:08:09
【问题描述】:

我有几行包含数据和运行宏时与数据相邻的“标志”。 例如:
名字 | | 标记

John  | Smith  | Needs a Bath 
Cindy | LuWho  | 
Bob   | Loblaw | Needs a Bath

目标:
我希望将不带标志的行(即列 C == NULL/空字符串)排序到顶部,然后按 A->Z 按列 B 排序以获得此:

辛迪 |卢谁 |
鲍勃 |洛布劳 |需要洗澡
John |史密斯 | 需要洗澡

我的尝试:
使用 Excel 2007 的“排序”,我完成了排序依据(C 列)、排序依据(值)排序依据(A 到 Z)和(Z 到 A)。 A 到 Z 和 Z 到 A 都导致标记的行位于顶部,而不是底部。

之前: 之后:

我最终想要代码,但我目前正试图弄清楚如何手动完成,这样我就可以通过 Excel 的“记录宏”获取代码。

【问题讨论】:

  • 你确定吗?我只有 Excel 2010,但是当我将此 Z 排序为 A 时,空白在顶部。当我从 A 到 Z 排序时,底部有空白。如果他们改变了 Sort 功能的工作方式,我会感到惊讶。
  • 我在 2007 年尝试过,从 A 到 Z 排序得到了您期望的结果。我不确定你做了什么,但你做错了:D
  • 我已经更新了过程图像。如果您以某种不同的方式处理此问题,或者知道我在这里做错了什么,请告诉我。
  • @David Zemens 和@Alexandre,你们都使用空白字段吗?这里的不同之处在于 Kurt 在 C 列中使用了一个公式。如果您将空白单元格替换为 ="",您可以获得 Kurt 描述的行为。
  • @PowerUser 嗯,很好。排序公式总是有点问题。正如您所建议的,帮助列可能是执行此操作的最佳方式。

标签: sorting excel excel-2007 vba


【解决方案1】:

根据我上面的评论,问题在于您使用的公式计算结果为空字符串。如果该字段实际上是空的,那么您将获得您正在寻找的行为。

这是一个肮脏但有效的方法

  1. 在右侧新建一列。使用公式=IF(C2<>"",2,1) 并填写。
  2. 隐藏列以防窥探(只需右键单击顶部的灰色列标题即可隐藏它)
  3. 按此列而不是 C 排序。

【讨论】:

  • 有什么办法可以让这个字段“实际上是空的”,从我在图片中的内容开始?我认为“删除”单元格中的数据会使其“实际上为空”,但我刚刚尝试过似乎并非如此。
  • 我不知道有任何工作表函数可以使单元格比"" 更空。从技术上讲,您可以编写一个宏来为您执行此操作,但是您必须将其保存为 .xlsm,会有宏警告等。我建议您只执行上述方法。我自己用过。
  • 但我最终会在预先存在的 .xlsm 中的宏中使用它,所以我毫不犹豫地让宏使事物“实际上为空”然后排序...
【解决方案2】:

我最终提出了一个 IMO 解决方案,它比 @Poweruser 创建另一个列、填充、隐藏它,然后在隐藏列上使用排序更优雅。我的方法利用基于条件格式的字体颜色更改并对其进行排序。

  1. 选择包含要排序的空白值的列的所需范围
  2. 使用条件格式>新规则>'使用公式确定要格式化的单元格'并在文本框中使用公式=IF(INDIRECT("RC",0)="",TRUE,FALSE)
  3. 选择“格式...”,选择“字体”选项卡并将字体颜色更改为非黑色或“自动”,应用更改
  4. 使用“排序”,将“排序依据”设为包含空白单元格的列,将“排序依据”设为“字体颜色”,将“排序依据”更改为您选择的任何颜色并将其设为“开”顶'

通过对录制的宏进行一些修改,我得到了以下工作代码(在对“空白”单元格排序后,它还按值排序另一列):

For oRow = 2 To iFinalRow
    ActiveWorkbook.ActiveSheet.Cells(oRow, 5).Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=IF(INDIRECT(""RC"",0)="""",TRUE,FALSE)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .ThemeColor = xlThemeColorLight2
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
Next oRow

'Sort
ActiveWorkbook.ActiveSheet.SORT.SortFields.Clear
ActiveWorkbook.ActiveSheet.SORT.SortFields.Add(Range("E:E"), _
    xlSortOnFontColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(31, 73, 125)
ActiveWorkbook.ActiveSheet.SORT.SortFields.Add _
    Key:=Range("D1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
    :=xlSortNormal
With ActiveWorkbook.ActiveSheet.SORT
    .SetRange Range("A:F")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

【讨论】:

    【解决方案3】:

    其中一种解决方案是在排序前用单引号 (') 替换空格。它不可见,但不是NULL。见代码示例:

    Public Sub Sort_blanks()
    
        Dim lastrow As Integer
    
        ' The number of the last row
        lastrow = Cells(Rows.Count, 1).End(xlUp).Row
    
        ' Replace blanks with with single quote
        Range("C2:C" & lastrow).Select
        Application.DisplayAlerts = False
        On Error Resume Next
        Selection.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "'"
        Application.DisplayAlerts = True
        On Error GoTo 0
    
        ' Sort
        Range("A:C").Sort key1:=Range("C:C"), key2:=Range("B:B"), _
            order1:=xlAscending, order2:=xlAscending, Header:=xlYes
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2023-02-02
      • 2010-12-11
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多