Principales respuestas
Como puedo reducir estos if

Pregunta
-
Buenas tengo estos if que funciona perfectamente pero veo que es muy engorroso
Alguien podria ayudarme si es que se puede simplificar a reducir el codigo
Gracias
Sub Evaporacion() Dim density1 As Decimal Dim density2 As Decimal Dim Tiempo_Hervido As Decimal Dim Volume_Inicial As Decimal Dim Volumen_Final As Decimal Dim Volumen_Perdido As Decimal Dim Minutos_Perdidos As Decimal Dim Perdida_Evaporacion As Decimal Dim Comp1 As Decimal Dim Comp2 As Decimal If Not Decimal.TryParse(Text_Evapo1.Text, density1) Or Not Decimal.TryParse(Text_Evapo2.Text, Volume_Inicial) Or Not Decimal.TryParse(Text_Evapo3.Text, Tiempo_Hervido) Or Not Decimal.TryParse(Text_Evapo4.Text, density2) Then Exit Sub Else If Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength = 5 Then If (density1.ToString.IndexOf(".") <> -1) Then density1 = density1.ToString.Replace(".", "") End If density1 = density1 - 1000 Comp1 = 5 Else If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then Else density1 = density1 - 1000 Comp1 = 4 End If End If If Text_Evapo4.Text.Contains(".") And Text_Evapo4.TextLength = 5 Then If (density2.ToString.IndexOf(".") <> -1) Then density2 = density2.ToString.Replace(".", "") End If density2 = density2 - 1000 Comp2 = 5 Else If Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4 Then Else density2 = density2 - 1000 Comp2 = 4 End If End If Volumen_Final = (density1 * Volume_Inicial) / density2 Volumen_Perdido = (Volume_Inicial - Volumen_Final) Minutos_Perdidos = (Volumen_Perdido / Tiempo_Hervido) Perdida_Evaporacion = (Minutos_Perdidos * 60) If Comp1 = 5 And Comp2 = 5 Then Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h" Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L" End If If Comp1 = 4 And Comp2 = 4 Then Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h" Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L" End If If Comp1 = 4 And Comp2 = 5 Then Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h" Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L" End If If Comp1 = 5 And Comp2 = 4 Then Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h" Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L" End If End If End Sub
Respuestas
-
Puedes prescindir de las dos comprobaciones del tipo
If (density1.ToString.IndexOf(".") <> -1) Then
density1 = density1.ToString.Replace(".", "")
End Ify dejar simplemente density1 = density1.ToString.Replace(".", "") porque si la cadena no contiene el carácter "." lo único que va a pasar es que la cadena se quedará igual.
Las condiciones del tipo
If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then
Else
density1 = density1 - 1000
Comp1 = 4
End Iflas puedes cambiar por
If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
density1 = density1 - 1000
Comp1 = 4
End IfY en los Ifs finales veo que repites código. Lo puedes dejar así:
If (Comp1 = 5 And Comp2 = 5) Or (Comp1 = 5 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 4) or (Comp1 = 4 And Comp2 = 5) Then
Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L"
End IfSaludos, Javier J
- Marcado como respuesta Diablo_Rojo viernes, 23 de marzo de 2018 15:51
- Desmarcado como respuesta Diablo_Rojo viernes, 23 de marzo de 2018 16:06
- Marcado como respuesta Diablo_Rojo domingo, 25 de marzo de 2018 8:42
-
Creo que lo que quieres es esto:
Sub Evaporacion()
Dim density1 As Decimal
Dim density2 As Decimal
Dim Tiempo_Hervido As Decimal
Dim Volume_Inicial As Decimal
Dim Volumen_Final As Decimal
Dim Volumen_Perdido As Decimal
Dim Minutos_Perdidos As Decimal
Dim Perdida_Evaporacion As Decimal
Dim Comp1 As Decimal
Dim Comp2 As Decimal
If Not Decimal.TryParse(Text_Evapo1.Text, density1) Or Not Decimal.TryParse(Text_Evapo2.Text, Volume_Inicial) Or Not Decimal.TryParse(Text_Evapo3.Text, Tiempo_Hervido) Or Not Decimal.TryParse(Text_Evapo4.Text, density2) Then
Exit Sub
ElseIf Text_Evapo1.Text = 0 Or Text_Evapo2.Text = 0 Or Text_Evapo3.Text = 0 Or Text_Evapo4.Text = 0 Then
Lb_Evapo1.Text = Math.Round(0, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(0, 2) & " L"
Else
If Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength = 5 Then
density1 = density1.ToString.Replace(".", "")
density1 = density1 - 1000
Comp1 = 5
Else
'If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then
'Else
If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
density1 = density1 - 1000
Comp1 = 4
End If
End If
If Text_Evapo4.Text.Contains(".") And Text_Evapo4.TextLength = 5 Then
density2 = density2.ToString.Replace(".", "")
density2 = density2 - 1000
Comp2 = 5
Else
'If Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4 Then
'Else
If Not (Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4) Then
density2 = density2 - 1000
Comp2 = 4
End If
End If
Volumen_Final = (density1 * Volume_Inicial) / density2
Volumen_Perdido = (Volume_Inicial - Volumen_Final)
Minutos_Perdidos = (Volumen_Perdido / Tiempo_Hervido)
Perdida_Evaporacion = (Minutos_Perdidos * 60)
If (Comp1 = 5 And Comp2 = 5) Or (Comp1 = 5 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 5) Then
Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L"
End If
End If
End SubSaludos, Javier J
- Marcado como respuesta Diablo_Rojo lunes, 2 de abril de 2018 6:43
Todas las respuestas
-
Puedes prescindir de las dos comprobaciones del tipo
If (density1.ToString.IndexOf(".") <> -1) Then
density1 = density1.ToString.Replace(".", "")
End Ify dejar simplemente density1 = density1.ToString.Replace(".", "") porque si la cadena no contiene el carácter "." lo único que va a pasar es que la cadena se quedará igual.
Las condiciones del tipo
If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then
Else
density1 = density1 - 1000
Comp1 = 4
End Iflas puedes cambiar por
If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
density1 = density1 - 1000
Comp1 = 4
End IfY en los Ifs finales veo que repites código. Lo puedes dejar así:
If (Comp1 = 5 And Comp2 = 5) Or (Comp1 = 5 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 4) or (Comp1 = 4 And Comp2 = 5) Then
Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L"
End IfSaludos, Javier J
- Marcado como respuesta Diablo_Rojo viernes, 23 de marzo de 2018 15:51
- Desmarcado como respuesta Diablo_Rojo viernes, 23 de marzo de 2018 16:06
- Marcado como respuesta Diablo_Rojo domingo, 25 de marzo de 2018 8:42
-
-
Si pongo el If Not y quito el else
cuando empiezo a escribir en el textbox1 o textbox2 y llevo escrito por ejemplo 1.06 ya empieza a cambiar el resultado
y lo que busco que que no cambien el resultado hasta que no este el textbox donde escribo así 1040 o 1.040
Un saludo
-
-
Gracias por responder Javier
Sigue sin funcionar te pongo el codigo
Es por la combinacion en conjunto si text_evapo1 ya tiene datos y en text_evapo4 introducimos por ejemplo 1 ya empieza a darme el resultado en los label que es lo que no quiero hasta que los 2 textbox indicados este en con uno de estos 2 formatos digitales 1040 o 1.040
Gracias y un saludo
Sub Evaporacion() Dim density1 As Decimal Dim density2 As Decimal Dim Tiempo_Hervido As Decimal Dim Volume_Inicial As Decimal Dim Volumen_Final As Decimal Dim Volumen_Perdido As Decimal Dim Minutos_Perdidos As Decimal Dim Perdida_Evaporacion As Decimal Dim Comp1 As Decimal Dim Comp2 As Decimal If Not Decimal.TryParse(Text_Evapo1.Text, density1) Or Not Decimal.TryParse(Text_Evapo2.Text, Volume_Inicial) Or Not Decimal.TryParse(Text_Evapo3.Text, Tiempo_Hervido) Or Not Decimal.TryParse(Text_Evapo4.Text, density2) Then Exit Sub ElseIf Text_Evapo1.Text = 0 Or Text_Evapo2.Text = 0 Or Text_Evapo3.Text = 0 Or Text_Evapo4.Text = 0 Then Lb_Evapo1.Text = Math.Round(0, 2) & " L/h" Lb_Evapo2.Text = Math.Round(0, 2) & " L" Else If Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength = 5 Then density1 = density1.ToString.Replace(".", "") density1 = density1 - 1000 Comp1 = 5 Else 'If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then 'Else If Not (Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength < 4) Then density1 = density1 - 1000 Comp1 = 4 End If End If If Text_Evapo4.Text.Contains(".") And Text_Evapo4.TextLength = 5 Then density2 = density2.ToString.Replace(".", "") density2 = density2 - 1000 Comp2 = 5 Else 'If Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4 Then 'Else If Not (Text_Evapo4.Text.Contains(".") And Text_Evapo4.TextLength < 4) Then density2 = density2 - 1000 Comp2 = 4 End If End If Volumen_Final = (density1 * Volume_Inicial) / density2 Volumen_Perdido = (Volume_Inicial - Volumen_Final) Minutos_Perdidos = (Volumen_Perdido / Tiempo_Hervido) Perdida_Evaporacion = (Minutos_Perdidos * 60) If (Comp1 = 5 And Comp2 = 5) Or (Comp1 = 5 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 5) Then Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h" Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L" End If End If End Sub
- Editado Diablo_Rojo martes, 27 de marzo de 2018 6:45
-
Creo que lo que quieres es esto:
Sub Evaporacion()
Dim density1 As Decimal
Dim density2 As Decimal
Dim Tiempo_Hervido As Decimal
Dim Volume_Inicial As Decimal
Dim Volumen_Final As Decimal
Dim Volumen_Perdido As Decimal
Dim Minutos_Perdidos As Decimal
Dim Perdida_Evaporacion As Decimal
Dim Comp1 As Decimal
Dim Comp2 As Decimal
If Not Decimal.TryParse(Text_Evapo1.Text, density1) Or Not Decimal.TryParse(Text_Evapo2.Text, Volume_Inicial) Or Not Decimal.TryParse(Text_Evapo3.Text, Tiempo_Hervido) Or Not Decimal.TryParse(Text_Evapo4.Text, density2) Then
Exit Sub
ElseIf Text_Evapo1.Text = 0 Or Text_Evapo2.Text = 0 Or Text_Evapo3.Text = 0 Or Text_Evapo4.Text = 0 Then
Lb_Evapo1.Text = Math.Round(0, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(0, 2) & " L"
Else
If Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength = 5 Then
density1 = density1.ToString.Replace(".", "")
density1 = density1 - 1000
Comp1 = 5
Else
'If Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4 Then
'Else
If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
density1 = density1 - 1000
Comp1 = 4
End If
End If
If Text_Evapo4.Text.Contains(".") And Text_Evapo4.TextLength = 5 Then
density2 = density2.ToString.Replace(".", "")
density2 = density2 - 1000
Comp2 = 5
Else
'If Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4 Then
'Else
If Not (Text_Evapo4.Text.Contains(".") Or Text_Evapo4.TextLength < 4) Then
density2 = density2 - 1000
Comp2 = 4
End If
End If
Volumen_Final = (density1 * Volume_Inicial) / density2
Volumen_Perdido = (Volume_Inicial - Volumen_Final)
Minutos_Perdidos = (Volumen_Perdido / Tiempo_Hervido)
Perdida_Evaporacion = (Minutos_Perdidos * 60)
If (Comp1 = 5 And Comp2 = 5) Or (Comp1 = 5 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 4) Or (Comp1 = 4 And Comp2 = 5) Then
Lb_Evapo1.Text = Math.Round(Perdida_Evaporacion, 2) & " L/h"
Lb_Evapo2.Text = Math.Round(Volumen_Final, 2) & " L"
End If
End If
End SubSaludos, Javier J
- Marcado como respuesta Diablo_Rojo lunes, 2 de abril de 2018 6:43