isNumeric 在 Excel VBA 中返回错误状态
isNumeric returning wrong state in Excel VBA
在下面的代码中,我试图计算特定单元格中的数字是否为数字,否则 return 来自其他单元格的数字。我认为我的实现是不正确的,因为如果第一个单元格不是数字,我只会填充 else 状态,反之亦然。你能告诉我如何解决这个问题吗?
这是数据示例:
Meas-LO 列中的第 6 个条目应 return27。
谢谢
这是代码
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
Cells(2, lowLimCol).Address(False, False)
Returns 字符串地址不是值。所以它永远不会是数字。
更改为:
.Cells(2, lowLimCol).Value2
理解问题第二部分的含义后,我认为解决公式设置方式的最快方法是用公式填充整个列。
这比在代码 中遍历每个单元格以检查它是否为数字要快。您可以使用对电子表格本身进行检查的公式填充整个范围:例如=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) & ")"
在下面的代码中,我试图计算特定单元格中的数字是否为数字,否则 return 来自其他单元格的数字。我认为我的实现是不正确的,因为如果第一个单元格不是数字,我只会填充 else 状态,反之亦然。你能告诉我如何解决这个问题吗?
这是数据示例:
Meas-LO 列中的第 6 个条目应 return27。
谢谢
这是代码
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
Cells(2, lowLimCol).Address(False, False)
Returns 字符串地址不是值。所以它永远不会是数字。
更改为:
.Cells(2, lowLimCol).Value2
理解问题第二部分的含义后,我认为解决公式设置方式的最快方法是用公式填充整个列。
这比在代码 中遍历每个单元格以检查它是否为数字要快。您可以使用对电子表格本身进行检查的公式填充整个范围:例如=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) & ")"