如何使用/ Null / Empty列单元格对Excel列进行排序?

时间:2013-06-24 19:16:34

标签: excel sorting excel-vba excel-2007 vba

我有几行在运行宏时会在数据旁边引发数据和“标志”。 例如:
名字 | 姓氏 |的 标志

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

目标:
我希望行w / o标志(即列C == NULL /空字符串)排序到顶部,然后按B列按A-> Z排序得到这个:

  

Cindy | LuWho |
鲍勃| Loblaw |需要洗澡左约翰史密斯|   需要洗澡

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

在:enter image description here 后:
enter image description here

我最终想要代码,但我现在正试图弄清楚如何手动完成,以便我可以通过Excel的“记录宏”来获取代码。

3 个答案:

答案 0 :(得分:3)

根据我上面的评论,问题是您使用的计算结果为空字符串。如果该字段实际上是空的,那么您将拥有所需的行为。

这是一个脏 - 但它正在工作的方法:

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

答案 1 :(得分:0)

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

  1. 选择包含要按
  2. 排序的空白值的所需列范围
  3. 使用条件格式&gt;新规则&gt;'使用公式确定要格式化的单元格'并在文本框中使用公式=IF(INDIRECT("RC",0)="",TRUE,FALSE)
  4. 选择“格式...”,选择“字体”标签并将字体颜色更改为非黑色或“自动”,应用更改
  5. 使用'排序','排序依据'是带有空白单元格的列,'排序打开'是'字体颜色',对于'排序依据'将自动更改为您选择的任何颜色并将其设置为'开顶部的“
  6. 通过稍微修改录制的宏,我得到了以下工作代码(在对“空白”单元格进行排序后,它还按值对另一列进行排序):

    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
    

答案 2 :(得分:0)

其中一个解决方案是在排序之前用单引号(')替换空格。它不可见,但不是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