Visual Basic - El Case con datos variables

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

El Case con datos variables

Publicado por Miguel Campusano (16 intervenciones) el 19/11/2016 19:35:42
En este codigo el unico dato que dependera de la entrada humana es la n, pero los demas datos son variables, pero no me entra a las condiciones cuando n=z o cuando n=f

muchas gracia spor su ayuda



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Private Sub CommandButton3_Click()
    Dim i, n, z, f, P, HH, EE, MM As Integer
    Dim r1, r2 As String
 
    Dim b As Boolean
 
 
 
    f = 5
    HH = 0
    EE = 0
    MM = 0
    If Cells(3, "A") <> "COD." Or Cells(4, "A") <> "Recursos Humanos" Then
        MsgBox ("NO ESTAS EN UN ANALISIS DE COSTO")
        GoTo d
    End If
    While Cells(f, "A") <> "Recursos Equipos" 'Averiguar # de Recursos Equipos en Analisis de Costos
        f = f + 1
        HH = HH + 1
    Wend
    f = HH + 5 + 1
    While Cells(f, "A") <> "Recursos Materiales" 'Averiguar # de Recursos Humanos en Analisis de Costos
        f = f + 1
        EE = EE + 1
    Wend
    f = 5 + EE + 1 + HH
    While Cells(f, "g") <> "ITBIS RREE & RRMM=>" 'Averiguar # de Recursos Materiales en Analisis de Costos
        f = f + 1
        MM = MM + 1
    Wend
    n = InputBox("Escoja la linea del Recurso a Eliminar ", "ELIMINACION DE RECURSO")
    MM = MM - 1
    z = (5 + HH)
    f = (5 + EE + HH + 1)
    i = (5 + HH + EE + MM + 1)
    P = i + 3
    MsgBox ("Z =" & z)
    MsgBox ("F =" & f)
    MsgBox ("I =" & i)
    MsgBox ("P =" & P)
    MsgBox ("n =" & n)
    Select Case n
        Case 0 To 4
            MsgBox ("LINEAS DE ENCABEZADO, NO PUEDEN SER ELIMINADA")
            Unload UserForm1
        Case z:   'al z y al f no me entra la sentencia cuando n es igual a z o a f no cumple sus condiciones
            MsgBox ("ETIQUETA RECURSO EQUIPO, NO PUEDEN SER ELIMINADA")
            Unload UserForm1
        Case f:
            MsgBox ("ETIQUETA RECURSO MATERIALES, NO PUEDEN SER ELIMINADA")
            Unload UserForm1
        Case i To P
            MsgBox ("RESULTADOS DE ANALISIS DE COSTOS, NO PUEDEN SER ELIMINADA")
            Unload UserForm1
        Case Else
            Rows(n & ":" & n).Select
            Selection.Delete Shift:=xlUp
        End Select
d:
End Sub
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 Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

El Case con datos variables

Publicado por Antoni Masana (558 intervenciones) el 21/11/2016 10:45:56
En primer lugar no me gusta el uso de la instrucción GOTO es una herencia del BASIC más básico y es mejor no utilizarla.

No veo ninguna incoherencia en el programa que pueda generar este fallo.

Te modifico el MsgBox para ver todas las variables de una sola vez. Y además te añado una verificación.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Private Sub CommandButton3_Click()
    Dim i, n, z, f, P, HH, EE, MM As Integer
    Dim r1, r2 As String
    Dim b As Boolean
 
    f = 5
    HH = 0
    EE = 0
    MM = 0
 
    If Cells(3, "A") <> "COD." Or Cells(4, "A") <> "Recursos Humanos" Then
       MsgBox ("NO ESTAS EN UN ANALISIS DE COSTO")
    Else
       While Cells(f, "A") <> "Recursos Equipos" 'Averiguar # de Recursos Equipos en Analisis de Costos
           f = f + 1
           HH = HH + 1
       Wend
       f = HH + 5 + 1
 
       While Cells(f, "A") <> "Recursos Materiales" 'Averiguar # de Recursos Humanos en Analisis de Costos
           f = f + 1
           EE = EE + 1
       Wend
       f = 5 + EE + 1 + HH
 
       While Cells(f, "g") <> "ITBIS RREE & RRMM=>" 'Averiguar # de Recursos Materiales en Analisis de Costos
           f = f + 1
           MM = MM + 1
       Wend
 
       n = InputBox("Escoja la linea del Recurso a Eliminar ", "ELIMINACION DE RECURSO")
 
       MM = MM - 1
       z = (5 + HH)
       f = (5 + EE + HH + 1)
       i = (5 + HH + EE + MM + 1)
       P = i + 3
 
       MsgBox "Z =" & z & " - " & (n=z) & VbCrLf & _
              "F =" & f & " - " & (n=f) & VbCrLf & _
              "I =" & i & VbCrLf & _
              "P =" & P & VbCrLf & _
              "n =" & n
 
       Select Case n
           Case 0 To 4
               MsgBox ("LINEAS DE ENCABEZADO, NO PUEDEN SER ELIMINADA")
               Unload UserForm1
 
           Case z    'al z y al f no me entra la sentencia cuando n es igual a z o a f no cumple sus condiciones
               MsgBox ("ETIQUETA RECURSO EQUIPO, NO PUEDEN SER ELIMINADA")
               Unload UserForm1
 
           Case f
               MsgBox ("ETIQUETA RECURSO MATERIALES, NO PUEDEN SER ELIMINADA")
               Unload UserForm1
 
           Case i To P
               MsgBox ("RESULTADOS DE ANALISIS DE COSTOS, NO PUEDEN SER ELIMINADA")
               Unload UserForm1
 
           Case Else
               Rows(n & ":" & n).Select
               Selection.Delete Shift:=xlUp
       End Select
    End If
End Sub

El MsgBox te ha de dar algo asi. Los valores numéricos son ficticios.

1
2
3
4
5
Z = 25 - Falso
F = 15 - Verdadero
I = 30
P = 40
n = 15

Cuando N sea igual al valor de Z o F debe salir la palabra Verdadero o Falso cuando sean diferentes.

Pueden Salir dos False o un False y un Verdadero, pero solo pueden salir dos Verdaderos si y solo si Z, F y N son iguales


He realizado unas pruebas y funciona en todos los casos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Command1_Click()
    m = 5
    p = 6
 
    For n = 2 To 6
        Print n
        Select Case n
           Case 2 To 3: MsgBox ("A " & n)
           Case 4: MsgBox ("B " & n)
           Case Is = m: MsgBox ("C " & n & " - " & m & "   " & (n = m))
           Case p:
            MsgBox ("D " & n)
        End Select
    Next
    End
End Sub

Si sigues teniendo problemas sube el libro y le damos un vistazo.
Si prefieres no subirlo para que lo vea todo el mundo puedes enviarlo a mi correo.

Desde luego es un problema raro porque las variables son Integer y las que suelen dar este tipo de problemas son las de coma flotante tipo Single, Double y a veces las long.

Revisando los tipos de variables y como te estas moviendo por un libro de Excel y en las ultimas versiones tiene más de 1 millón de filas usar una variable integer puede no ser lo más aconsejable, seria mejor definirlas como LONG, más que nada porque con una Integer solo puedes analizar un máximo de 32.767 filas y con una Long hasta 2.147.483.647 que son muchas más de las que tiene una hoja. A menos que estés super seguro que tus datos no van a superar el limite de las 32.767 filas.

Saludos.
\\//_
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

El Case con datos variables

Publicado por Miguel Campusano (16 intervenciones) el 21/11/2016 14:58:28
Un millón de gracias, el Sr MacroVBA ya me había dicho el error, se lo comparto para que por si acaso les pasa, resulta que las variables enteras que hay al inicio del programa no pueden ser declaradas así:

Dim i, n, z, f, P, HH, EE, MM As Integer

deben ser declaradas asi:

Dim i As Integer
Dim n As Integer
Dim z As Integer
Dim f as Integer
etc..
al hacerlo así dio resultado inmediatamente
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 Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

El Case con datos variables

Publicado por Antoni Masana (558 intervenciones) el 22/11/2016 08:27:26
Se me paso y no me di cuenta

Así también es correcto

Dim i As Integer, n As Integer, z As Integer, f as Integer, etc..

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

El Case con datos variables

Publicado por Miguel Campusano (16 intervenciones) el 22/11/2016 14:27:44
muchas gracias


perfecto


son menos lineas
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