在研究中,我找到了一个检查整个列的公式,并回答了错误的答案。但它不是我需要完成的。
我想选择一个数字列并运行一个宏,当一个数字不大于那个进行它的数字时停止。
我有一个55000的列,据说按升序排列。我需要挑选提升中的错误。
谢谢
答案 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