【问题标题】:isNumeric returning wrong state in Excel VBAisNumeric 在 Excel VBA 中返回错误状态
【发布时间】:2017-06-24 14:47:14
【问题描述】:

在下面的代码中,我试图计算特定单元格中的数字是否为数字,否则从其他单元格返回数字。我认为我的实现是不正确的,因为如果第一个单元格不是数字,我只会填充 else 状态,反之亦然。你能告诉我如何解决这个问题吗?

这是数据示例:

第 6 个条目应在 Meas-LO 列中返回 27。

谢谢

这里是代码

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).Address(False, False)) 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("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

【问题讨论】:

    标签: vba excel equation


    【解决方案1】:

    Cells(2, lowLimCol).Address(False, False) 返回字符串地址而不是值。所以它永远不会是数字。

    改为:

    .Cells(2, lowLimCol).Value2
    

    【讨论】:

    • 我还要说更好的做法是将. 粘贴在cells 前面:.cells(2, lowLimCol).value2 ?我在吗?只是将其定向到With 工作表......出错的可能性很小,但也许用户在运行期间单击随机事物可能会导致它引用另一张工作表上的单元格?在运行我的一个冗长代码的用户在 Outlook 或 Word 或另一个 Excel 图表中点击离开之前,我遇到过这个问题,最终结果是一个充满 0000 的表格
    • @Scott Craner,感谢您的解决方案。我确实输入了命令If IsNumeric(.Cells(2, lowLimCol).Value2) Then,但如果第一个条目不是数字,我仍然只会得到“MeasValue”。我对第二行.Range("P2:P" &amp; LastRow).Formula =... 做了什么,这让我很困惑吗?谢谢。
    • @jamheadart,我现在是否必须将公式块放入while loop,因为条目可能是数字或不是数字?
    • 你的 if...else...end if 逻辑有问题。你有If isnumeric then (A) else (B) End if,但之后的下一行又是(A)......这意味着无论你的数字检查结果如何,(A)都会发生?
    • @jamheadart,对不起...我删除了该行,但得到了相同的结果。我认为该列只是根据第一个条件填充了条件。它不是动态的。也就是说,一些单元格可能是数字的,而另一些则不是,但是,一旦设置了第一个单元格,它就会确定整列的结果。谢谢。
    【解决方案2】:

    在了解您对问题的第二部分的含义后,我认为如何设置公式的最快解决方法是用公式填充整个列。

    这将比循环遍历每个单元格在代码中检查它是否是一个数字更快。您可以使用对电子表格本身进行检查的公式填充整个范围:例如=IF(ISNUMBER(C1),C1-D1,C1)

    为了在你的代码中得到它,我会替换整个if isNumeric then...

    替换此部分:

    If IsNumeric(Cells(2, lowLimCol).Address(False, False)) 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, measLimCol).Value2 & ")," & Cells(2, measLimCol).Address(False, False) & "-" & Cells(2, lowLimCol).Address(False, False) & "," & Cells(2, measLimCol).Address(False, False) & ")"
    

    【讨论】:

    • 感谢您的解决方案。我尝试了您的建议,但仍然没有得到正确的输出。我添加了数据布局的图像。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 2017-09-25
    • 1970-01-01
    • 2015-10-13
    • 2012-08-25
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多