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

Respuesta
1

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.

Respuesta
2

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

Perdón no tome en cuenta la fijación de las variables de las hojas, sin embargo me sale este error

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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas