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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Vale mil gracias, en vdd se agradece todo el apoyo y comentarios
    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.