Visual Basic para Aplicaciones - Formulario Modificar VBA

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de Gastón
Val: 13
Ha aumentado su posición en 4 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Gastón (1 intervención) el 07/01/2019 21:44:12
Buenas Tardes. Soy nuevo en el tema y bastante aficionado. Les cuento un poco mi inquietud. Estoy armando una planilla de Excel para un Inventario comercial, donde he creado Formulario para Alta, Baja, Búsqueda y Modificación de registros, pero hace 2 semanas que estoy estancado en el Formulario que he creado para Modificar los registros. En mi Hoja2 (Inventario) es donde se registran los datos, Alta, Baja y Búsqueda, no tengo problemas pero en el de Modificar solo me permite realizar esta acción en las primeras 5 columnas de la Hoja, pero tengo 18 columnas que quisiera editarlas con el formulario. Necesitaría me ayuden a encontrar el error. Adjunto el código VBA que estoy utilizando y una imagen del formato de la hoja. Cualquier dato que necesiten adicional, no hay problema de darlo. Todavia no me permite agregar archivos para adjuntar la Hoja de cálculo.
Saludos Cordiales...


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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Private Sub box_Código_Change()
 
    Dim Fila As Integer
    Dim Final As Integer
    Dim Inventario As Sheets
 
If box_Código.Value = "" Then 'Limpiar campos
    Me.txt_Artículo.Text = ""
    Me.box_Código = ""
    Me.txt_Descripción.Text = ""
    Me.txt_Marca.Text = ""
    Me.box_Rubro = ""
    Me.txt_Valor_de_lista.Text = ""
    Me.box_Promo = ""
    Me.box_Tipo = ""
    Me.box_Estado = ""
    Me.txt_Valor_Compra.Text = ""
    Me.txt_Imágen.Text = ""
    Me.txt_Fecha_Alta.Text = ""
End If
 
    For Fila = 2 To 2001
        If Hoja2.Cells(Fila, 1) = "" Then
            Final = Final - 1
        Exit For
        End If
    Next
 
    For Fila = 2 To 2001
    If box_Código = Hoja2.Cells(Fila, 2) Then
        Me.txt_Artículo = Hoja2.Cells(Fila, 1)
        Me.txt_Descripción = Hoja2.Cells(Fila, 3)
        Me.txt_Marca = Hoja2.Cells(Fila, 4)
        Me.txt_Valor_de_lista = Hoja2.Cells(Fila, 6)
        Me.txt_Valor_Compra = Hoja2.Cells(Fila, 18)
        Me.txt_Imágen = Hoja2.Cells(Fila, 10)
        Me.txt_Fecha_Alta = Hoja2.Cells(Fila, 12)
        Me.box_Rubro = Hoja2.Cells(Fila, 5)
        Me.box_Tipo = Hoja2.Cells(Fila, 8)
        Me.box_Estado = Hoja2.Cells(Fila, 9)
        Me.box_Promo = Hoja2.Cells(Fila, 17)
        Exit For
    End If
    Next
 
End Sub
 
Private Sub btn_Modificar_Click()
 
    Dim Fila As Integer
    Dim Final As Integer
    Dim Inventario As Sheets
 
    For Fila = 2 To 2001
        If Hoja2.Cells(Fila, 1) = "" Then
            Final = Final - 1
        Exit For
        End If
    Next
 
    For Fila = 2 To 2001
    If Me.box_Código = Hoja2.Cells(Fila, 2) Then
        Hoja2.Cells(Fila, 1) = Me.txt_Artículo.Value
        Hoja2.Cells(Fila, 3) = Me.txt_Descripción.Value
        Hoja2.Cells(Fila, 4) = Me.txt_Marca.Value
        Hoja2.Cells(Fila, 5) = Me.box_Rubro.Value
        Hoja2.Cells(Fila, 6) = Me.txt_Valor_de_lista.Value
        Hoja2.Cells(Fila, 8) = Me.box_Tipo.Value
        Hoja2.Cells(Fila, 9) = Me.box_Estado.Value
        Hoja2.Cells(Fila, 10) = Me.txt_Imágen.Value
        Hoja2.Cells(Fila, 12) = Me.txt_Fecha_Alta.Value
        Hoja2.Cells(Fila, 17) = Me.box_Promo.Value
        Hoja2.Cells(Fila, 18) = Me.txt_Valor_Compra.Value
 
    End If
    Next
 
 
End Sub
 
'Solo permite ingresar Numeros
Private Sub txt_Valor_de_lista_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
        KeyAscii = 0
    End If
 
 
End Sub
 
'Solo permite ingresar Numeros
Private Sub txt_Valor_Compra_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
        KeyAscii = 0
    End If
 
End Sub
Private Sub btn_Salir_Click()
Unload Me
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.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Antoni Masana (498 intervenciones) el 08/01/2019 10:37:13
¿Y cual es el error?

Dices que quieres editar las 18 columnas o dicho de otra forma los 18 campos del registro pero no especificas el error.

Te comento el primer procedimiento del código y si eso seguimos hablando.

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
Private Sub box_Código_Change()
    Dim Fila As Integer
    Dim Final As Integer
    Dim Inventario As Sheets
 
     ' -- NOTA: Si el Box_Codigo esta vacio limpias los campos y despues ¿que?
     '          ¿Que sentido tiene buscar si existe el codigo si esta vació?
 
    If box_Código.Value = "" Then 'Limpiar campos
        Me.txt_Artículo.Text = ""
        Me.box_Código = ""
        Me.txt_Descripción.Text = ""
        Me.txt_Marca.Text = ""
        Me.box_Rubro = ""
        Me.txt_Valor_de_lista.Text = ""
        Me.box_Promo = ""
        Me.box_Tipo = ""
        Me.box_Estado = ""
        Me.txt_Valor_Compra.Text = ""
        Me.txt_Imágen.Text = ""
        Me.txt_Fecha_Alta.Text = ""
        EXIT SUB     <------- Añade esto
    End If
 
    ' --- NOTA: ¿Solo vas a tener un maximo de 2000 líneas?
    '           Y ¿que finalidad tiene este contador?
 
    For Fila = 2 To 2001
        If Hoja2.Cells(Fila, 1) = "" Then
            Final = Final - 1
            Exit For
        End If
    Next
 
    ' -- NOTA: ¿Solo vas a tener un maximo de 2000 líneas?
               Y los campos de las columnas J, K, M, N, O, P
               ¿Por que no las asignas a un elemento del formulario?
 
    For Fila = 2 To 2001
        If box_Código             = Hoja2.Cells(Fila, 2) Then
            Me.txt_Artículo       = Hoja2.Cells(Fila, 1)  ' A
            Me.txt_Descripción    = Hoja2.Cells(Fila, 3)  ' C
            Me.txt_Marca          = Hoja2.Cells(Fila, 4)  ' D
            Me.box_Rubro          = Hoja2.Cells(Fila, 5)  ' E
            Me.txt_Valor_de_lista = Hoja2.Cells(Fila, 6)  ' F
                                                          ' J
            Me.box_Tipo           = Hoja2.Cells(Fila, 8)  ' H
            Me.box_Estado         = Hoja2.Cells(Fila, 9)  ' I
            Me.txt_Imágen         = Hoja2.Cells(Fila, 10) ' J
                                                          ' K
            Me.txt_Fecha_Alta     = Hoja2.Cells(Fila, 12) ' L
                                                          ' M
                                                          ' N
                                                          ' O
                                                          ' P
            Me.box_Promo          = Hoja2.Cells(Fila, 17) ' Q
            Me.txt_Valor_Compra   = Hoja2.Cells(Fila, 18) ' R
            Exit For
        End If
    Next
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
1
Comentar
Imágen de perfil de Gastón
Val: 13
Ha aumentado su posición en 4 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Gastón (5 intervenciones) el 09/01/2019 20:37:33
Hola Antoni, quizás no fui claro en la consulta. De los 18 campos que tiene la hoja, solo se ven afectado los primeros 5 los restantes campos no se modifican. En mi formulario de Modificación ("Form-Modificar") hago la corrección y cuando ejecuto el Commandbutton "Modificar" solo se ejecuta en los primeros 5 campos. Y no logro identificar por que me bloquea la edición del resto de los datos.

Cuando el box_Codigo este vacío hace que el resto de los text box queden vacíos es para que mi autocompletado funcione a medida que completo el box_Código. En mi tabla solo tengo limitado a 2000 artículos ya que no voy a tener mas que ese ingreso, es por no existen mas que esa cantidad.
En las columnas que faltan (G, K, M, N,O,P) es por que tiene formulas y datos que no necesito editar..
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.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Antoni Masana (498 intervenciones) el 09/01/2019 21:21:23
Deberías subir el libro para poder ver que pasa el problema puede estar en muchos sitios y solo con el código no se ve.

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

Formulario Modificar VBA

Publicado por Antoni Masana (498 intervenciones) el 10/01/2019 08:43:14
Visual Basic para Aplicaciones - Formulario Modificar VBA
07/01/2019 21:44:12


Visto el problema.

Este es código modificado:

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Public SW_Codigo As Boolean
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  INICIO FORMULARIO
' </> --------------------------------------------------------------------- </>
 
Private Sub UserForm_Initialize()
    SW_Codigo = False
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  CODIGO
' </> --------------------------------------------------------------------- </>
 
Private Sub box_Código_Change()
    Dim Fila As Integer
 
    If SW_Codigo Then Exit Sub
 
    If box_Código.Value = "" Then 'Limpiar campos
        Me.txt_Artículo.Text = ""
        Me.box_Código = ""
        Me.txt_Descripción.Text = ""
        Me.txt_Marca.Text = ""
        Me.box_Rubro = ""
        Me.txt_Valor_de_lista.Text = ""
        Me.box_Promo = ""
        Me.box_Tipo = ""
        Me.box_Estado = ""
        Me.txt_Valor_Compra.Text = ""
        Me.txt_Imágen.Text = ""
        Me.txt_Fecha_Alta.Text = ""
    End If
 
    For Fila = 2 To 2001
        If box_Código = Hoja2.Cells(Fila, 2) Then
            With Hoja2
                txt_Artículo = .Cells(Fila, 1)
                txt_Descripción = .Cells(Fila, 3)
                txt_Marca = .Cells(Fila, 4)
                txt_Valor_de_lista = .Cells(Fila, 6)
                txt_Valor_Compra = .Cells(Fila, 18)
                txt_Imágen = .Cells(Fila, 10)
                txt_Fecha_Alta = .Cells(Fila, 12)
                box_Rubro = .Cells(Fila, 5)
                box_Tipo = .Cells(Fila, 8)
                box_Estado = .Cells(Fila, 9)
                box_Promo = .Cells(Fila, 17)
            End With
            Exit For
        End If
    Next
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  COMBOBOX no editables
' </> --------------------------------------------------------------------- </>
 
Private Sub Box_Rubro_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 0
End Sub
 
Private Sub Box_Promo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 0
End Sub
Private Sub Box_Tipo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 0
End Sub
 
Private Sub Box_Estado_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 0
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  Solo permite ingresar Numeros
' </> --------------------------------------------------------------------- </>
 
Private Sub txt_Valor_de_lista_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
        KeyAscii = 0
    End If
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  Solo permite ingresar Numeros
' </> --------------------------------------------------------------------- </>
 
Private Sub txt_Valor_Compra_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
        KeyAscii = 0
    End If
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  BOTON MODIFICAR
' </> --------------------------------------------------------------------- </>
 
Private Sub btn_Modificar_Click()
    Dim Fila As Integer
 
    For Fila = 2 To 2001
        If Me.box_Código = Hoja2.Cells(Fila, 2) Then
            SW_Codigo = True
            With Hoja2
                .Cells(Fila, 1) = txt_Artículo.Text
                .Cells(Fila, 3) = txt_Descripción.Text
                .Cells(Fila, 4) = txt_Marca.Text
                .Cells(Fila, 5) = box_Rubro.Text   ' --- El problema está aquí Ver Nota 1
                .Cells(Fila, 6) = txt_Valor_de_lista.Text
                .Cells(Fila, 8) = box_Tipo.Text
                .Cells(Fila, 10) = txt_Imágen.Text
                .Cells(Fila, 12) = txt_Fecha_Alta.Text
                .Cells(Fila, 9) = box_Estado.Text
                .Cells(Fila, 17) = box_Promo.Text
                .Cells(Fila, 18) = txt_Valor_Compra.Text
            End With
            SW_Codigo = False
        End If
        If Len(Me.box_Código) = 0 Then Exit For
    Next
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  BOTON SALIR
' </> --------------------------------------------------------------------- </>
 
Private Sub btn_Salir_Click()
    Unload Me
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  FIN
' </> --------------------------------------------------------------------- </> 

NOTA 1: Te cuento que es lo que pasa y como lo he descubierto y lo he solucionado, que todo ayuda.

QUE PASA
Cuando llega a esta línea ejecuta el evento Private Sub box_Código_Change lo que provoca que limpie las variables y las recargue con lo que se pierde los cambios

COMO LO SOLUCIONO
Con una variable publica lógica para que cuando entre en el evento del código salga sin ejecutarlo.
Añado una variable publica (SW_CODIGO) y la pongo a false al abrir el formulario.
Además veo que la objeto box_codigo pierde su valor y fuerzo salir del FOR después de guardar los datos.

COMO LO DESCUBRO
Siguiendo paso a paso las instrucciones del evento btn_modificar esto se consigue marcado la primera línea donde deseo que se pare con la tecla F9

Veras que he comentado unas líneas que a menos que se demuestre lo contrario no tienen ninguna utilidad.

Y AUN HAY MÁS
Y cuando creía que ya estaba solucionado descubro otro problema o parte del mismo.
No sé qué carajo has hecho pero resulta que al modificar las celdas de la columna E se desencadena una serie de eventos que hacen que:
- Se ejecute: Private Sub box_Código_Change
- El objeto: box_codigo pierda su valor.
- La celda de la columna B pierde su valor.
-
Pero esto solo pasa si el contenido de box_rublo no es el correcto
He añadiro la opción de que los combos no se pudiesen editar. Solo acepta las opciones de las listas.

Creo que con esto puede estar solucionado el problema.


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
Imágen de perfil de Gastón
Val: 13
Ha aumentado su posición en 4 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Gastón (5 intervenciones) el 10/01/2019 14:32:17
Muchicimas gracias Antoni por el tiempo que le has dedicado. Recien entro y en un rato arranco con la planilla.

Respuesta
Y AUN HAY MÁS
Y cuando creía que ya estaba solucionado descubro otro problema o parte del mismo.
No sé qué carajo has hecho pero resulta que al modificar las celdas de la columna E se desencadena una serie de eventos que hacen que:
- Se ejecute: Private Sub box_Código_Change
- El objeto: box_codigo pierda su valor.
- La celda de la columna B pierde su valor.

Te comento como funciona: el Formulario modificar, la idea es que se ingresen los datos mediante box_Código, ya que es el ID del articulo, osea es único y dependerá del Rubro al que pertenezca, como veras empieza con una letra, que indica el RUBRO al que pertenece, seguido por una numeración que es correlativa a medida se ingresan los productos, cuando al articulo se lo ingresa en un RUBRO, automaticamente se le asigna el codigo. Por "X" causa se lo cambia de Rubro, nuevamente se le asigna un nuevo código y correlativo al nuevo RUBRO, eso es lo que pasa cuando a la celda de la columna E la modificas.
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 Gastón
Val: 13
Ha aumentado su posición en 4 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Formulario Modificar VBA

Publicado por Gastón (5 intervenciones) el 10/01/2019 17:23:16
Gracias Antoni, hasta ahora va sobre rieles. Lo único es que tuve que eliminar los No Editables ya que necesitaba que esos también se editen, y corrió genial, Cuando Termine el libro, lo subo para que tomen conocimiento de como preparé el Libro con una breve descripción de como funciona y que es lo que hace.
Saludos Cordiales...
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