Excel - 宏不按升序查找列中的数字

时间:2017-02-01 02:05:19

标签: excel vba excel-vba

在研究中,我找到了一个检查整个列的公式,并回答了错误的答案。但它不是我需要完成的。

我想选择一个数字列并运行一个宏,当一个数字不大于那个进行它的数字时停止。

我有一个55000的列,据说按升序排列。我需要挑选提升中的错误。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用数组公式来完成。如果您的列是“A”并且有55000行,请在任何单元格中输入此数组公式:

=AND(A1:A54999 <= A2:A55000)

这是一个数组公式,输入它并按Ctrl+Shift+Enter。如果您只是像普通公式那样按Enter将无法正常工作

修改

所以问题不仅在于知道是否存在错误,而且还要发现错误。这是一个VBA宏,它将Select第一次出现排序错误,否则它会通知您没有错误。它使用当前选定的单元格作为列中的第一个单元格进行检查。

Sub checkColumnSorting() ' <-- uses current selection as first cell in column
    Dim firstCell As Range, lastCell As Range, i As Long, ar
    Set firstCell = Selection
    With firstCell.Parent
        Set lastCell = .Cells(.Rows.Count, firstCell.Column).End(xlUp)
        ar = Application.Transpose(.Range(firstCell, lastCell))
        For i = LBound(ar) To UBound(ar) - 1
            If ar(i) > ar(i + 1) Then
                .Activate
                .Cells(i + firstCell.Row, firstCell.Column).Select
                msgBox "Error in ascending sorting at row " & i + firstCell.Row
                Exit Sub
            End If
        Next
    End With
    msgBox "Ascending sorting is Ok"
End Sub

答案 1 :(得分:0)

您可以使用此功能返回所有未排序的单元格地址:

Option Explicit

Function IsItSorted(rng As Range) As Variant
    Dim vals As Variant
    Dim nErrs As Long, iVal As Long

    vals = Application.Transpose(rng.Value)
    ReDim errs(LBound(vals) To UBound(vals)) As String

    For iVal = LBound(vals) To UBound(vals) - 1
        If vals(iVal) > vals(iVal + 1) Then
            nErrs = nErrs + 1
            errs(LBound(vals) - 1 + nErrs) = rng(LBound(vals) - 1 + iVal).address
        End If
    Next
    If nErrs > 0 Then
        ReDim Preserve errs(LBound(vals) To LBound(vals) - 1 + nErrs) As String
        IsItSorted = "Errors at: " & Join(errs, ",")
    Else
        IsItSorted = "Sorting: OK"
    End If
End Function

在主代码中用作:

Sub main()
    MsgBox IsItSorted(Range("B2:B11"))
End Sub