ISNUMBER返回#VALUE! VBA公式中的错误

时间:2017-06-25 12:44:14

标签: excel vba excel-vba excel-formula

这个问题是从solution found here构建的。我希望能够检查“LowLimit”单元格是否为数字。如果是则执行等式,否则从“MeasValue”列返回值。以下是我当前结果的数据集示例:

enter image description here

如您所见,第6个数据输入计算给出了错误的计算。数字LowLimit值22似乎在公式中被硬编码。你能帮我解决这个问题吗?感谢。

这是我到目前为止的代码:

Sub ReturnMarginal()
'UpdatebySUPERtoolsforExcel2016
    Dim xOut As Worksheet
    Dim xWb As Workbook
    Dim xWks As Worksheet
    Dim InterSectRange As Range
    Dim lowLimCol As Integer
    Dim hiLimCol As Integer
    Dim measCol As Integer

    Application.ScreenUpdating = False
    Set xWb = ActiveWorkbook
    For Each xWks In xWb.Sheets
    xRow = 1
    With xWks
        FindString = "LowLimit"
        If Not xWks.Rows(1).Find(FindString) Is Nothing Then

        .Cells(xRow, 16) = "Meas-LO"
        .Cells(xRow, 17) = "Meas-Hi"
        .Cells(xRow, 18) = "Min Value"
        .Cells(xRow, 19) = "Marginal"
        lastRow = .UsedRange.Rows.Count
        lowLimCol = Application.WorksheetFunction.Match("LowLimit", xWks.Range("1:1"), 0)
        hiLimCol = Application.WorksheetFunction.Match("HighLimit", xWks.Range("1:1"), 0)
        measLimCol = Application.WorksheetFunction.Match("MeasValue", xWks.Range("1:1"), 0)

        'If IsNumeric(.Cells(2, lowLimCol).Value2) Then
        '       .Range("P2:P" & LastRow).Formula = "=" & Cells(2, measLimCol).Address(False, False) & "-" & Cells(2, lowLimCol).Address(False, False)
        'Else
        '       .Range("P2:P" & LastRow).Formula = "=" & Cells(2, measLimCol).Address(False, False)
        'End If

        .Range("P2:P" & lastRow).Formula = "=IF(ISNUMBER(" & .Cells(2, lowLimCol).Value & ")," & Cells(2, measLimCol).Address(False, False) & "-" & Cells(2, lowLimCol).Address(False, False) & "," & Cells(2, measLimCol).Address(False, False) & ")"

        .Range("Q2:Q" & lastRow).Formula = "=" & Cells(2, hiLimCol).Address(False, False) & "-" & Cells(2, measLimCol).Address(False, False)


        .Range("R2").Formula = "=min(P2,Q2)"
        .Range("R2").AutoFill Destination:=.Range("R2:R" & lastRow)

        .Range("S2").Formula = "=IF(AND(R2>=-3, R2<=3), ""Marginal"", R2)"
        .Range("S2").AutoFill Destination:=.Range("S2:S" & lastRow)



        End If

     End With

     Application.ScreenUpdating = True 'turn it back on

 Next xWks
End Sub

1 个答案:

答案 0 :(得分:2)

我认为您可以在此处获得的主要改进是,一旦确定第1行中的位置,就会获得LowLimitHighLimitMeasValue的列字母。然后您可以参考设置.Formula属性时的那些列字母。

有关将列号转换为字母here的有用帖子。

此外,您无需自动填充列RS - 您可以采用与列PQ相同的方式填充

我稍微更新了你的代码 - 希望它有所帮助:

Option Explicit

Sub ReturnMarginal()

    Dim ws As Worksheet
    Dim lngLowLimCol As Long, strLowLimCol As String
    Dim lngHiLimCol As Long, strHiLimCol As String
    Dim lngMeasCol As Long, strMeasCol As String
    Dim lngLastRow As Long
    Dim wsf As WorksheetFunction

    ' get worksheetfunction references
    Set wsf = Application.WorksheetFunction

    ' iterate worksheets
    For Each ws In ThisWorkbook.Worksheets

        ' validate LowLimit label is on sheet
        If ws.Rows(1).Find("LowLimit") Is Nothing Then Exit Sub

        ' get location of input data columns and number of rows
        lngLowLimCol = wsf.Match("LowLimit", ws.Rows(1), 0)
        lngHiLimCol = wsf.Match("HighLimit", ws.Rows(1), 0)
        lngMeasCol = wsf.Match("MeasValue", ws.Rows(1), 0)
        lngLastRow = ws.Cells(1, lngLowLimCol).End(xlDown).Row

        ' get column letters for input data columns
        strLowLimCol = Split(ws.Cells(1, lngLowLimCol).Address(True, False), "$")(0)
        strHiLimCol = Split(ws.Cells(1, lngHiLimCol).Address(True, False), "$")(0)
        strMeasCol = Split(ws.Cells(1, lngMeasCol).Address(True, False), "$")(0)

        ' output headers
        ws.Range("P1") = "Meas-LO"
        ws.Range("Q1") = "Meas-Hi"
        ws.Range("R1") = "Min Value"
        ws.Range("S1") = "Marginal"

        ' assign formulas to outputs
        ' Meas-LO
        With ws.Range("P2:P" & lngLastRow)
            .Formula = "=IF(ISNUMBER(" & strLowLimCol & "2)," & _
                strMeasCol & "2-" & strLowLimCol & "2," & _
                strMeasCol & "2)"
        End With

        ' Meas-Hi
        With ws.Range("Q2:Q" & lngLastRow)
            .Formula = "=" & strHiLimCol & "2-" & strMeasCol & "2"
        End With

        ' Min Value
        With ws.Range("R2:R" & lngLastRow)
            .Formula = "=MIN(P2,Q2)"
        End With

        ' Marginal
        With ws.Range("S2:S" & lngLastRow)
            .Formula = "=IF(AND(R2>=-3,R2<=3),""Marginal"",R2)"
        End With

    Next 'ws

End Sub

输出:

enter image description here