Visual Basic para Aplicaciones - Division por cero en calculo con rangos

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Division por cero en calculo con rangos

Publicado por Quinto (30 intervenciones) el 24/11/2010 11:11:01
Hola amigos,

otro error en el calculo con funciones similares a las anteriores.

Tengo esta funcion:

Function MyDiv(rng1 As Range, rng2 As Range) As Double
MyDiv = Evaluate("Average(" & rng1.Address & "/" & rng2.Address & ")")
End Function

si alguno de los valores de rgn2 es cero, por supuesto da error. Mi pregunta:

Existira alguna forma desde codigo VBA de ponerle una condicion para que solo realice el calculo con los valores sean <>0? Es decir que la funcion pueda realizar su operacion matematica sin tener que realizar el calculo verificando uno a uno?

mil gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JuanC

RE:Division por cero en calculo con rangos

Publicado por JuanC (565 intervenciones) el 24/11/2010 15:18:02
probá algo así...
If Excel.WorksheetFunction.Sum(rng2) <> 0 Then
MyDiv = Evaluate("Average(" & rng1.Address & "/" & rng2.Address & ")")
Else
....
End If

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Division por cero en calculo con rangos

Publicado por Quinto (30 intervenciones) el 24/11/2010 17:42:49
JuanC,

pero en ese caso la condicion es para la sumatoria del rango, no para cada uno de los elementos.

Mi funcion divide cada elemento del rango1 por otro del rango2 y luego los promedia, es decir que de haber un solo elemento igual a 0 en rango me da error. Tu condicion no detecta eso pues lo que busca es la suma del rango.

mil gracias de todas formas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

RE:Division por cero en calculo con rangos

Publicado por JuanC (565 intervenciones) el 24/11/2010 18:12:52
OK
prueba con algo así entonces...

Function MyDiv(rng1 As Range, rng2 As Range) As Double
Dim cell As Range
For Each cell In rng2
If cell.Value = 0 Then
GoTo fin:
End If
Next
MyDiv = Evaluate("Average(" & rng1.Address & "/" & rng2.Address & ")")
fin:
End Function

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Division por cero en calculo con rangos

Publicado por Quinto (30 intervenciones) el 24/11/2010 18:28:03
JuanC,


Mil gracias por tus respuestas,


debo aclarar que necesito resalizar el calculo para todos los numeros distintos de cero.


en el ultimo caso que me sugieres haces una revision uno a uno de los valores, si alguno es cero va al fin.


en mi caso si tengo 20 valores y uno es cero entonces calcularia con 19, si hay 2 con 18.


en la funcion que propones haces la revision 1 a 1, en ese caso iria haciendo las operaciones acumulandolas y al final calcularia el promedio.


la idea mia era ya que trabajo con rangos seguir las operaciones con rango.


pudiera entonces buscar si hay ceros en el rango, si no calculo con mi funcion original, si los hay entonces los hago a mano. que crees?


saludos y mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

RE:Division por cero en calculo con rangos

Publicado por JuanC (565 intervenciones) el 24/11/2010 18:45:39
otra variante... crea dos rangos nuevos quitando los ceros...

Function MyDiv(rng1 As Range, rng2 As Range) As Double
Dim cell As Range
Dim r1 As Range, r2 As Range
Set r2 = Nothing
MyDiv = 0#

For Each cell In rng2
If cell.Value <> 0 Then
If r2 Is Nothing Then
Set r2 = cell.Value
Set r1 = cell.Offset(0, -1) '//Supongo que rng1 está a la izquierda
Else '//del rng2 (y son iguales, obvio)
Set r2 = Union(r2, cell)
Set r1 = Union(r1, cell.Offset(0, -1))
End If
End If
End If
Next
If Not r2 Is Nothing Then
MyDiv = Evaluate("Average(" & r1.Address & "/" & r2.Address & ")")
End If
fin:
End Function

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar