Visual Basic - guardar datos al final de la fila

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 27
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

guardar datos al final de la fila

Publicado por nestor fernando (12 intervenciones) el 03/05/2020 19:42:45
Buen dia amigos, les agradezco por el apoyo, estoy tratando de modificar la siguiente macro de vba para excel, en donde pretendo poner valores en la ultima celda de una fila, y seguir añadiendo celdas a la misma fila, pues quiero utilizarla para un servicio técnico en donde se reciben aparatos y mientras se van arreglando se van necesitando repuestos, hasta el momento con esta macro he podido buscar el registro y modificarlo, si no se encuentra el registro se crea uno nuevo, pero no he logrado que me añada mas celdas al final de cada registro para la necesidad que tengo, muchas gracias por la 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
61
62
63
64
65
66
67
68
69
70
71
72
Public ubica As String
Public control As Integer
Public ColumnaLibre As Integer
Public filalibre As Integer
 
Private Sub CommandButton1_Click()
 
'ColumnaLibre = Sheets("hoja1").Range((Cells(ubica, 1)), Range((Cells(ubica, 1)), Cells(ubica, 1)).End(xlToRight)).Select
 
    Sheets("Hoja1").Select
    If control > 0 Then
        'Actualizar Datos
        Range(ubica).Value = TextBox1
        Range(ubica).Offset(0, 1).Value = TextBox2
        Range(ubica).Offset(0, 2).Value = Val(TextBox3)
        Range(ubica).Offset(0, ColumnaLibre).Value = Me.TextBox4
        control = 0
    Else
        'Crear nuevos datos
        Cells(filalibre, 1).Value = TextBox1
        Cells(filalibre, 2).Value = TextBox2
        Cells(filalibre, 3).Value = Val(TextBox3)
        Cells(filalibre, ColumnaLibre).Value = TextBox4
 
    End If
 
    TextBox1 = Empty
    TextBox2 = Empty
    TextBox3 = Empty
    TextBox4 = Empty
    TextBox1.SetFocus
End Sub
 
Private Sub CommandButton2_Click()
   TextBox1 = Empty
    TextBox2 = Empty
    TextBox3 = Empty
    TextBox4 = Empty
    TextBox1.SetFocus
    Sheets("Formularios").Select
End Sub
 
Private Sub CommandButton3_Click()
Unload UserForm1
Sheets("Formularios").Select
End Sub
 
Private Sub TextBox1_AfterUpdate()
    Sheets("Hoja1").Select
    filalibre = Range("A2").End(xlDown).Offset(1, 0).Row
    ColumnaLibre = Range("a3:a1000000").End(xlToRight).Offset(1, 1).Column
 
 
    'la variable filalibre guarda el nro. de la primer celda vacía.
    control = 0
    dato = TextBox1
    rango = "A2:A" & filalibre
    Set midato = ActiveSheet.Range(rango).Find(dato, LookIn:=xlValues, LookAt:=xlWhole)
 
    If (midato) Is Nothing Then
       MsgBox "No se encontraron los datos, se procede a crear uno nuevo"
    Else
 
        ubica = midato.Address(False, False)
        TextBox2.Value = Range(ubica).Offset(0, 1).Value
        TextBox3.Value = Range(ubica).Offset(0, 2).Value
        control = 1
 
    End If
 
    Set midato = Nothing
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

guardar datos al final de la fila

Publicado por Antoni Masana (560 intervenciones) el 03/05/2020 23:34:29
No acabo de entender muy bien que haces.

Esto es una solución imaginativa porque no se que es el TextBox4 y si es el que tiene que desplazarse.

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 CommandButton1_Click()
 
'ColumnaLibre = Sheets("hoja1").Range((Cells(ubica, 1)), Range((Cells(ubica, 1)), Cells(ubica, 1)).End(xlToRight)).Select
 
    Sheets("Hoja1").Select
    If control > 0 Then
        'Actualizar Datos
        Range(ubica).Value = TextBox1
        Range(ubica).Offset(0, 1).Value = TextBox2
        Range(ubica).Offset(0, 2).Value = Val(TextBox3)
        ColumnaLibre = 3
        While Range(ubica).Offset(0, ColumnaLibre).Value <> ""
            ColumnaLibre = ColumnaLibre + 1
        Wend
        Range(ubica).Offset(0, ColumnaLibre).Value = Me.TextBox4
        control = 0
    Else
        'Crear nuevos datos
        Cells(filalibre, 1).Value = TextBox1
        Cells(filalibre, 2).Value = TextBox2
        Cells(filalibre, 3).Value = Val(TextBox3)
        Cells(filalibre, ColumnaLibre).Value = TextBox4
 
    End If
 
    TextBox1 = Empty
    TextBox2 = Empty
    TextBox3 = Empty
    TextBox4 = Empty
    TextBox1.SetFocus
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
2
Comentar
sin imagen de perfil
Val: 27
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

guardar datos al final de la fila

Publicado por nestor fernando (12 intervenciones) el 04/05/2020 00:16:42
Antoni, y eso que me dices que no entiendes muy bien lo que hago, y aun así me solucionaste el problema al pie de la letra, te agradezco de todo corazón pues llevaba 2 dias tratando de decifrar como solucionar este problema, te comento que quiero hacer una solución para servicio técnico, en donde se reciben celulares y mientras se van arreglando puede presentarse el evento que toque meterles repuestos, entonces de esta manera lo haria, poniendo cada nuevo repuesto en la ultima celda de la fila en donde he registrado el celular que se registró, te dí un punto pero si tuviera la posibilidad te daria mas, un saludo desde Colombia Arauquita
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: 27
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

guardar datos al final de la fila

Publicado por nestor fernando (12 intervenciones) el 04/05/2020 19:36:56
buenas tardes, me ha resultado muy útil su colaboración, ahora quisiera molestarle con una última consulta, podria darme una idea de como meter esos valores que se crean en las celdas nuevas de la fila, dentro de un listbox verticalmente, esque de ahi quiero partir para crear la factura de cada servicio, nuevamente mil gracias
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

guardar datos al final de la fila

Publicado por Antoni Masana (560 intervenciones) el 04/05/2020 21:08:17
Pero a veces no es exactamente lo que queremos.

Pongo un ejemplo (La letra indica la columna, el número la fila, el asterisco la celda con datos y el punto la celda vacía)

1
2
3
4
5
6
\ A B C D F G H I J G I J K L M
1 * * * * * * * * * * * * * . .
2 * * * * * * * * . . . . . . .
3 * * * . . . . . . . . . . . .
4 * * * * * * . . . . . . . . .
5 * * * * * * * * * * * . . . .

Con la formula anterior ¿Que columna crees que dice Excel que esta vacía si quieres insertar en la fila 3?

La "L" y si borras las filas 5 y 1 y vuelves a preguntar volverá a decir la "L" ¿Por que? es largo de explicar y es una suposición lo dejo para otro día.

En mi trabajo tengo tablas en las que inserto datos todos los días y la forma de buscar la primera fila Libre es:

1
2
3
4
Fila = 2
While Cells(Fila, "A") <> ""
    Fila = Fila +1
Wend

Cuando salga del bucle Fila me da el balor de la primera vacía.

En respuesta a tu pregunta.

Tu bucas el dato así:

1
2
3
4
5
6
7
8
control = 0
    dato = TextBox1
    rango = "A2:A" & filalibre
    Set midato = ActiveSheet.Range(rango).Find(dato, LookIn:=xlValues, LookAt:=xlWhole)
 
    If (midato) Is Nothing Then
       MsgBox "No se encontraron los datos, se procede a crear uno nuevo"
    Else

Yo lo haria asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub ...
    dato = ""
    Fila = 2
    While Cells(Fila, "A") <> "" And dato = ""
        IF Cells(Fila, "A") = TextBox1 Then
           dato = Cells(Fila,"A")
        Else
            Fila = Fila + 1
        End If
    Wend
 
    If dato = "" Then
        MsgBox "No se encontraron los datos, se procede a crear uno nuevo"
    Else
        MsgBox "El dato esta en la fila: " & Fila

Para llenar el ListBox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub ...
    dato = ""
    Fila = 2
    While Cells(Fila, "A") <> "" And dato = ""
        IF Cells(Fila, "A") = TextBox1 Then
           dato = Cells(Fila,"A")
        Else
            Fila = Fila + 1
        End If
    Wend
 
    If dato = "" Then
        MsgBox "No se encontraron los datos, se procede a crear uno nuevo"
    Else
        Colum=3
        While Cells(Fila, Colum) <> ""
           ListBox1.Add Cells(Fila, Colum
           Colum = Colum + 1
       Wend

A veces se me cuela una tecla por otra y comento algun error.
Si no entiendes algo dimelo e intentare explicarlo mejor

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: 27
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

guardar datos al final de la fila

Publicado por nestor fernando (12 intervenciones) el 04/05/2020 22:21:46
Antoni, muchisimas gracias por su disposición y lo felicito por su conocimiento, en lo poco que llevo leyendolo he aprendido mucho, le voy a exponer el caso y la necesidad, usted me dirá si estoy plantenado bien o si voy por mal camino, en un libro de eacel tengo 4 hojas, en la primera tengo un inventario de productos, el cual se alimenta y modifica con el formulario que le mostré en el cual busca el dato y si lo encuentra se puede modificar, pero si no lo encuentra entonces nos da la opcion de crear uno nuevo, hasta ahi todo perfecto, en otra hoja tengo una tabla en la que pongo registros de cada servicio técnico que se recibe, con un modelo similar al del formulario primero, pero como es necesario aveces aumentar repuestos a un registro entonces se me habia ocurrido la primera solución que me enseñó usted amablemente, era la de ir poniendo registros en la ultima celda de la fila, a partir de un textbox, sin embargo es muy limitado si quiero poner varios repuestos de una sola, entonces se me ocurre, si con ese mismo textbox lo que hago es poner los repuestos en un listbox que me deje poner varios al tiempo, y me los ponga uno a uno en la última celda de la fila escogida, pero que también al buscar nuevamente el registro, me muestre dentro de ese listbox los repuestos que ya le habíamos metido y que tenga la opción de seguirle metiendo al listbox, no se si me enredo mucho a la hora de plantear mi cuestionamiento, agradezco mucho su paciencia, del desarrollo de esta macro depende el éxito de mi proyecto
el resultado final que quiero obtener en el formulario es el siguiente:
textbox1 = fecha
textbox2 = nombre
textbox3 = articulo
textbox4 = ingreso el repuesto que quiero que se cargue en el listbox
listbox1 = todos los repuestos que se han ingresado con el textbox 4 y que se han almacenado en las celdas de la columna hasta la ultima con datos
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