Leyendo valor negativo de las celdas

La pregunta es esta … Cuando ActiveSheet.Cells (14, 5) .Value es algo así como -1.3 mi código falla … ¿Qué está causando esto?

Function TestCell() As Integer Dim Boon As Integer Dim nextBoon As Integer Dim nextTwo As Integer Dim nextOne As Integer Dim nextThree As Integer Boon = ActiveSheet.Cells(14, 5).Value nextBoon = ActiveSheet.Cells(14, 6).Value nextTwo = ActiveSheet.Cells(14, 7).Value nextOne = ActiveSheet.Cells(14, 8).Value nextThree = ActiveSheet.Cells(14, 9).Value If Boon <= 1.8 And Boon >= -1.8 Then If nextBoon <= 1000 And nextBoon >= -1000 Then If nextTwo <= 0.36 And nextTwo >= -0.36 Then If nextOne <= 0.13 And nextOne >= -0.13 Then If nextThree <= 1.2 And nextThree >= -1.2 Then TestCell = 1 Else TestCell = 0 End If Else TestCell = 0 End If Else TestCell = 0 End If Else TestCell = 0 End If Else TestCell = 0 End If End Function 

Como dijo JMax, usa Double en lugar de Integer para Boon. Realmente quería darte 2 consejos, ya que tu código es 2 veces mayor de lo que podría ser:

Primero, no use declaraciones else. Simplemente declare que el testcell es 0 y haga sus if-thens para ver si puede cambiarlo a 1 o no.

En segundo lugar, si solo está utilizando una celda 2 veces, no hay un beneficio particular para almacenarla como una variable (en el otro lado, pierde legibilidad). Simplemente use "cells (15, 5) .value", etc. Tampoco debe especificar activesheet; de forma pnetworkingeterminada usa la hoja activa.

Estos 2 consejos te ayudarán en el largo ploop y es una buena práctica seguirlos.

Actualización :

Permítanme introducir una forma mucho más rápida y más eficiente de hacer esto. Lo pasas en un range de 5 celdas. Al hacerlo de esta manera, puede arrastrar la fórmula hasta su columna y funcionará para cada celda.

En tu ejemplo, lo llamarías usando:

= TestCell (E14: I14)

 Function TestCell(ByVal myRange As Range) As Long Dim vArray As Variant Dim result As Long result = 0 vArray = myRange.Value If vArray(1, 1) <= 1.8 And vArray(1, 1) >= -1.8 Then If vArray(1, 2) <= 1000 And vArray(1, 2) >= -1000 Then If vArray(1, 3) <= 0.36 And vArray(1, 3) >= -0.36 Then If vArray(1, 4) <= 0.13 And vArray(1, 4) >= -0.13 Then If vArray(1, 5) <= 1.2 And vArray(1, 5) >= -1.2 Then result = 1 End If End If End If End If End If TestCell = result End Function 

Cómo funciona : el range de 5 celdas se convierte en una matriz variante (que puede contener integers, cadenas, dobles, lo que sea). Las comprobaciones se realizan usando el varray, ya que es increíblemente rápido, eficiente y no necesita preocuparse por los types de datos (uno de los principales beneficios es la capacidad de volcar un range completo en un vArray como ve que hago en mi código ) Dado que establecemos el resultado en 0, no necesitamos ninguna otra instrucción, solo haga los if-thens para ver si el valor se puede cambiar a 1 o no.

Usando este método, los cálculos pueden hacerse en microsegundos, y la function se actualiza cada vez que se cambia una de las 5 celdas, para que tenga resultados en time real.

Su Boon se declara como un Integer >> http://msdn.microsoft.com/fr-fr/library/06bkb8w2(v=vs.80).aspx

Entonces Boon = ActiveSheet.Cells(14, 5).Value devolverá -1 si el ActiveSheet.Cells(14, 5).Value es -1.3

Necesitas usar Double si quieres que funcione.

 Function TestCell() As Integer Dim Boon As Double