Excel visual basic macro error en condición en IF

¿Me puede alguien ayudar a corregir esto? No me da error, pero no funciona... No aplica de forma correcta la condición.

La condición es Si la Celda A es igual a "Referencia 23" y la celda D no contiene la palabra "almacén" entonces

MsgBox "...."

Lo intenté de dos formas:

1)

If Cells(i, "A").Value = "Referencia 23" And Cells(i, "D").Value <> "*Almacén*" Then MsgBox....

2)

If Not Cells(i, "D").Value Like "*almacén*" And Cells(i, "A").Value = "Referencia 23" Then MsgBox ...

1 Respuesta

Respuesta
1

Prueba lo siguiente para validar "*Almacén*", en minúsculas o en mayúsculas, con acento o sin acento:

    If Range("A" & i).Value = "Referencia 23" And _
       (Not LCase(Range("D" & i).Value) Like LCase("*almacén*") Or _
       Not LCase(Range("D" & i).Value) Like LCase("*almacen*")) Then
       MsgBox "..."
    End If

Hola, Dante.-

Una pregunta. Tengo el If dentro de un For y Next... lo que te he puesto antes pero dentro de ese bucle. Tengo que poner el mismo para el tuyo? O no haría falta?

Yo lo tengo así:

For i = 2 To (etc.)

 If Cells(i, "A").Value = "Referencia 23" And Cells(i, "D").Value <> "*Almacén*" Then MsgBox....

Next

¿tendría que poner lo tuyo también dentro de ese bucle? Es que se me ralentiza la macro mucho más que antes... no sé porqué.

Gracias!

If Cells(i, "A").Value = "Referencia 23" And Cells(i, "D").Value <> "*Almacén*" Then MsgBox....

No entiendo si tu código funciona.

¿Probaste mi código?

¿Tendría qué poner lo tuyo también dentro de ese bucle? Es que se me ralentiza la macro mucho más que antes.

Pon aquí tu macro completa para revisarla. Utiliza el icono para insertar código.

Voy a actualizar tu código, en lugar de leer las celdas, vamos a leer un arreglo, eso es más rápido, porque todo se hace en memoria.

También pon una imagen con datos genéricos para ver la estructura de tus datos.

Sí! lo probé y funciona! pero solo quería saber si tengo que meter lo mismo dentro de Mi For o si tengo que cambiar algo ahí.

Ya sabes... yo tenía Cells(i, "A").Value y ahora es Range("A" & i).Value ...

No podría decirte con certeza en dónde va. Ya que no veo tu código completo.

Mi código sustituye a tu código.

Si tu código está dentro del For, entonces mi código debería ir dentro de tu For.


Si tienes problemas de performance, podría arreglar tu código para que sea más rápido.

¿Cuántos registros tienes en tu archivo?


Pon aquí tu macro completa para revisarla. Utiliza el icono para insertar código.

perfecto, Dante. entonces como funciona lo dejo tal cual está. Va algo más lento, pero funciona.

Muchas gracias!

Va algo más lento, pero funciona.

No está por demás a aprender un poco sobre arreglos. Generalmente si una macro tarda minutos, con este tipo de arreglos el proceso es inmediato.

La oferta sigue en pie, si quieres.

gracias, Dante.

Si es que el código no tenía mucho más, he metido lo tuyo dentro de esto, antes, dentro de ese With y ese For tenía lo mío, puede ser mi macro que de tanta prueba ahora pesa mucho más...:

With Worksheets("INVENTARIO")            
For i = 2 To .UsedRange.Rows(.UsedRange.Rows.Count).Row             
If Range("A" & i).Value = "Referencia 23" And _        
(Not LCase(Range("D" & i).Value) Like LCase("*almacén*") Or _        
Not LCase(Range("D" & i).Value) Like LCase("*almacen*")) Then        
MsgBox "..."     
End If                                             
Next
End With

Perdona, mi error. Debería ser "AND" en esta parte:

(Not LCase(a(i, 4)) Like LCase("*almacén*") And _
       Not LCase(a(i, 4)) Like LCase("*almacen*")) Then

Prueba el desempeño de lo siguiente:

Sub Macro1()
  Dim a As Variant, b As Variant
  Dim i As Long, cad As String
  '
  With Worksheets("INVENTARIO")
    a = .Range("A2:D" & .Range("A" & Rows.Count).End(3).Row).Value2
  End With
  '
  For i = 2 To UBound(a, 1)
    If a(i, 1) = "Referencia 23" And _
      (Not LCase(a(i, 4)) Like LCase("*almacén*") And _
       Not LCase(a(i, 4)) Like LCase("*almacen*")) Then
       cad = cad & " fila " & i & vbTab & a(i, 4) & vbCr
    End If
  Next
  '
  MsgBox cad
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas