2017-06-26 5 views
0

Dans le code donné ci-dessous, c'était orchestrated by Robin Mackenzie, j'essaie maintenant d'obtenir la valeur absolue de l'équation. J'ai essayé d'utiliser la commande ABS():Retour valeur ABS de la formule en utilisant Excel VBA

.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2)," & _ strMeasCol & "ABS(2-" & strLowLimCol & "2," & _ strMeasCol & "2))"

Je ne pense pas que je suis d'exécuter la commande correctement. Pouvez-vous m'aider à obtenir la valeur abosulte de l'équation?

Voici le code:

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 
+0

Ceci est encore une utilisation terrible d'Excel et VBA –

Répondre

2

La façon la plus simple est de mettre le Abs dans toute la formule:

.Formula = "=ABS(IF(ISNUMBER(" & strLowLimCol & "2)," & _ 
      strMeasCol & "2-" & strLowLimCol & "2," & _ 
      strMeasCol & "2))" 

mais vous pouvez le mettre autour de chaque composant si vous voulez:

.Formula = "=IF(ISNUMBER(" & strLowLimCol & "2),ABS(" & _ 
      strMeasCol & "2-" & strLowLimCol & "2),ABS(" & _ 
      strMeasCol & "2))" 

La chose que vous devez vous rappeler est que strMeasCol & "2-" & strLowLimCol & "2 est creati Une formule utilisant deux adresses, telle que G2-K2, vous ne pouvez pas démarrer la ABS à mi-chemin (par ex. vous mettez le ABS( entre le G et le 2 dans mon exemple d'adresse, ce qui donne quelque chose comme GABS(2-K2).