Alta de clientes que sugiere un ID libre

Para Dante Amor

Hola hola!

Tengo un formulario para crear clientes, a cada cliente tengo que asignarle un ID numérico.

Cuando un cliente se da de baja borro manualmente todos sus datos incluido el ID, por lo que ese ID vuelve a quedar libre.

Me gustaría que cuando vaya a crear un nuevo cliente, la macro busque en la tabla el primer ID que esté libre y lo sugiera o asigne automáticamente al nuevo cliente.

Ésta es la tabla para que se vea claro los ID´s que quedan libres, en este caso al crear un nuevo cliente tendría que asignar o sugerir el primero que está libre de menor a mayor, es decir el "02":

Este es el formulario:

Y este el código del botón GUARDAR:

rem Botón guardar
Sub GuardarInformacion()
    rem formulario para introducir datos en una tabla
    Rem Declaracion de variables
    Dim contFila As Long    'la variable serà el largo de la fila
    Dim hoja As Worksheet   'define la variable como hoja
    Set hoja = Worksheets(1) 'declara esta hoja como la primera del libro.
    Rem Verifica que est_n todos los campos rellenos e impide continuar.
    If Trim$(BoxID.Text) = Empty Or Trim$(BoxNombre.Text) = Empty Or Trim$(BoxCentro.Text) = Empty Or Trim$(BoxDireccion.Text) = Empty Or Trim$(BoxNif.Text) = Empty Or Trim$(BoxTelefono.Text) = Empty Or Trim$(BoxEmail.Text) = Empty Then
        MsgBox "Por favor ingresa todos los datos!", vbCritical, "Datos Incompletos"
        Exit Sub
    End If
    Rem Avanza a la siguiente celda a lo largo de la fila para ingresar los datos
    contFila = hoja.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    hoja.Cells(contFila, 1).Value = Me.BoxID.Value
    hoja.Cells(contFila, 2).Value = Me.BoxNombre.Value
    hoja.Cells(contFila, 3).Value = Me.BoxCentro.Value
    hoja.Cells(contFila, 4).Value = Me.BoxDireccion.Value
    hoja.Cells(contFila, 5).Value = Me.BoxNif.Value
    hoja.Cells(contFila, 6).Value = Me.BoxTelefono.Value
    hoja.Cells(contFila, 7).Value = Me.BoxEmail.Value
    Rem Borra los datos de los campos
    Me.BoxID.Value = ""
    Me.BoxNombre.Value = ""
    Me.BoxCentro.Value = ""
    Me.BoxDireccion.Value = ""
    Me.BoxNif.Value = ""
    Me.BoxTelefono.Value = ""
    Me.BoxEmail.Value = ""
    Me.BoxID.SetFocus
End Sub

Las anotaciones '(ignoradas) las pongo porque estoy aprendiendo y así puedo orientarme. 

1 respuesta

Respuesta
1

H o l a:

Si entiendo bien, le ID borrado dejará la fila en blanco, si es así, entonces el código quedaría así:

' Botón guardar
Sub GuardarInformacion()
    ' Formulario para introducir datos en una tabla
    ' Declaracion de variables
    Dim contFila As Long    'la variable serà el largo de la fila
    Dim hoja As Worksheet   'define la variable como hoja
    Set hoja = Worksheets(1) 'declara esta hoja como la primera del libro.
    Rem Verifica que est_n todos los campos rellenos e impide continuar.
    If Trim$(BoxID.Text) = Empty Or Trim$(BoxNombre.Text) = Empty Or Trim$(BoxCentro.Text) = Empty Or Trim$(BoxDireccion.Text) = Empty Or Trim$(BoxNif.Text) = Empty Or Trim$(BoxTelefono.Text) = Empty Or Trim$(BoxEmail.Text) = Empty Then
        MsgBox "Por favor ingresa todos los datos!", vbCritical, "Datos Incompletos"
        Exit Sub
    End If
    ' Avanza a la siguiente celda a lo largo de la fila para ingresar los datos
    'contFila = hoja.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    For i = 2 To hoja.Range("A" & Rows.Count).End(xlUp).Row + 1
        If hoja.Cells(i, "A") = "" Then
            contFila = i
            Exit For
        End If
    Next
    hoja.Cells(contFila, 1).Value = Me.BoxID.Value
    hoja.Cells(contFila, 2).Value = Me.BoxNombre.Value
    hoja.Cells(contFila, 3).Value = Me.BoxCentro.Value
    hoja.Cells(contFila, 4).Value = Me.BoxDireccion.Value
    hoja.Cells(contFila, 5).Value = Me.BoxNif.Value
    hoja.Cells(contFila, 6).Value = Me.BoxTelefono.Value
    hoja.Cells(contFila, 7).Value = Me.BoxEmail.Value
    ' Borra los datos de los campos
    Me.BoxID.Value = ""
    Me.BoxNombre.Value = ""
    Me.BoxCentro.Value = ""
    Me.BoxDireccion.Value = ""
    Me.BoxNif.Value = ""
    Me.BoxTelefono.Value = ""
    Me.BoxEmail.Value = ""
    Me.BoxID.SetFocus
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Set hoja = Worksheets(1)
    id_nuevo = 0
    For i = 2 To hoja.Range("A" & Rows.Count).End(xlUp).Row + 1
        If hoja.Cells(i, "A") = "" Then Exit For
        id_nuevo = id_nuevo + 1
    Next
    BoxID = Format(id_nuevo, "00")
End Sub

' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

Que mákina Dante, muchas gracias funciona casi perfecto!
Aparentemente solo hay que pulir 2 detalles:

caso 1- Cuando están todas las filas completas, por ejemplo del 1 al 20, debería de sugerir la número 21 como siguiente, pero se queda en la última, en este caso sugiere la 20 y es erróneo ya que está completa, borraría a un pobre cliente que no lo merece :(

caso 2- Una vez he introducido todos los datos del cliente y guardo, el cursor vuelve al campo de ID Cliente, pero ya no asigna más ID.

Caso 1. Según tu imagen de ejemplo, los datos empiezan en la fila 2 con el Id 0. Si tienes del 0 al 20 la macro sugiere el ID 21, pero lo va a almacenar en la fila 23.

Revisa bien los datos.

Caso 2. Te anexo el cambio en la para para que después de agregar, te sugiera el siguiente ID.

' Botón guardar
Sub GuardarInformacion()
    ' Formulario para introducir datos en una tabla
    ' Declaracion de variables
    Dim contFila As Long    'la variable serà el largo de la fila
    Dim hoja As Worksheet   'define la variable como hoja
    Set hoja = Worksheets(1) 'declara esta hoja como la primera del libro.
    Rem Verifica que est_n todos los campos rellenos e impide continuar.
    If Trim$(BoxID.Text) = Empty Or Trim$(BoxNombre.Text) = Empty Or Trim$(BoxCentro.Text) = Empty Or Trim$(BoxDireccion.Text) = Empty Or Trim$(BoxNif.Text) = Empty Or Trim$(BoxTelefono.Text) = Empty Or Trim$(BoxEmail.Text) = Empty Then
        MsgBox "Por favor ingresa todos los datos!", vbCritical, "Datos Incompletos"
        Exit Sub
    End If
    ' Avanza a la siguiente celda a lo largo de la fila para ingresar los datos
    'contFila = hoja.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    For i = 2 To hoja.Range("A" & Rows.Count).End(xlUp).Row + 1
        If hoja.Cells(i, "A") = "" Then
            contFila = i
            Exit For
        End If
    Next
    hoja.Cells(contFila, 1).Value = Me.BoxID.Value
    hoja.Cells(contFila, 2).Value = Me.BoxNombre.Value
    hoja.Cells(contFila, 3).Value = Me.BoxCentro.Value
    hoja.Cells(contFila, 4).Value = Me.BoxDireccion.Value
    hoja.Cells(contFila, 5).Value = Me.BoxNif.Value
    hoja.Cells(contFila, 6).Value = Me.BoxTelefono.Value
    hoja.Cells(contFila, 7).Value = Me.BoxEmail.Value
   ' Borra los datos de los campos
    Me.BoxID.Value = ""
    Me.BoxNombre.Value = ""
    Me.BoxCentro.Value = ""
    Me.BoxDireccion.Value = ""
    Me.BoxNif.Value = ""
    Me.BoxTelefono.Value = ""
    Me.BoxEmail.Value = ""
    Me.BoxID.SetFocus
    Call AsignarId
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Call AsignarId
End Sub
'
Sub AsignarId()
    Set hoja = Worksheets(1)
    id_nuevo = 0
    For i = 2 To hoja.Range("A" & Rows.Count).End(xlUp).Row + 1
        If hoja.Cells(i, "A") = "" Then Exit For
        id_nuevo = id_nuevo + 1
    Next
    BoxID = Format(id_nuevo, "00")
End Sub

Sal u dos

Comprobándolo de nuevo es cierto que no sobreescribe el último cliente, pero me sugiere el ID 20, estando el cliente con ID20 completo y estando el libre el ID19, debería sugerir el 19, y luego pasar al 21.

Te adjunto el fichero de pruebas para que lo puedas ver con más claridad.

Un saludo.

Revisa que no haya espacios en las celdas que aparentemente están vacías.

No puedo descargar el archivo. Envíame tu archivo.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Motor Mac” y el título de esta pregunta.

Enviado ;)

H o l a:

Te anexo la macro actualizada

Sub AsignarId()
    Set hoja = Worksheets(1)
    id_nuevo = 0
    For i = 2 To hoja.Range("A" & Rows.Count).End(xlUp).Row + 1
        If hoja.Cells(i, "A") = "" Then Exit For
        id_nuevo = Val(hoja.Cells(i, "A")) + 1
    Next
    BoxID = Format(id_nuevo, "00")
End Sub

sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas