none
Como puedo reducir estos if RRS feed

  • 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

    viernes, 23 de marzo de 2018 9:59

Respuestas

  • Puedes prescindir de las dos comprobaciones del tipo 

     If (density1.ToString.IndexOf(".") <> -1) Then
         density1 = density1.ToString.Replace(".", "")
    End If

    y 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 If

    las puedes cambiar por

    If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
       density1 = density1 - 1000
       Comp1 = 4
    End If

    Y 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 If


    Saludos, 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
    viernes, 23 de marzo de 2018 11:32
  • 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 Sub


    Saludos, Javier J

    • Marcado como respuesta Diablo_Rojo lunes, 2 de abril de 2018 6:43
    martes, 27 de marzo de 2018 7:26

Todas las respuestas

  • Puedes prescindir de las dos comprobaciones del tipo 

     If (density1.ToString.IndexOf(".") <> -1) Then
         density1 = density1.ToString.Replace(".", "")
    End If

    y 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 If

    las puedes cambiar por

    If Not (Text_Evapo1.Text.Contains(".") Or Text_Evapo1.TextLength < 4) Then
       density1 = density1 - 1000
       Comp1 = 4
    End If

    Y 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 If


    Saludos, 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
    viernes, 23 de marzo de 2018 11:32
  • gracias javier es que no se como se hacia la ultima combinacion

    ya esta memorizado para otras ocasiones

    1000 gracias

    viernes, 23 de marzo de 2018 15:50
  • 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 

    viernes, 23 de marzo de 2018 16:10
  • Perdón, olvidé cambiar la condición Or por And. Quedaría así:

    If Not (Text_Evapo1.Text.Contains(".") And Text_Evapo1.TextLength < 4) Then
       density1 = density1 - 1000
       Comp1 = 4
    End If


    Saludos, Javier J

    lunes, 26 de marzo de 2018 6:14
  • 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


    martes, 27 de marzo de 2018 6:38
  • 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 Sub


    Saludos, Javier J

    • Marcado como respuesta Diablo_Rojo lunes, 2 de abril de 2018 6:43
    martes, 27 de marzo de 2018 7:26