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
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
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
¿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
Hola genio te envie el archivo, porque quiero que las que no cumplen con la condicion queden como estan.
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
muchisimas gracias por tu tiempo brindado, sos un genio.....