用于在单个细胞中检测不按顺序的数字的公式

时间:2018-02-13 14:24:26

标签: excel vba excel-vba if-statement excel-formula

在工作中,我们目前使用的程序在单个单元格中输出产品编号组合。例如,在单元格C2中,将显示“1 4 6”以显示客户订购的产品1,4和6.这些数字由单个空格分隔。是否有任何if()类型公式我可以使用它来检测产品是否出现故障,如“1 6 4”。我不想将文本用于列转换,因为我希望将其全部保存在一个步骤中。

谢谢!

3 个答案:

答案 0 :(得分:2)

这是一个VBA函数,它将测试一串数字是否按升序排列:

Function InOrder(nums As String) As Boolean
    Dim numbers As Variant
    Dim i As Long
    numbers = Split(Trim(nums))
    For i = LBound(numbers) To UBound(numbers) - 1
        If Val(numbers(i)) > Val(numbers(i + 1)) Then
            InOrder = False
            Exit Function
        End If
    Next i
    InOrder = True
End Function

这可以直接在工作表中使用。 InOrder("1 4 6")评估为True,但InOrder("1 6 4")评估为False

答案 1 :(得分:1)

Offtopic启动

这很奇怪。大约1小时前,我是checking this question,因此我决定模仿输入,看看会发生什么。为了模仿输入,我可能已经构建了你需要的东西:

Offtopic端

Option Explicit

Public Sub SplitSingleColumnToCells()

    Dim rngInput    As Range
    Dim rngOutput   As Range
    Dim myCell      As Range

    'Set manually, it is faster :)
    Set rngInput = Range("A1:A22")

    For Each myCell In rngInput
        'replace multiple space with single space:
        myCell = Replace(myCell, Chr(32), Chr(32))
        Dim inputArray As Variant
        inputArray = Split(myCell)

        Dim col     As Long
        Dim i       As Long
        col = 0
        For i = LBound(inputArray) To UBound(inputArray)
            If Len(inputArray(i)) > 0 Then
                col = col + 1
                myCell.Offset(0, col) = inputArray(i)
            End If
        Next i
        'Probably not needed:
        'myCell.Clear
    Next myCell
End Sub

只需检查rngInput并正确调整即可。它会在下一列中为您提供值。另外,如果拆分有多个空白区域,它就可以工作。

因此,如果这是输入:

enter image description here

这是输出:

enter image description here

答案 2 :(得分:0)

以下是使用LOOKUP构建的基于IF的公式(与imaginaryhuman所说的相同)

包含1 4 6等数据的源单元格假定为A2。未经过严格测试。

=IF(LOOKUP(9E+307,-((MID(SUBSTITUTE(" "&A2," ",REPT(" ",99)),ROW($A$1:INDEX(A:A,(LEN(A2)-LEN(SUBSTITUTE(A2," ","")))+1))*99,99)+0)-(MID(SUBSTITUTE(" 0 "&A2," ",REPT(" ",99)),ROW($A$1:INDEX(A:A,(LEN(A2)-LEN(SUBSTITUTE(A2," ","")))+1))*99,99)+0)))>0,"Out of sequence","In sequence")