Visual Basic - ERROR CON IF

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 11
Ha disminuido su posición en 5 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antonio (4 intervenciones) el 30/01/2019 21:06:17
Buenas a todos,

Estoy haciendo un programa y bueno una de las cosas que quiero evitar es que me almacene valores repetidos. Tengo la siguiente tabla:

TABLA-EXCEL

Al introducir un nuevo Dato en la tabla, lo inserto dentro mediante el siguiente Userform.

USERFORM

He separado el resto del código de este usando el botón 4, de tal manera que quisiera que al insertar Largo = 297 y Ancho = 420 y clicar este botón, detecte que en las filas indicadas (Desde A34 a C34), ya está este tamaño. El código que he usado es el siguiente:

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
Private Sub CommandButton4_Click()
 
Dim Ancho, Largo, LargoC, AnchoC As Integer
 
'COMPROBACIÓN PARA SABER SI EL FORMATO DE PLIEGO YA EXISTE
 
    Sheets("PAPEL").Select
    Range("A1").Select
 
If CheckBox1.value = True Then
 
Largo = Me.TextBox2.value
Ancho = Me.TextBox4.value
 
LargoC = Sheets("PAPEL").Range("B34").value
AnchoC = Sheets("PAPEL").Range("C34").value
 
        If Largo = LargoC Then
                If Ancho = AnchoC Then
 
                MsgBox ("Este formato YA existe" & Largo & Ancho & LargoC & AnchoC)
 
                Else
 
                MsgBox "Los ANCHOS son distintos"
 
                End If
        Else
 
        MsgBox "Los LARGOS son distintos. El largo introducido es " & Largo & " y el largo guardado es " & LargoC
 
        End If
Else
 
MsgBox "CHECBOX1 no está activado"
 
End If
 
MsgBox ("Este formato NO existe" & Largo & Ancho & LargoC & AnchoC)
 
End Sub


Por lo que he aprendido, o he querido entender, debería funcionarme bien, pero no es así. He intentado cambiar cosas pero siempre llego al mismo punto. Por último, les dejo la ventana que muestra

EJECUCION

Por lo que se ve, al menos si valida la condición de que CheckBox1 sea falsa, pero los largos aun siendo iguales el condicional If lo considera falso.

Desconozco si el VBA de Excel tiene errores o si quizás esté teniendo algún fallo estúpido, pero agradecería cualquier ayuda, para entender el porque de su no funcionamiento porque realmente no lo entiendo.

Muchas gracias.

Saludos.
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.094
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antoni Masana (391 intervenciones) el 31/01/2019 11:45:09
Te he corregido el código:

Pero solo compara con el DIN-A3 he ignora los demás formatos. ¿Es correcto?

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
Private Sub CommandButton4_Click()
    Dim A1 as String, A2 as String, Ancho as Integer, AnchoC As Integer, _
        L1 as String, L2 as String, Largo As Integer, LargoC As Integer
 
    L1="Los LARGOS son distintos. El largo introducido es "
    A1="Los ANCHOS son distintos. El anco introducido es "
    L2=" y el largo guardado es "
    A2=" y el ancho guardado es "
 
    'COMPROBACIÓN PARA SABER SI EL FORMATO DE PLIEGO YA EXISTE
 
    With Sheets("PAPEL")
        If CheckBox1.value  Then
            Largo = val(TextBox2.value)
            Ancho = val(TextBox4.value)
 
            LargoC = val(.Range("B34").value)
            AnchoC = val(.Range("C34").value)
 
            If Largo = LargoC And Ancho = AnchoC Then
                MsgBox "Este formato YA existe."
            Else
                If Largo <> LargoC Then MsgBox L1 & Largo & L2 & LargoC
                If Ancho <> AnchoC Then MsgBox A1 & Ancho & A2 & AnchoC
            End If
        Else
            MsgBox "CHECBOX1 no está activado"
        End If
    End With
    MsgBox ("Este formato NO existe" & Largo & Ancho & LargoC & AnchoC)
End Sub


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
Val: 11
Ha disminuido su posición en 5 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antonio (4 intervenciones) el 31/01/2019 15:24:05
https://www.lawebdelprogramador.com/foros/Visual-Basic/1682689-ERROR-CON-IF.html

RESPUESTA.
Buenas Antoni,

Muchísimas gracias, la verdad nada más inserté el código funcionó a la perfección.

Primero, quería hacer que comprobara que ya existe con una sola celda forzándola para luego hacer el bucle con todas las filas de la tabla que te mostré. Ahora me pondré con ese bucle que espero no me dé demasiados problemas.

En cuanto a tu código, en esencia, es como el mío pero con funciones distintas, lo que me deja alguna duda, espero que no te importe que te pregunte:

1). Tengo entendido que cuantas menos variables definas en el “programa”, éste debería funcionar mejor. Utilizas para los MSGBOX diferentes constantes que has definido como String. Me supongo que al ser constante no hay ningún problema en cuanto a este tipo, además según acabo de leer :

String:Almacena cadenas de caracteres desde uno solo a unos dos mil millones aproximadamente. El espacio ocupado por este tipo de variable depende de la longitud de la cadena guardada.

Entonces, tampoco nos ocupa mucha memoria.

2) Utilizas el siguiente comando:
CheckBox1.Value en vez de Me.CheckBox1.Value = True
Aparentemente, realizan la misma función, y he comprobado que ambas funcionan. Pero tu opción es más corta.

Gracias nuevamente, y tan pronto como termine el código lo subo aquí.

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
Val: 11
Ha disminuido su posición en 5 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antonio (4 intervenciones) el 31/01/2019 15:47:59
Listo. Este es el bucle que he hecho y funciona perfectamente, he eliminado la mayoria de MSGBOX para que durante esta comprobación no aparezcan demasiadas ventanas.

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
Private Sub CommandButton4_Click()
 
    Dim A1 As String, A2 As String, Ancho As Integer, AnchoC As Integer, _
        L1 As String, L2 As String, Largo As Integer, LargoC As Integer, _
        fila As Integer, n_Formato_Pliego As Integer, i As Integer
 
    L1 = "Los LARGOS son distintos. El largo introducido es "
    A1 = "Los ANCHOS son distintos. El anco introducido es "
    L2 = " y el largo guardado es "
    A2 = " y el ancho guardado es "
 
    'COMPROBACIÓN PARA SABER SI EL FORMATO DE PLIEGO YA EXISTE
 
    Sheets("DATOS").Select
    Range("A1").Select
 
 n_Formato_Pliego = Sheets("PAPEL").Range("C32").value
 i = 0
 
    With Sheets("PAPEL")
 
    Do While i < n_Formato_Pliego
 
    i = i + 1
 
             If CheckBox1.value Then
 
                fila = i + 33
                Largo = Val(TextBox2.value)
                Ancho = Val(TextBox4.value)
 
                LargoC = Val(.Range("B" & fila).value)
                AnchoC = Val(.Range("C" & fila).value)
 
                     If Largo = LargoC And Ancho = AnchoC Then
 
                          Me.CheckBox1.value = False
                          MsgBox "Este formato YA existe."
                          i = n_Formato_Pliego
                     Else
                     'If Largo <> LargoC Then MsgBox L1 & Largo & L2 & LargoC
                     'If Ancho <> AnchoC Then MsgBox A1 & Ancho & A2 & AnchoC
                     End If
             Else
                'MsgBox "CHECBOX1 no está activado"
                i = n_Formato_Pliego
 
             End If
 
 
    Loop
 
    End With
 
End Sub

Desconozco si quizás tu emplearías alguna otra función. Cualquier recomendación es bienvenida. Mil gracias por todo, he aprendido mucho contigo.

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
Imágen de perfil de Antoni Masana
Val: 1.094
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antoni Masana (391 intervenciones) el 01/02/2019 07:24:29
Asi esta mejor la macro:

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
Private Sub CommandButton4_Click()
    Dim Ancho As Integer, AnchoC As Integer, Largo As Integer, LargoC As Integer, _
        fila As Integer, n_Formato_Pliego As Integer
    'COMPROBACIÓN PARA SABER SI EL FORMATO DE PLIEGO YA EXISTE
    Largo = Val(TextBox2.value)
    Ancho = Val(TextBox4.value)
 
    Sheets("DATOS").Select  ' -- Esta linea y la siguiente no creo que sean necesarias
    Range("A1").Select
 
    If CheckBox1.value Then
        With Sheets("PAPEL")
            n_Formato_Pliego = 33 + .Range("C32").value
            Fila = 33
            Do While Fila < n_Formato_Pliego
                Fila = Fila + 1
                   LargoC = Val(.Range("B" & fila).value)
                   AnchoC = Val(.Range("C" & fila).value)
 
                   If Largo = LargoC And Ancho = AnchoC Then
                       Me.CheckBox1.value = False
                       MsgBox "Este formato YA existe."
                       Fila = n_Formato_Pliego
                   End If
            Loop
        End With
    Else
        MsgBox "La casilla OTRO FORMATO no está activado."  ' El usuario no sabe que es un CheckBox
   End If
End Sub


La verificación del CheckBox se hace una vez al inicio y no por cada línea.
La toma de valores del los TextBox se hace una vez al inicio y no por cada línea. que tratas.
A mi me sobra la variable I
De la variable n_Formato_Pliego no estos seguro si es mas rápido consultar la variable a la celda directamente.

Aquí son 6 elementos pero si tengo que tratar 1.000.000 de lineas que tarde 300 micras mas o menos por linea me puede variar el tiempo de ejecución el en 5 minutos mas o menos.

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
Val: 11
Ha disminuido su posición en 5 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ERROR CON IF

Publicado por Antonio (4 intervenciones) el 01/02/2019 16:29:28
Buenas nuevamente,

Ok, me parece lógico todo lo que dices y estoy de acuerdo. Con 6 celdas no se nota, pero a medida que las filas aumenten se notará más. Muchas gracias por la ayuda y por tu tiempo, aplicaré esos cambios.

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