Saltar al contenido

Insertar fila por orden alfabético


Recommended Posts

publicado

Hola a todos.

Necesito ayuda sobre este asunto.

Tengo una lista de nombres en una tabla. Por ejemplo así.

ID_RH	Orden	Período	Fecha Alta	O.T.	Clave	Nombre Completo
76231	1	00	10/05/2018	0308	101224	        ANDRES SANZ ORTIZ
76229	2	00	20/12/2006	0308	101222	        ANTONIO LOPEZ RODRIGUEZ
76234	1	00	04/04/2017	0308	101227	        BERNABE RIUZ TORNE
76235	2	00	13/11/2017	0318	101228	        BRYAN RUIZ CHERS
76236	1	00	03/07/2017	0308	101229	        CARLOS RUIZ LOPEZ
76237	2	00	05/06/2018	0318	101230	        ERNESTO FERNANDEZ SANZ

Quisiera con un Inputbox insertar un nombre y apellidos (por ejemplo DIEGO RUIZ CAMPOS) y este buscara en la lista como la del ejemplo e insertara la fila con el nombre y apellidos del Inputbox en la posición que le toca (en el caso del ejemplo después de CARLOS RUIZ y antes de ERNESTO FERNANDEZ). Lo fácil sería insertarlo en la última fila y luego ordenarlo, pero lo que busco es no hacerlo así, sino que busque después de qué fila le toca y entonces añadir una fila e insertar los datos del nombre y apellidos nuevo en esa fila.

Si es posible me ayudéis os lo agradezco, o decirme como buscarlo en la Red porque lo único que encuentro es eso, añadir una fila y luego ordenarla.

Saludos,

Moisés.

 

Invitado Cacho R
publicado

Tres re-preguntas, Pirtrafilla:

- ¿Cuál sería la posición en la que deseas registrar esa info si el nombre/apellido es nuevo y no se encuentra registrado previamente en ese rango de datos?...

- ¿Cuál es el fundamento técnico por el que deseas hacer "eso" y no lo que se hace con mayor habitualidad (que por "algo" será)?...

- ¿Viste mi respuesta (que incluye la eliminación del registro) a tu consulta previa a la presente?...

Saludos, Cacho R.

publicado

Pues yo te diría que probaras esto:

Sub InsertarEnOrden()
nombre = InputBox("Nombre")
Do:   x = x + 1
      If Not UCase(Range("G" & x)) < UCase(nombre) Then
         Rows(x).Insert
         Range("G" & x) = nombre
         Exit Do
      End If
Loop Until Range("G" & x) = ""
End Sub

 

publicado
Hace 2 minutos , Cacho R dijo:

- ¿Viste mi respuesta (que incluye la eliminación del registro) a tu consulta previa a la presente?..

Hola @Cacho R Sí, lo vi y lo probé. Quise contestarte que lo había probado pero el tema se cerró, va perfecto. No entiendo todo el código, pero es muy corto.

Muchas gracias.

Hace 4 minutos , Cacho R dijo:

¿Cuál sería la posición en la que deseas registrar esa info si el nombre/apellido es nuevo y no se encuentra registrado previamente en ese rango de datos?...

Quisiera introducir un nombre y apellidos nuevo, con un formulario simple. Y quiero que se coloque por orden alfabético justo donde le toque. Por ejemplo introduzco DIEGO RUIZ CAMPOS y este buscara en la lista como la del ejemplo e insertara la fila con el nombre y apellidos después de CARLOS RUIZ y antes de ERNESTO FERNANDEZ.

Hace 6 minutos , Cacho R dijo:

- ¿Cuál es el fundamento técnico por el que deseas hacer "eso" y no lo que se hace con mayor habitualidad (que por "algo" será)?...

Porque en la tabla hay muchos más datos y no todas las columnas están ocupadas o no tienen títulos, así que con un autoflitro podría dar problemas. Ahí es donde está lo complicado y lo que no encuentro información de como hacerlo.

Gracias.

Moisés.

publicado

@Antoni, muchas gracias.

Es exacto lo que quería. Hay que ver que fácil lo haces y qué difícil lo veía yo. 

He modificado dos líneas para adaptarlo a mi tabla.

Sub InsertarEnOrden()
nombre = InputBox("Nombre")
x = 2 'empezamos en la fila 3 después de los títulos
Do:   x = x + 1
      If Not UCase(Range("G" & x)) < UCase(nombre) Then
         Rows(x).Insert
         Range("G" & x) = UCase(nombre) 'convertimos el registro a mayusculas
         Exit Do
      End If
Loop Until Range("G" & x) = ""
End Sub

Muchas gracias.;)

Invitado Cacho R
publicado
Hace 26 minutos , Pirtrafilla dijo:

Ahí es donde está lo complicado y lo que no encuentro información de como hacerlo.

Mmmm... Creo que lo que quieres hacer es lo usual: agregar, modificar y eliminar registros a un rango de datos: ¿Es así?...

Lo del orden es un tema muy tangencial y puede hacerse como es usual (por ser más eficiente) pero conseguir lo que quieres terminar viendo (y de paso aprendes como se hace).

Otra cosa que llama la atención de tus intentos es que ordenes según nombre/apellido y no apellido/nombre (otra vez: como es usual).

O sea: ¿Te animas a subir al Foro tu rango de datos con sus títulos correspondientes y -digamos- 10 filas de datos?

Así será más sencillo mostrarte aquellos tres procedimientos (agregar, modificar y eliminar), y... ¡Claro!... ordenarlos como te plazca (Jajjjajaja).

Saludos, Cacho R.
.

publicado

Hola, subo el archivo de prueba.

Hay dos botones. El primero es para eliminar un registro a través de Inputbox. Los códigos del Módulo1 son de @Antoni

He hecho un pequeño formulario con la intención de introducir el nuevo registro. He puesto anotaciones para aclarar mi intención.

Una cosa que estoy mirando es poner un código para validar que en el campo F_INICIO el formato sea dd/mm/aaaa.

Tambien tengo intención de eliminar el registro con un formulario similar, de momento lo tengo con un Inputbox.

Gracias.

 

TrabajarConRegistros.xlsm

publicado

En el archivo hay un error en una macro, la que limpia los controles.

He añadido una validación para que el campo fecha sea correcto, aunque me falla, porque cuando da error de formato no consiga que el foco vuelva al textbox F_ALTA.

Reenvío el fichero de nuevo modificado.

Siento las molestias.

 

TrabajarConRegistros.xlsm

publicado

Sigo sin conseguir que cuando salte el error de formato de fecha el foco se quede en el textbox F_ALTA

He cambiado por este código pero no lo consigo.

Private Sub F_ALTA_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.F_ALTA = Format(Me.F_ALTA, "dd/mmm/yyyy")
If Not IsDate("dd/mmm/yyyy") Then
Me.F_ALTA.SetFocus
MsgBox UCase("Formato fecha erróneo (dd/mm/aaaa)"), vbCritical, "ERROR"
Exit Sub
End If
End Sub

 

Invitado Cacho R
publicado

A ver:

- He visto que en Orden vas numerando secuencialmente.
Imagina -con la info tal cual la has subido- que eliminas 76231/1. Si posteriormente das de alta un nuevo 76231 -interpreto (esto tienes que confirmarlo)- que debería poner un '2' como orden, pero como la '1' la eliminaste previamente, se pierde esa correlatividad: ¿Estoy en lo cierto o como es la cosa?...

- No contestaste lo antes preguntado sobre nombre/apellido o apellido/nombre: ¿Por qué de una forma y no de la otra?...

- En este sentido y como veo que repites personas: ¿No deberías tener -en tabla aparte- una lista de Claves y Apellidos y Nombres?...

- Además: ¿En qué parte de la hoja reflejas el campo del userform llamado: GRUPO?...

Saludos, Cacho R.

publicado

Hola de nuevo.

Necesito por favor reviséis el archivo, ya está prácticamente acabado pero tengo algún fallo, como lo del formato fecha al dar de alta un registro en el formulario.

Gracias por la ayuda que me estáis prestando, estoy aprendiendo y ver que encima funciona anima bastante.

Lo dicho, si podéis echar un vistazo os lo agradezco.

Moisés.

 

TrabajarConRegistros.xlsm

publicado
Hace 1 minuto , Cacho R dijo:

- No contestaste lo antes preguntado sobre nombre/apellido o apellido/nombre: ¿Por qué de una forma y no de la otra?...

Es un pase de lista y no necesito hacerlo con el formato apellido/nombre, me basta con nombre/apellido.

Hace 1 minuto , Cacho R dijo:

- En este sentido y como veo que repites personas: ¿No deberías tener -en tabla aparte- una lista de Claves y Apellidos y Nombres?..

Eso solo sucede en momentos puntuales. Como es un pase de lista mensual sucede que cuando se renueva el contrato hay una parte del mes en que están los ID repetidos con Periodos diferentes. Entonces al mes siguiente lo que hago es eliminar el ID con el Periodo más antiguo y conservo el último. Y si ya no sigue en la empresa por el motivo que sea lo que hago es eliminar el ID aunque no esté repetido en el pase de lista del mes que estoy trabajando.

@Cacho R nos hemos cruzado los mensajes y mientras me preguntabas esto os estaba enviando el fichero con los últimos avances que había hecho.

Tener en cuenta que el código en la mayoría de los casos es con vuestra ayuda.

Saludos.

 

Invitado Cacho R
publicado

Te falta responder lo del ORDER y lo de GRUPO...

publicado

Lo de ORDEN lo acabo de explicar, lo que he confundido con Periodo.

Es decir cuando alguien tiene más de un contrato de antigüedad el ORDEN es diferente. Puede darse el caso en que en un mes convivan los ID repetidos de algún empleado con ORDEN diferente por ese motivo.

El PERIODO es una manera de diferenciar al personal operario (PERIODO 00) y el personal de oficina (PERIODO 04) y su momento de pago en el mes, que son diferentes.

Y el GRUPO es en que Zona de trabajo están destinados. Lo usaré después, cuando lo adapte al fichero original que contiene muchos más datos y cálculos. El archivo que envío es más pequeño y es un simple ejemplo.

Espero haberme explicado más o menos bien.

Moisés.

Invitado Cacho R
publicado

Te preparo "algo" que incluya los tres movimientos (Agregar, Modificar y Eliminar) en el mismo Userform y te lo subo, entonces...

Saludos, Cacho R.

publicado

Una pregunta @Cacho R. Estoy revisando el formulario y veo que puedo agregar, sin embargo para agregar introduzco todos los datos y cuando llego al "Nombre" no me deja escribirlo y además siempre me obliga a poner el campo "Clave" y este debe existir. No lo entiendo bien porque si el empleado es nuevo debería poner su nombre. Veo oque hay dos hojas, entiendo que hay que agregar primero a las personas para luego añadirlas en la hoja1 con el resto de datos.

Si me puedes explicar un poco el funcionamiento te lo agradezco. El código ya veo que muy complejo para mis conocimientos pero si entiendo el funcionamiento del formulario podría intentar entender un poco el código.

No se si es posible atiendas esto que te pido.

Gracias.

Moisés.

Invitado Cacho R
publicado
Hace 14 horas, Pirtrafilla dijo:

entiendo que hay que agregar primero a las personas...

Es exactamente como lo describes...
Vos querés que la info se ordene por nombre y apellido.  Por lo tanto es "sensitivo" que quien introduzca la info "escriba siempre lo mismo". Por ello es que la persona debe estar registrada en la segunda hoja, para que la macro tome la info desde allí: ¡Siempre la misma!, ¿Entendido?...

Invitado Cacho R
publicado

En cuanto al funcionamiento gral tenemos:

- Si vas a agregar un nuevo registro, el combobox1 oficia de "textbox". Pero si vas a modificar o eliminar un registro, dicho combobox oficia de... combobox, tomando la info -directamente- del rango de datos (un listobject, como habrás notado).

- La ayuda que ves abajo del campo 'Fecha de alta' está "customizada". Eso significa que si abrís tu archivo en una PC que tiene como formato de fecha mm/dd/yyyy, entonces éso es lo que se verá y no habrá ningún inconveniente con la entrada de datos ("eso" de intercambiar días con meses).

Saludos, Cacho R.
 

  • Silvia bloqueó este tema

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.