Return 使用 Excel VBA 公式得出的 ABS 值
Return ABS value from formula using Excel VBA
在下面给出的代码中,那是 ,我现在试图从等式中获得绝对值。我尝试使用 ABS()
命令:
.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2)," & _
strMeasCol & "ABS(2-" & strLowLimCol & "2," & _
strMeasCol & "2))"
我认为我没有正确执行命令。你能帮我从等式中得到绝对值吗?
代码如下:
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
最简单的方法是将 Abs
放在整个公式周围:
.Formula = "=ABS(IF(ISNUMBER(" & strLowLimCol & "2)," & _
strMeasCol & "2-" & strLowLimCol & "2," & _
strMeasCol & "2))"
但是如果你愿意,你可以把它放在每个组件周围:
.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2),ABS(" & _
strMeasCol & "2-" & strLowLimCol & "2),ABS(" & _
strMeasCol & "2))"
你必须记住的是 strMeasCol & "2-" & strLowLimCol & "2
正在使用两个地址创建一个公式,例如 G2-K2
- 所以你不能通过它开始 ABS
(即你在我的示例地址中将 ABS(
放在 G
和 2
之间,给出类似 GABS(2-K2
的内容)。
在下面给出的代码中,那是 ABS()
命令:
.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2)," & _
strMeasCol & "ABS(2-" & strLowLimCol & "2," & _
strMeasCol & "2))"
我认为我没有正确执行命令。你能帮我从等式中得到绝对值吗?
代码如下:
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
最简单的方法是将 Abs
放在整个公式周围:
.Formula = "=ABS(IF(ISNUMBER(" & strLowLimCol & "2)," & _
strMeasCol & "2-" & strLowLimCol & "2," & _
strMeasCol & "2))"
但是如果你愿意,你可以把它放在每个组件周围:
.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2),ABS(" & _
strMeasCol & "2-" & strLowLimCol & "2),ABS(" & _
strMeasCol & "2))"
你必须记住的是 strMeasCol & "2-" & strLowLimCol & "2
正在使用两个地址创建一个公式,例如 G2-K2
- 所以你不能通过它开始 ABS
(即你在我的示例地址中将 ABS(
放在 G
和 2
之间,给出类似 GABS(2-K2
的内容)。