sentencia if or y

7 envíos / 0 nuevos
Último envío
tato25
Imagen de tato25
Offline
última acción: Hace 5 años 3 meses
alta: 16/11/2018 - 20:07
Puntos: 100
sentencia if or y

Buenos dias necesitaria que alguien me corrobore porque no me hace la sentencias if or y cuando se cumple la condicion seguramente debbo tener mal la sintaxis, un tema anterior me lo habian resuelto pero ahora tengo mas condiciones y se me complico aca dejo el codigo

Sub cambiargrupo()

'Declaraciones de vaiable

 

Dim Final As Long

Dim grupo As String

Dim marca As String

Dim sucursal As String

Dim iniciofila As Long

'Me posiciono en la fila ultima

Final = Sheets("Hoja1").Range("A" & Rows.Count).End(xlUp).Row

'Recorro los registros

  For iniciofila = 2 To Final

   'Aca obtengo los valores de las celda

   

   sucursal = Sheets("hoja1").Cells(iniciofila, 2)

   marca = Sheets("hoja1").Cells(iniciofila, 3)

      ' Aca comparo los valoes de las variables

   If (sucursal = "Sucu17") Or (sucursal = "Sucu19") Or (sucursal = "Sucu21") Or (sucursal = "Sucu25") Or (sucursal = "Sucu58") Or (sucursal = "Sucu64") Or (sucursal = "Sucu75") Or (sucursal = "Sucu81") Or (sucursal = "Sucu89") Or (sucursal = "Sucu93") And (marca = "ADIDAS") Then

     ' Aca quiero cambiar el valor de la celda si se cumple la concion

     'pero no lo realiza al pa

       grupo = "Cuenta P"

       Sheets("hoja1").Cells(iniciofila, 1) = grupo

   Else

    

      If (sucursal = "Sucu12") Or (sucursal = "Sucu14") Or (sucursal = "Sucu15") Or (sucursal = "Sucu16") Or (sucursal = "Sucu18") Or (sucursal = "Sucu20") Or (sucursal = "Sucu23") Or (sucursal = "Sucu26") Or (sucursal = "Sucu33") Or (sucursal = "Sucu39") Or (sucursal = "Sucu43") Or (sucursal = "Sucu49") Or (sucursal = "Sucu52") Or (sucursal = "Sucu66") Or (sucursal = "Sucu91") Or (sucursal = "Sucu95") And (marca = "ADIDAS") Then

         grupo = "Cuenta Q"

         Sheets("hoja1").Cells(iniciofila, 1) = grupo

         Else

      

           If (sucursal = "Sucu14") Or (sucursal = "Sucu15") Or (sucursal = "Sucu17") Or (sucursal = "Sucu18") Or (sucursal = "Sucu23") Or (sucursal = "Sucu26") Or (sucursal = "Sucu43") Or (sucursal = "Sucu58") Or (sucursal = "Sucu66") Or (sucursal = "Sucu81") Or (sucursal = "Sucu95") And (marca = "NIKE") Then

              grupo = "BETTER"

              Sheets("hoja1").Cells(iniciofila, 1) = grupo

            Else

              If (sucursal = "Sucu12") Or (sucursal = "Sucu20") Or (sucursal = "Sucu33") Or (sucursal = "Sucu39") Or (sucursal = "Sucu52") And (marca = "NIKE") Then

                grupo = "EC"

                Sheets("hoja1").Cells(iniciofila, 1) = grupo

   

            Else

                If (sucursal = "Sucu16") Or (sucursal = "Sucu19") Or (sucursal = "Sucu21") Or (sucursal = "Sucu25") Or (sucursal = "Sucu49") Or (sucursal = "Sucu75") Or (sucursal = "Sucu89") Or (sucursal = "Sucu91") Or (sucursal = "Sucu93") And (marca = "NIKE") Then

         

                grupo = "GOOD"

                Sheets("hoja1").Cells(iniciofila, 1) = grupo

 

    End If

    End If

    End If

    End If

    End If

    

   Next iniciofila

  

  

End Sub

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Parece que quieres que se

Parece que quieres que se dispare si se da cualquiera de las sucursales y, además, la marca. Prueba a poner todas las sucursales (y sus OR correspondientes) entre paréntesis. Algo así como:

 If ((sucursal = "Sucu17") Or (sucursal = "Sucu19") Or (sucursal = "Sucu21") Or (sucursal = "Sucu25") Or (sucursal = "Sucu58") Or (sucursal = "Sucu64") Or (sucursal = "Sucu75") Or (sucursal = "Sucu81") Or (sucursal = "Sucu89") Or (sucursal = "Sucu93")) And (marca = "ADIDAS") Then

 

Un saludo

tato25
Imagen de tato25
Offline
última acción: Hace 5 años 3 meses
alta: 16/11/2018 - 20:07
Puntos: 100
Probe con los parentesis

Hola maestro: probe con los parentesis en encerrar los or me toma los valores de las variables sucursale y marca pero no me ejecuta el paso dentro de la setencia if cuando tiene los valores correspondientes, o sea le faltaria terminar la parte que toma el valor la variable grupo y la copie a la celda 

                 grupo = "GOOD"

                Sheets("hoja1").Cells(iniciofila, 1) = grupo

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
¿Tienes datos en la columna 1

¿Tienes datos en la columna 1? En mi prueba no los había, y al calcular Final, tiene valor 0. Por lo tanto, el bucle es desde 2 hasta 0, no se ejecuta ninguna vez y se termina la macro.

 

Por otro lado, no cubres todos los posibles casos (a menos que haya restricciones que desconozco) con todos los IF. Por ejemplo, ¿Qué pasa si es la sucursal 63 y ADIDAS? Como no tienes esa combinación, no hace nada más. Quizás deberías ponerle un ELSE que capture esta posibilidad, de manera que si hay un error en los datos te lo haga saber de alguna manera (escribir error en la columna A y tener un formato condicional que pinte la celda de rojo, por ejemplo)

 

Finalmente, respecto a la estructura te haría un par de anotaciones.

1- Existe la orden ELSEIF. Cuando tienes muchos IF anidados, queda más limpio. Sería algo así como:

IF blablabla THEN
    cosasquehacer1
ELSEIF blablabla2 THEN
    cosasquehacer2
ELSEIF blablabla3 THEN
.
.
.
ELSE
    cosasquehacersitodofalla
END IF

Como ves, nos ahorramos un montón de END IF y de indentado, y queda todo más limpio.

2- Yo dividiría los IF en dos partes: comparar marca y comparar sucursal. Algo así como:

IF marca = "ADIDAS" THEN
    IF ((sucursal = "Sucu17") Or ....... Or (sucursal = "Sucu93")) THEN
        grupo = "cuenta P"
    ELSEIF ((sucursal = "Sucu12") Or ...... Or (sucursal = "Sucu95")) THEN
        grupo = "cuenta Q"
    ELSE
        grupo = "Error, sucursal no disponible para ADIDAS"
    END IF
ELSEIF marca = "NIKE" THEN
    IF ((sucursal = "Sucu14") Or ....... Or (sucursal = "Sucu95")) THEN
        grupo = "BETTER"
    ELSEIF ((sucursal = "Sucu12") Or ...... Or (sucursal = "Sucu52")) THEN
        grupo = "EC"
    ELSEIF ((sucursal = "Sucu16") Or ...... Or (sucursal = "Sucu93")) THEN
        grupo = "GOOD"
    ELSE
        grupo = "Error, sucursal no disponible para NIKE"
    END IF
ELSE
    grupo = "Error, marca desconocida"
END IF
Sheets("hoja1").Cells(iniciofila, 1) = grupo


Como ves, queda mejor estructurado, y es más sencillo encontrar posibles fallos a la hora de programar.

Además, la asignación de valor a la celda la puedes hacer al final, pues tras pasar por todos los IF, la variable grupo solo puede tener un valor. No hace falta repetir la expresión dentro de cada opción.

Esto aún se puede optimizar un poco más sustituyendo los IF por SELECT CASE

SELECT CASE marca
CASE "ADIDAS"
    SELECT CASE sucursal
    CASE "Sucu17", "Sucu19", .... "Sucu93"
        grupo = "cuenta P"
    CASE "Sucu12", "Sucu14", ...... "Sucu95"
        grupo = "cuenta Q"
    CASE ELSE
        grupo = "Error, sucursal no disponible para ADIDAS"
    END SELECT
CASE "NIKE"
    SELECT CASE sucursal
    CASE "Sucu14", ....... "Sucu95"

        grupo = "BETTER"
    CASE "Sucu12", ...... ,"Sucu52"
        grupo = "EC"
    CASE "Sucu16", ...... "Sucu93"
        grupo = "GOOD"
    CASE ELSE
        grupo = "Error, sucursal no disponible para NIKE"
    END SELECT
CASE ELSE
    grupo = "Error, marca desconocida"
END SELECT
Sheets("hoja1").Cells(iniciofila, 1) = grupo

Como ves, queda mejor aún.

3- Cuando haces comparaciones de texto, las mayúsculas son importantes. Si en la celda pone "sucu93", cuando tú busques (sucursal = "Sucu93") te devolverá falso.


A falta de ver el archivo, espero haber dado en la diana con el problema que tienes.


Un saludo

tato25
Imagen de tato25
Offline
última acción: Hace 5 años 3 meses
alta: 16/11/2018 - 20:07
Puntos: 100
Te subo el archivo

Hola genio te envie el archivo, porque quiero que las que no cumplen con la condicion queden como estan.

AdjuntoTamaño
File prueba-macros.xlsm2.12 MB
Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Ok, ahora ya veo tu problema

Ok, ahora ya veo tu problema.

Cuando lee el valor de la celda de sucursal, resulta que lo que pone ahí no es "Sucu12", sino "Sucu12             "

Es decir, hay un montón de espacios detrás.

Hay varias maneras de solucionar esto, pero la más eficiente dado que ya tienes el código escrito es sustituir la línea:

sucursal = Sheets("hoja1").Cells(iniciofila, 2)

Por lo siguiente:

sucursal = trim(Sheets("hoja1").Cells(iniciofila, 2))

 

La función trim devuelve lo que le pases como parámetro, pero sin espacios al principio ni al final.

Una vez haces esto, ya tu código funciona bien.

 

Un saludo

tato25
Imagen de tato25
Offline
última acción: Hace 5 años 3 meses
alta: 16/11/2018 - 20:07
Puntos: 100
Agradecimiento

muchisimas gracias por tu tiempo brindado, sos un genio.....