Mejorar código de programación excel visual basic
Como puedo mejorar este código, ya que hice todo con un if, pero anide muchísimos, quiero saber con que puedo mejor todas esas filas de programación
2 Respuestas
Si explicas la lógica detrás del procedimiento, que significa cada cosa y cual es el objetivo que deseas conseguir, tal vez sea mejor para nosotros confeccionar un código más limpio.
- Compartir respuesta
Prueba la siguiente.
Macro:
'SEGUNDO NIVEL PARA F3 Y F4 Select Case Range("F3") & Range("F4") Case BOLA, CADE, CECI, HERR, POSTA, LOMO, COGO & COG, ALET & ALE Range("I3") = "VERDADERO" Case Else Range("I3") = "FALSO" End Select
Nota: Procura poner el código utilizando el icono para insertar código, ya que de una imagen no lo podemos copiar.
Si señor, con el case se mejora bastante toda esa cantidad de código, enséñame por favor como le puedo añadir más condiciones, y como hago para que así como revisa F3 Y F4 y da el resultado en J3, hacer lo mismo con F5 y F6 con el resultado en J5, y así como 2000 celdas hacia abajo, en este código fije las variables inserte el case que me dio, pero fíjate que no me toma todas las deje como comentario
Sub Macro2() ' ' Macro2 Macro ' 'MERMA Macro codigo 'SEGUNDO NIVEL PARA F3 Y F4 Select Case Range("F3") & Range("F4") Case BOL, BOLA, CAD, CADE, CEC, CECI, HER, HERR, LOM, LOMO, POS, POSTA, COG, COGO, " & " 'ALE, ALET, MUR, MURI, PAL, PALÉ, PEC, PECH, CHA, CHAT, PUN, PUNT, SON, SOBRE, CAL, CALLO, " &_" 'HIG, HIGA, CHU, CHUN, HCG, HCOG, HCTE, HCTEG, MOLC, MOLCTE, MOLESP, MOLESPG, CAP, CAPO, TIR, TIRA Range("J3") = "VERDADERO" Case Else Range("J3") = "FALSO" End Select Range("J3").Select End Sub
Hola dante, no le pude añadir todo el código como me indica ya que posee muchas mayuscuas y la plataforma no lo permite
Fíjate que necesito que recorra por un rango determinado y vaya dando las respuestas en J3, J5, J7, J9, y así hasta mínimo J2000
Sí, es un problema con el editor de este foro, continuamente me pasa, tengo que convertir fórmulas y textos a minúsculas.
Pero, podrías hacer un pequeño esfuerzo, lleva el código a un documento de word, lo conviertes a minúsculas o tipo título y después lo pegas aquí.
Otra opción es, intenta escribir al inicio de la respuesta, un largo párrafo en minúsculas y después pegas el código.
Qué son: bol, bola, cad, etc... ¿Son variables?
¿Puedes poner un ejemplo de lo que pueden tener?
¿Cómo llenas esas variables?
Responde cada duda y en ese orden.
Busca la manera de pegar aquí el código donde llenas esas variables (NO USES IMÁGENES).
R e c u e r d a, tú estás pidiendo ayuda.
Qué son: bol, bola, cad, etc... ¿Son variables?
Si señor son variables,
bol = "corte pierna bola" & "corte de pierna bola a granel"
bola = "corte de pierna bola a granel" & "corte pierna bola"
cad = "corte pierna cadera" & "corte de pierna cadera a granel"
cade = "corte de pierna cadera a granel" & "corte pierna cadera"
cec = "corte pierna cecina" & "corte de pierna cecina a granel"
ceci = "corte de pierna cecina a granel" & "corte pierna cecina"
¿Cómo llenas esas variables?
viene de un archivo que exporto en excel de una aplicación de mi trabajo
sub macro2() ' ' macro2 macro ' 'merma macro codigo bol = "corte pierna bola" & "corte de pierna bola a granel" bola = "corte de pierna bola a granel" & "corte pierna bola" cad = "corte pierna cadera" & "corte de pierna cadera a granel" cade = "corte de pierna cadera a granel" & "corte pierna cadera" cec = "corte pierna cecina" & "corte de pierna cecina a granel" ceci = "corte de pierna cecina a granel" & "corte pierna cecina" her = "corte pierna herradero" & "corte de pierna herradero a granel" herr = "corte de pierna herradero a granel" & "corte pierna herradero" lom = "corte pierna lomo ancho cte" & "corte de pierna lomo ancho a granel" lomo = "corte de pierna lomo ancho a granel" & "corte pierna lomo ancho cte" pos = "corte pierna posta brazo" & "corte de pierna posta brazo a granel" posta = "corte de pierna posta brazo a granel" & "corte pierna posta brazo" cog = "corte b-c especial" & "corte b-c especial a granel" cogo = "corte b-c especial a granel" & "corte b-c especial" ale = "corte brazo aleta" & "corte brazo aleta a granel" alet = "corte brazo aleta a granel" & "corte brazo aleta" mor = "morrillo" mori = "morrillo2" mur = "corte brazo murillo" & "corte brazo murillo a granel" muri = "corte brazo murillo a granel" & "corte brazo murillo" pal = "corte brazo paletero" & "corte brazo paletero a granel" pale = "corte brazo paletero a granel" & "corte brazo paletero" pec = "corte brazo pecho" & "corte brazo pecho a granel" pech = "corte brazo pecho a granel" & "corte brazo pecho" cha = "chata premium" & "chata premium a granel" chat = "chata premium a granel" & "chata premium" pun = "punta anca premium bloque" & "punta anca premium a granel" punt = "punta anca premium a granel" & "punta anca premium bloque" sob = "sobrebarriga" & "sobrebarriga a granel" sobr = "sobrebarriga a granel" & "sobrebarriga" cal = "des.comes.callo" & "des.comes.callo a granel" callo = "des.comes.callo a granel" & "des.comes.callo" hig = "des.comes.higado" & "des.comes.higado a granel" higa = "des.comes.higado a granel" & "des.comes.higado" chu = "des.comes.chunchulla r" & "des.comes.chunchulla a granel" chun = "des.comes.chunchulla a granel" & "des.comes.chunchulla r" hcg = "des.comes.hueso cogote" & "des.comes.hueso cogote a granel" hcog = "des.comes.hueso cogote a granel" & "des.comes.hueso cogote" hcte = "des.comes. hueso cte" & "des.comes.hueso corriente a granel" hcteg = "des.comes.hueso corriente a granel" & "des.comes. hueso cte" molc = "molida de res 7" & "molida de res 7 a granel" molcte = "molida de res 7 a granel" & "molida de res 7" molesp = "molida especial 7" & "molida especial 7 a granel" molespg = "molida especial 7 a granel" & "molida especial 7" cap = "capon" & "capon a granel" capo = "capon a granel" & "capon" tir = "tira de asado" & "tira de asado a granel" tira = "tira de asado a granel" & "tira de asado" 'segundo nivel para f3 y f4 select case range("f3") & range("f4") case bol, bola, cad, cade, cec, ceci, her, herr, lom, lomo, pos, posta, cog, cogo, ale, alet, mur, muri, pal, pale, pec, pech, cha, chat, "_" pun , punt, sob, sobr, cal, callo, hig, higa, chu, chun, hcg, hcog, hcte, hcteg, molc, molcte, molesp, molespg, cap, capo, tir, tira range("j3") = "verdadero" case else range("j5") = "falso" end select range("j5").select select case range("f5") & range("f6") case bol, bola, cad, cade, cec, ceci, her, herr, lom, lomo, pos, posta, cog, cogo, ale, alet, mur, muri, pal, pale, pec, pech, cha, chat, "-" pun , punt, sob, sobr, cal, callo, hig, higa, chu, chun, hcg, hcog, hcte, hcteg, molc, molcte, molesp, molespg, cap, capo, tir, tira range("j5") = "verdadero" case else range("j5") = "falso" end select range("j3").select select case range("f7") & range("f8") case bol, bola, cad, cade, cec, ceci, her, herr, lom, lomo, pos, posta, cog, cogo, ale, alet, mur, muri, pal, pale, pec, pech, cha, chat, "-" pun , punt, sob, sobr, cal, callo, hig, higa, chu, chun, hcg, hcog, hcte, hcteg, molc, molcte, molesp, molespg, cap, capo, tir, tira range("j7") = "verdadero" case else range("j7") = "falso" end select range("j7").select select case range("f9") & range("f10") case bol, bola, cad, cade, cec, ceci, her, herr, lom, lomo, pos, posta, cog, cogo, ale, alet, mur, muri, pal, pale, pec, pech, cha, chat, "_" pun , punt, sob, sobr, cal, callo, hig, higa, chu, chun, hcg, hcog, hcte, hcteg, molc, molcte, molesp, molespg, cap, capo, tir, tira range("j9") = "verdadero" case else range("j9") = "falso" end select range("j3").select end sub
este es todo el código que tengo, solo que existe varias cosas como las variables que estan en mayusculas
como esta imagen sale la hoja de excel
Esta es mi sugerencia para mejorar el código.
Crea una hoja y la llamas "Cortes"
En la hoja "Cortes" en la columna "A" pones la "Desc Item 1", en la columna "B" pones la "Desc Item 2" y en la columna "C" pones esta fórmula:
=A2&B2
Tal como se muestra en la siguiente imagen:
Ahora, todo el código queda reducido a esto:
Sub Macro1() Dim sh1 As Worksheet, rng As Range, f As Range Dim i As Long, existe As Boolean ' Set sh1 = Sheets("Hoja1") Set rng = Sheets("Cortes").Range("C:C") ' For i = 3 To sh1.Range("F" & Rows.Count).End(3).Row Step 2 existe = False Set f = rng.Find(sh1.Range("F" & i) & sh1.Range("F" & i + 1), , xlValues, xlWhole, , , False, , False) If Not f Is Nothing Then existe = True Set f = rng.Find(sh1.Range("F" & i + 1) & sh1.Range("F" & i), , xlValues, xlWhole, , , False, , False) If Not f Is Nothing Then existe = True sh1.Range("J" & i).Value = existe Next End Sub
No importa si las descripciones están en mayúsculas o minúsculas , con el método Find y con un parámetro se específica que no coincidan mayúsculas y minúsculas.
La macro realiza las dos búsquedas desc1 & desc2 y también desc2 & desc1.
Si encuentra alguna de las 2 entonces pone "VERDADERO" de lo contrario pone "FALSO"
Cambia en la macro "Hoja1" y "Cortes" por los nombres de hojas que desees.
Déjame saber si tienes alguna duda.
Hola buenos días Dante, déjeme decirle que su código de programación es muy bueno, permita me sugerir, con el Select case que enviaste corre como debiera, ese esta bien, solo es reducirlo con ese for que el empiece evaluando y contando y asu vez avanzando de fila en fila, resulta que cuando lo separo como me lo indico, pierdo la perspectiva ya que el va amarrado alas cifras que lleva en la fila G y H, entonces, yo pienso que si logro hacerlo correr con un for, podemos reducir toda la cantidad de código que antes le mencionaba, la verdad no se como manejar esos for, eh buscado en Internet, ah mirado cursos y muchos temas al respecto pero no hago que funcione, es decir, no se como programar el for, no obstante tome el ultimo código que me envió he tratado de acomodarlo pero me sigue arrojando errores, es mas esto eslo que le hice a su codigo
Dim i As Long, existe As Boolean, f As Range
Range("j3").Select
For i = 3 To Range("F" & Rows.Count).End(3).Row Step 2 'aca fija contador y le dice que recorra toda la columna f desde la fila 3 hasta el final de dos en dos
existe = False 'variable
Set f = Rng.Find(Range("F" & i) & Range("F" & i + 1), , xlValues, xlWhole, , , False, , False) 'se que busca las dos filas pero me aroja error
If Not f Is Nothing Then existe = True
Set f3 = Rng.Find(Range("F4" & i + 1) & Range("F3" & i), , xlValues, xlWhole, , , False, , False)
If Not f Is Nothing Then existe = True
Range("J3" & i).Value = existe
Next
Solamente copia la macro (no la modifiques) y revisa el ejemplo que puse en la imagen.
Las mejores prácticas indican poner los datos en una base de datos, en este caso en una hoja, y NO poner datos en el código.
Es más fácil hacer cambios o agregar registros en una hoja que dentro del código.
Prueba con mi ejemplo y me comentas.
Hola buenos días, no logro copiar los datos de la columna F, en el orden que están, es decir, deben quedar en la columna A, F3,F5,F7... y en la columna B, F4,F6,F8... me indicas como se hace.
No los copies. Captura uno por uno. Eso hice yo y no es mi trabajo.
Ya los tienes en esta hoja, solamente copia F3 en A2, luego copias F4 en B2, y así uno por uno.
O toma el dato de la macro, ahí ya lo tienes en prácticamente 2 columnas:
bol = "corte pierna bola" & "corte de pierna bola a granel" bola = "corte de pierna bola a granel" & "corte pierna bola" cad = "corte pierna cadera" & "corte de pierna cadera a granel"
Lo copias de tu macro y lo pegas en la hoja y lo separas en columnas, hasta que tengas los valores de A y B. Es un trabajo pesado, pero solamente lo vas a hacer una vez, y será más práctico tenerlo en la hoja que estar adecuando muchas veces la macro.
¡Gracias!
Dante muchas gracias por todo lo que me has colaborado, ultimo detalle, esto lo debo hacer todos los días, es decir sale un archivo diario mas o menos con unos tres mil registros, y debo hacerle este tratamiento, ya que es un software que captura los movimientos de estos productos y yo debo revidar si el operario se equivoca en su proceso ya que el software no tiene como hacerlo, bueno mil gracias, voy a seguir dándole, por ahora no me doy por vencido, nuevamente gracias
Ultimo detalle
¿Y cuál es el último detalle?
Si pones la macro en un botón, solamente le das click al botón y se actualiza la columna.
Se debe tener en cuenta en el momento que yo llevo los datos a otra hoja puede perderse la trasabilidad de la información, entonces, cuando yo quiera saber que salio un error por allá en la casilla 1.056 como se yo a cual numero de documento a cual bodega,
fíjate que el select case funciona bien, el dilema es la cantidad de código que se debe hacer, por eso pensaba que con un for se reduce bastante
El código sustituye al case, solamente debes poner los datos correctamente en las columnas A y B.
O muéstrame cuál dato en a y b no te funciona y te digo cuál es el error.
El case no es funcional. Si te lo mostré era por la pregunta que hiciste, pero revisando tu información la mejor opción es la que te envié.
Si te equivoca con los datos en las columnas a y b es más probable que te equivoques al capturar los datos en el código.
Pero ahí tienes la opción tú decides si la quieres utilizar.
Si me muestras en dónde no funciona la macro te ayudo a encontrar la solución.
Pero sigues pidiendo el case, pero no me dices cuál es el problema con los datos en a y b.
Para eso es la bandera en la columna j para saber cuál es verdadero y cual falso, solamente filtrar por falso y sabrás cuales datos tienen problema.
- Compartir respuesta
Ok ya se lo envío - Luis Alejandro Garcia Orduz
Ok lo voy a probar esta noche y le cuento - Luis Alejandro Garcia Orduz