** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Función O,
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Función O,

 Responder Responder
Autor
Mensaje
kazu Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 30/Julio/2013
Localización: Venezuela
Estado: Sin conexión
Puntos: 8
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita kazu Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Función O,
    Enviado: 06/Julio/2017 a las 23:27
Hola, agradecería su ayuda en lo siguiente.
Como puedo resumir la función O, cuando tengo muchos valores.
Ej o (H3=4;H3=8;He"Pago"....; etc.
Hay alguna manera de resumir esto?
Gracias
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9736
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Julio/2017 a las 23:50
¿Esto?




P.D. Perdón, esto es Excel, creí que era Access.Confused


Editado por Mihura - 07/Julio/2017 a las 12:29
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Julio/2017 a las 12:24

Otra idea (sin código) para cuando los  «O» sean muchos, es utilizar la mejor memoria de Excel: Las celdas (rango auxiliar).


     =SI(ESERROR(COINCIDIR(H3;$DA$1:$DA$20;0));"";"el dato existe")


Donde:

-  [H3]  Valor a consultar con los criterios (misma celda que en la consulta).

-  [$DA$1:$DA$20]  Rango auxiliar de celdas con todos los criterios (en este caso 20, pero podrían ser miles).

-  ;"el dato existe" deberá ser sustituido por: el resultado que se pretende si [H3] cumple con (al menos) uno de los criterios.




Editado por AnSanVal - 07/Julio/2017 a las 12:25
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Julio/2017 a las 13:07
«P.D. Perdón, esto es Excel, creí que era Access

La mayor parte del código VBA de Access es válido para Excel, aunque no todo, por ejemplo Nz(Valor). No he probado si una matriz se puede utilizar como parámetro en la llamada a la función, pero (en caso que no) se podría sustituir por un rango.



Editado: Esto pasa por ser multitarea a los que no tenemos esa capacidad no nos pasa. Wink



Editado por AnSanVal - 07/Julio/2017 a las 13:15
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Julio/2017 a las 18:13

¡Si!  ¡Excel también admite matrices en la llamada a la función!. ¡Una más aprendida! (poco a poco).  ¡Gracias Jesús!


Código revisado, adaptado para Excel y comprobado el funcionamiento.


Fórmula:   =SI(RT_IF_OR(H3;"<5";7;"15-20";">100");"Cumple la condición.";"No cumple la condición.")


Código adaptado:

'---------------------------------------------------------------------------------------------

' Autor : JESUS MANSILLA CASTELLS -Mihura-

'---------------------------------------------------------------------------------------------

Function RT_IF_OR(Valor As Variant, ParamArray Xcon()) As Boolean

  Dim ValorC1 As Variant, ValorC2 As Variant, i As Integer

  RT_IF_OR = False

  For i = 0 To UBound(Xcon)

    ValorC1 = Xcon(i): If Len(ValorC1) > 1 Then ValorC1 = Trim$(ValorC1)

' si es <

    If Left$(ValorC1, 1) = "<" Then

      If IsNumeric(Valor) Then ValorC1 = Val(Mid$(ValorC1, 2)) Else ValorC1 = Mid$(ValorC1, 2)

      If Valor < ValorC1 Then RT_IF_OR = True: Exit Function

' si es >

    ElseIf Left$(ValorC1, 1) = ">" Then

      If IsNumeric(Valor) Then ValorC1 = Val(Mid$(ValorC1, 2)) Else ValorC1 = Mid$(ValorC1, 2)

      If Valor > ValorC1 Then RT_IF_OR = True: Exit Function

' si contiene un - desde/hasta

    ElseIf InStr(1, ValorC1, "-") > 0 Then

      If IsNumeric(Valor) Then

        ValorC2 = Val(Mid$(ValorC1, InStr(1, ValorC1, "-") + 1))

        ValorC1 = Val(Left$(ValorC1, InStr(1, ValorC1, "-") - 1))

      Else

        ValorC2 = Mid$(ValorC1, InStr(1, ValorC1, "-") + 1)

        ValorC1 = Left$(ValorC1, InStr(1, ValorC1, "-") - 1)

      End If

      If Valor >= ValorC1 And Valor <= ValorC2 Then RT_IF_OR = True: Exit Function

' compara el valor pasado

    Else

      If IsNumeric(Valor) Then ValorC1 = Val(ValorC1)

      If Valor = ValorC1 Then RT_IF_OR = True: Exit Function

    End If

  Next i

End Function



Nota: También funciona con textos. Al igual que los números, en el caso «desde-hasta» desde debe ser menor que hasta





Editado por AnSanVal - 07/Julio/2017 a las 18:18
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9736
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Julio/2017 a las 18:22
Gracias a ti apañero .... Wink


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
lalo1956 Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 08/Marzo/2005
Localización: Mexico
Estado: Sin conexión
Puntos: 920
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lalo1956 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Julio/2017 a las 23:54
Smile Clap Thumbs Up
Quien no vive para servir, no sirve para vivir!** AYUDA A MANTENER EL FORO **
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Julio/2017 a las 14:54

He detectado que falla con textos. Por ejemplo al evaluar con la fórmula...

=SI(RT_IF_OR(A2;"<3";5;"7-9";">12";"c-m");"Cumple criterio.";"No cumple criterio.")

... sobre el texto algo  o el texto toro, devuelve cumple criterio a pesar de que están fuera del rango "c-m".


La razón es que al evaluar ">12", interpreta que algo y toro son mayores que "12".


Efectivamente: «a» (código 97) y «t» (código 116) son mayores que «1» (código 49).



He modificado así:


Function RT_IF_OR(Valor As Variant, ParamArray Xcon()) As Boolean

' ———————————————————————————————————————————————————————————————————————————————————————

' Idea original para Access: JESUS MANSILLA CASTELLS (Mihura).         º   º º º       /

' http://www.accessaplicaciones.com/ejemplos.html#rt01                / \ º     \     /

' Opciones (núm.): "<3", "<=3", 5 (o "5"), "7-12", ">=21", ">70"     /   \ º º º \   /

' Opciones (texto): "<Berta", "Rosa", "José-Pedro",... etc.         /     \     º \ /

' Adaptado para Excel: Julio de 2017.                              /       º º º   º

' ———————————————————————————————————————————————————————————————————————————————————————

  Dim ValorC1 As Variant, ValorC2 As Variant, i As Integer

  RT_IF_OR = False

  For i = 0 To UBound(Xcon)

    ValorC1 = Xcon(i): If Len(ValorC1) > 1 Then ValorC1 = Trim$(ValorC1)

'Si es < o <= (<> no tendría sentido en un «O» múltiple).

    If Left$(ValorC1, 1) = "<" Then

      Select Case Mid(ValorC1, 2, 1)

'Si «Valor» es menor o igual.

        Case "="

          If IsNumeric(Valor) Or IsDate(Valor) Then ValorC1 = Val(Mid$(ValorC1, 3)) Else ValorC1 = Mid$(ValorC1, 3)

          If Valor <= ValorC1 Then RT_IF_OR = True: Exit Function

'Si «Valor» es menor.

        Case Else

          If IsNumeric(Valor) Or IsDate(Valor) Then ValorC1 = Val(Mid$(ValorC1, 2)) Else ValorC1 = Mid$(ValorC1, 2)

          If Valor < ValorC1 Then RT_IF_OR = True: Exit Function

      End Select

' si es > o >=.

    ElseIf Left$(ValorC1, 1) = ">" Then

      Select Case Mid(ValorC1, 2, 1)

'Si «Valor» es mayor o igual.

        Case "="

          If IsNumeric(Valor) Or IsDate(Valor) Then

            If Asc(Mid$(ValorC1, 3, 1)) < 58 Then

              ValorC1 = Val(Mid$(ValorC1, 3))

            Else

              ValorC1 = Valor * 2

            End If

          Else

            If Asc(Mid$(ValorC1, 3, 1)) < 58 Then

            ValorC1 = "zzñ"

            Else

              ValorC1 = Mid$(ValorC1, 3)

            End If

          End If

          If Valor >= ValorC1 Then RT_IF_OR = True: Exit Function

'Si «Valor» es mayor.

        Case Else

          If IsNumeric(Valor) Or IsDate(Valor) Then ValorC1 = Val(Mid$(ValorC1, 3)) Else ValorC1 = Mid$(ValorC1, 3)

          If Valor > ValorC1 Then RT_IF_OR = True: Exit Function

      End Select

'Si contiene un «-»  desde/hasta

    ElseIf InStr(1, ValorC1, "-") > 0 Then

      If IsNumeric(Valor) Or IsDate(Valor) Then

        ValorC2 = Val(Mid$(ValorC1, InStr(1, ValorC1, "-") + 1))

        ValorC1 = Val(Left$(ValorC1, InStr(1, ValorC1, "-") - 1))

      Else

        ValorC2 = Mid$(ValorC1, InStr(1, ValorC1, "-") + 1)

        ValorC1 = Left$(ValorC1, InStr(1, ValorC1, "-") - 1)

      End If

      If Valor >= ValorC1 And Valor <= ValorC2 Then RT_IF_OR = True: Exit Function

'Igual.

    Else

      If IsNumeric(Valor) Or IsDate(Valor) Then
        If Asc(ValorC1) < 58 Then
          ValorC1 = Val(ValorC1)
          Valor = Val(Valor)
        End If
      End If
      If Valor = ValorC1 Then RT_IF_OR = True: Exit Function

    End If

  Next i

End Function ' RT_IF_OR




- Añadí:  <=  y  >=  (incluir <> no le veo sentido con múltiples «O»).




Editado por AnSanVal - 11/Julio/2017 a las 21:23
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
kazu Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 30/Julio/2013
Localización: Venezuela
Estado: Sin conexión
Puntos: 8
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita kazu Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Julio/2017 a las 17:58
Hola, gracias por las respuestas, ha sido muy interesantes.
Sin embargo, mi punto es algo diferente.
Tengo una lista de valores/códigos que debo ingresar en la columna H. En la columna I, un número, que corresponde a las unidades vendidas. De manera que, la fórmula que tengo en la columna L es la siguiente:

=Si (O(H3="TRT";H3="3/4";H3="VPQ";H3="MME";H3="PAG";H3="265");I3;0)

Lo que deseo es resumir la instrucción O y que pueda decir "Si(H3 es igual a alguno de los códigos;I3;0). Pues, a veces debo construir la fórmula con hasta 20 "valores" y se vuelve difícil detectar que falta o donde se ha producido un error.

Ofrezco una disculpa si no supe plantear bien mi inquietud desde el comienzo.

Gracias
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Julio/2017 a las 21:14

«... que pueda decir "Si(H3 es igual a alguno de los códigos;I3;0)...»


Eso es lo que te hemos ofrecido.


Si no basta con darte la solución cocida y en el plato...


... La masticaré un poco:


--------------------------------------------------------------------------


Para mi primer Aporte (sin código VBA):

- Aplica formato de TEXTO a las celdas [DA1:DA20].

- [DA1]   TRT

- [DA2]   3/4

- [DA3]   VPQ

- [DA4]   MME

- [DA5]   PAG

- [DA6]   265


Fórmula en [L3]:  =SI(ESERROR(COINCIDIR(H3;$DA$1:$DA$20;0));0;I3)


---------------------------------------------------------------------------------


Con la UDF (código VBA) en un módulo ordinario.


En vez de utilizar esta fórmula...


[L3]   =Si (O(H3="TRT";H3="3/4";H3="VPQ";H3="MME";H3="PAG";H3="265");I3;0)


... utiliza esta otra:


[L3]   =SI(RT_IF_OR(H3;"TRT";"3/4";"VPQ";"MME";"PAG";"265");I3;0)





Editado por AnSanVal - 11/Julio/2017 a las 21:30
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable