Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
isNumeric在Excel VBA中返回错误状态_Vba_Excel_Equation - Fatal编程技术网

isNumeric在Excel VBA中返回错误状态

isNumeric在Excel VBA中返回错误状态,vba,excel,equation,Vba,Excel,Equation,在下面的代码中,我试图计算特定单元格中的数字是否为数字,否则返回其他单元格中的数字。我认为我的实现是不正确的,因为我只在第一个单元格不是数字的情况下填充else状态,反之亦然。你能告诉我怎么修吗 这是一个数据示例: 第6个条目应在Meas LO列中返回27 谢谢 这是密码 Sub ReturnMarginal() 'UpdatebySUPERtoolsforExcel2016 Dim xOut As Worksheet Dim xWb As Workbook

在下面的代码中,我试图计算特定单元格中的数字是否为数字,否则返回其他单元格中的数字。我认为我的实现是不正确的,因为我只在第一个单元格不是数字的情况下填充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
Sub-ReturnMarginal()
'UpdatebySUPERtoolsforExcel2016
将xOut设置为工作表
Dim xWb作为工作簿
将xWks设置为工作表
将范围变暗为范围
Dim lowLimCol为整数
作为整数的Dim-hiLimCol
Dim measCol作为整数
Application.ScreenUpdating=False
设置xWb=ActiveWorkbook
对于xWb.表中的每个xWks
xRow=1
用xWks
FindString=“LowLimit”
如果不是,那么xWks.Rows(1).Find(FindString)什么都不是
.单元格(X行,16)=“表示低”
.单元格(X行,17)=“表示高”
.单元格(X行,18)=“最小值”
.单元格(第19行)=“边缘”
LastRow=.UsedRange.Rows.Count
lowLimCol=Application.WorksheetFunction.Match(“LowLimit”,xWks.Range(“1:1”),0)
hiLimCol=Application.WorksheetFunction.Match(“上限”,xWks.Range(“1:1”),0)
measLimCol=Application.WorksheetFunction.Match(“MeasValue”,xWks.Range(“1:1”),0)
如果是数字(单元格(2,lowLimCol).Address(False,False)),则
.Range(“P2:P”和LastRow)。公式=“=”和单元格(2,measLimCol)。地址(False,False)&“-”和单元格(2,lowLimCol)。地址(False,False)
其他的
.Range(“P2:P”和LastRow).Formula=“=”和单元格(2,measLimCol).Address(False,False)
如果结束
.Range(“Q2:Q”和LastRow)。公式=“=”和单元格(2,hiLimCol)。地址(False,False)&“-”和单元格(2,measLimCol)。地址(False,False)
.范围(“R2”).公式=“=min(P2,Q2)”
.Range(“R2”)。自动填充目标:=.Range(“R2:R”和LastRow)
.Range(“S2”).Formula=“=IF(AND(R2>=-3,R2
单元格(2,lowLimCol)).Address(False,False)
返回字符串地址而不是值。因此它永远不会是数字

改为:

.Cells(2, lowLimCol).Value2
单元格(2,lowLimCol).Address(False,False)
返回字符串地址而不是值。因此它永远不会是数字

改为:

.Cells(2, lowLimCol).Value2

在理解了你的问题的第二部分的意思之后,我认为最快的解决办法就是用公式填充整个列

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

为了在您的代码中得到它,我将替换整个
,如果是数字,那么…

替换本节:

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) & ")"

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

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

为了在您的代码中得到它,我将替换整个
,如果是数字,那么…

替换本节:

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) & ")"

我还想说,更好的做法是将
粘贴在
单元格前面
.cells(2,lowLimCol).value2
?我说的对吗?只是将它指向带有
工作表的
…出错的可能性很低,但用户在运行过程中单击随机内容可能会导致它引用另一张工作表上的单元格?我以前遇到过这样的问题,即运行我的一个冗长代码的用户在Outlook或Word或其他Excel中不断单击最后的结果是一张满是0000@Scott克兰纳,谢谢你的解决方案。我确实把命令
放在了IsNumeric(.Cells(2,lowLimCol).Value2)之后
,但是如果第一个条目不是数字,我仍然只能得到“MeasValue”。我是不是在用第二行
.Range(“P2:P”&LastRow)做什么.Formula=…
,这把我搞糊涂了?谢谢。@jamheadart,我现在必须把Formula块放到a
while循环中吗?因为条目可能是数字或不是数字?if…else…end if逻辑有问题。如果
是数字,那么(a)else(B)end if
,但是后面的下一行就是(a)再次……这意味着(A)无论您的isnumeric检查结果如何,都会发生吗?@jamheadart,对不起……我删除了该行,但得到了相同的结果。我认为该列只是根据第一个条件填充条件。它不是动态的。也就是说,一旦第一个单元格被删除,一些单元格可能是数字,而其他单元格可能不是数字s set,它决定了整个专栏的结果。谢谢。我还想说,更好的做法是将
粘贴在
单元格前面.value2
?我说的对吗?只是将它指向带有
工作表的
…出错的可能性很低,但用户在运行过程中单击随机内容可能会导致它引用另一张工作表上的单元格?我以前遇到过这样的问题,即运行我的一个冗长代码的用户在Outlook或Word或其他Excel中不断单击最后的结果是一张满是0000@Scott克兰纳,谢谢你的解决方案。我确实把命令
放在了IsNumeric(.Cells(2,lowLimCol).Value2)之后
,但是如果第一个条目不是数字,我仍然只能得到“MeasValue”。我是不是在用第二行做什么<