Adaptar código para crear un Numero ID consecutivo VBA EXCEL
Un compañero del foro me ha ayudado con un código pero no logro adaptarlo a mi excel.
El código consiste en crear de manera automática un código consecutivo que identifique el pedido. El formato me gustaría que fuera el que hay en la macro: 0000-año
Los datos están en una tabla llamada DATOS_TABLA en la columna A.
Además no hay una relación con el numero de fila (un mismo ID puede estar introducido varias veces porque puede hacer referencia a un mismo pedido).
Uso un form para introducir datos, la idea que tenia es que en un label llamado NUM_CONSECUTIU
Private Sub UserForm_Initialize() ID_anterior = Range("A1").End(xlDown).Offset(0, 0).Select num_consecutiu.Caption = NextID(ID_anterior) End Sub Public Function NextID(PreID As Long) As Long Dim CrrtYr As Integer: CrrtYr = Year(Now) Dim INCrement As String: INCrement = Left(CStr(PreID), Len(CStr(PreID)) - 4) NextID = CLng(INCrement) + 1 & CrrtYr End Function
Debería ir a la ultima celda con valores de la columna A (A9 en este caso), leer la celda, sumarle uno (0003-2019) e ir a la celda de abajo (A10 en este caso) y escribir el resultado de la la celda anterior +1 (0003-2019)
He intentado adptar este código pero no soy capaz, ¿qué hago mal?
UDF = User Defined Function. Que se pueda usar en las celdas es solo un extra que nos ha obsequiado Microsoft. No lo tomes tan literal. Las UDF son útiles en todo el sentido de su nombre. Pregúntale a Java, JavaScript, C++, el mismo VB o cualquier lenguaje más serio que VBA. - Andy Machin
Hola ¿a qué viene el comentario? No te entiendo para ser sincero. Por si acaso, programo desde niño, empecé con Basic 1.0 en una Sinclair ZX81 y con las Commodore 64 (y 128) y su Basic 2.0. Participo en foros desde hace casi 15 año, programa en VBA, en el "antiguo" VB 6.0, en VB.Net, en VC++, en C++, en VBS, php, asp, y algunos otros lenguajes. Microsoft me ha reconocido como MVP de Excel,y un largo etcétera más de cosas. Entonces, cuando doy un consejo o escribo algo sobre programación siempre trato de que sea algo que vuelva eficientes procesos que quizá son eficaces, es más, en este caso coloco claramente "en casos como este", no digo que esté mal ¿se entiende mejor? - Abraham Valencia
Ah, por cierto, no sé si programas de hobby como mucha gente o conoces bastante de teoría sobre el tema, porque de saber teoría, se asume que sabes que una sola rutina corta es mejor que una rutina más una UDF. Nos vemos. - Abraham Valencia
Conozco mucha teoría en programación porque es lo que enseñan en la universidad (almenos donde vivo) poca practica y mucha teoría, ya que la practica se hace autodidactamente. Así que sí, y no coincido contigo. Por ejemplo es una buena practica y costumbre de los programadores "C" dividir casi todo el código en funciones que trabajan en armonía. No entiendo tu idea de "rutina corta" o "rutina + UDF". la UDF que le propuse es corta, es probablemente mas corta y mejor estructurada que tu propuesta, sin ánimos de discutir, ya que tu estas llamando a más "FUNCIONES" innecesarias como MID() y una conversión de tipo también innecesaria con el VAL(). - Andy Machin
Ah, la hiciste tú, entonces entiendo un poco más tu comentario, aunque lo sigo viendo innecesario. Igual sigues subjetivo y pensando que alguien dijo que tu sugerencia está mal, te invito a indicar en dónde dice eso. Sobre C, no olvidar que es un lenguaje de programación de propósito general y por ende es con "full" funciones :) Por cierto, tampoco dije que tu UDF es larga ¿me indicas en dónde puse eso? Sobre VAL, cierto, innecesario, pero a veces pasa eso cuando uno hace todo de memoria desde el celular, sin probar (como muchas veces indico que hago). Sobre MID, para nada, tiene bastante lógica sobre todo pensando en que en algún momento habrá números de 5 dígitos, por ejemplo :) - Abraham Valencia
Ah, y vuelvo a comentar, puse claramente "en tu caso", antes de responderle a nuestro amigo. Sobre tu propuesta "más corta", ya te dije estás usando una rutina (evento) y un llamado a una UDF, yo solo el evento ¿recuerdas lo que dice la teoría sobre eso? Parece que no. Sobre decir que tu propuesta está mejor estructuradas, según tú, la verdad las dos están bien, una con un VAL innecesario y tú sin tomar en cuenta el guión de nuestro amigo. O sea, ambas buenas estimado, entiende eso por favor, no busques errores o equivocaciones para, según tú y al menos aparentemente, querer decir "el mío es mejor", eso hay que dejarlo para los niños. - Abraham Valencia
Por cierto, si deseas escribe con tranquilidad, yo lo dejo ahí, un abrazo. E insisto, para nada quise ningunear tu UDF, para nada. - Abraham Valencia
Nada de eso. Para confesarte algo siempre te he admirado en este foro, me pareces el mejor de VBA honestamente. Por encima de Dante Amor y Elsa (que son muy buenos). Lo que pasa es que si vieras su pregunta anterior, se le recomendó formatear la columna manualmente así que el "-" no seria tomado en cuenta en la función, por eso dije que el Mid() era innecesario y el Instring() también ahora que lo veo. Y como estamos en un año de 4 dígitos, (ni de chiste viviremos para ver uno de 5) yo opté por dejar de lado los últimos 4 dígitos del ID (que son el año). Igual me sigues pareciendo un excelente conocedor de VBA, es normal que hayan diferencias en este mundo tan cambiante de la programación - Andy Machin
No pensaba seguir pero me veo obligado: Disculpa si me puse irritable con los comentarios, gracias por tus palabras. Reitero mis disculpas y lo digo públicamente: Es evidente que programas mejor que casi todos por aquí. Un abrazo, nos vemos. - Abraham Valencia
Gracias :) saludos - Andy Machin