Saltar al contenido

Duda sobre la función COINCIDIR


garbage

Recommended Posts

publicado

¡Hola foreros!

He estado haciendo un test de Excel y me ha salido la siguiente pregunta:

Cita

Si aplicamos la fórmula =COINCIDIR(150000;C9:C14;-1) a la celda C15 de la "Hoja Excel 2" del Anexo de Excel, ¿cuál será el valor de la celda C15?

En las celdas C9:C14 aparecen los siguientes números:

312.042

331.441

192.703

141.239

33.289

2,27

Las posibles respuestas eran a) 2 b) 3 c) 4 d) Devuelve un resultado erróneo.

Yo contesté la D), porque según la Ayuda de Excel para esta función, si en el tercer argumento aparece -1 , los valores que aparecen en el segundo argumento de la función tienen que estar ordenados en orden  descendente (en este caso, de mayor a menor), cosa que no ocurre en este caso. De hecho, en el ejemplo que aparece en la Ayuda de Excel, aparece que al poner -1 y el rango de números que aparecen en él al no estar colocados en orden descendente, provoca un error del tipo #N/A.

Pues bien, cuál es mi sorpresa cuando veo el resultado y dan como correcta la respuesta B (3). Pruebo a hacerlo en el ordenador y, efectivamente, como resultado da 3, lo cual se contradice, en mi opinión, con el funcionamiento esperado de la función según aparece en la Ayuda de Excel.

¿Alguién me lo podría aclarar?

Gracias!!

publicado

Hola

Los números "sí" están ordenados de mayor a menor, es decir, en descendente.

La función COINCIDIR busca un elemento determinado en un intervalo de celdas y después devuelve la posición relativa de dicho elemento en el rango.

Cuando el tercer argumento es -1 y los número están ordenados de forma descendente, encuentra el número más pequeño que es mayor o igual al valor buscado, en este caso 150000 y el número encontrado que cumple la condición  es 192703, que es el número más pequeño de la lista que es mayor que 150000 y como está en la posición 3, que es su posición relativa en la lista, es lo que devuelve COINCIDIR.

image.png.59b8260c86384ed60903c753bc3b899e.png

Función COINCIDIR (microsoft.com)

 

Saludos

publicado

Gracias por responder, pero los números no están ordenados de forma descendente. Si así fuera, primero aparecería el 331.441 y luego el 312.042, no al revés, que es como aparece en la pregunta del test. De ahí mi duda....

Saludos.

publicado

Hola,

tienes razón, los números no están totalmente ordenados. Lo siento.

Parece ser que la función COINCIDIR fue diseñada para alta velocidad, da por supuesto que el rango que le pasas está ordenado excepto cuando el tercer argumento es 0 (cero) que puede estar en cualquier orden.

Aunque a veces da un resultado no es garantía de que sea correcto, pues a veces con el mismo rango de valores en otro orden da un error.

Nos puede parecer un comportamiento inconsistente y podríamos esperar que si no está ordenado el rango diera un error, pero eso requiere tiempo de cálculo para decidir si el rango está ordenado o no, así que lo da por supuesto o esa es la condición  que impone la función según la Ayuda para su correcto funcionamiento.

Si sí lo está, ascendente o descendente, en coherencia con el el tercer parámetro pasado, el resultado que da COINCIDIR es correcto, si no lo está puede dar un error o un valor, según el algoritmo interno de búsqueda binaria que utiliza le dé un error (interno) o resultado, así lo mostrará como #N/D o resultado engañoso (aunque a primera vista nos parezca correcto o sorprendente (porque no lo entendemos) porque no estamos viendo un error).

image.thumb.png.aa15538c398449db48d05c03fffda55e.png

 

Entonces si esto es cierto, llegamos a la conclusión de que, quien puso el test, cayo en el mismo error dando por supuesto cierto comportamiento.

Saludos

 

publicado

Entonces, lo que aparece en la Ayuda de Excel sobre esta función no es del todo cierto, ya que si los datos no están ordenados en orden descendente (en el caso de utilizar el parámetro -1 como tercer argumento), la función no siempre devolverá #N/A, sino que lo hará de forma "aleatoria", dependiendo también de cómo estén situados el resto de valores del rango de datos, ¿no?

Gracias y un saludo.

publicado

Hola.

Correcto.

La nueva función que sustituye a COINCIDIR (MATCH) es COINCIDIRX (XMATCH) a la que le han añadido un 4 parámetro para que decidas tú si quieres la búsqueda binaria o no y que advieten que si los datos no están ordenados los resultados devueltos no serán válidos.

XMATCH function (microsoft.com)

image.thumb.png.69dff5079309a6bd7ad080c9f8676b50.png

Saludos

publicado

Hola a ambos

Vaya que curioso el caso, lo que si pude detectar o descubrir es que mientras existan en el rango [ordenado o no], valores mayores o igual al buscado en la parte superior, COINCIDIR no dará un error

 

Saludos 

publicado

Por si alguno le interesa... (hablando de tercer parámetro "-1")

Excel evalúa el "ordenamiento" del rango comparando el primer y ultimo valor. Según esos valores, determina si el rango esta ordenado o no y a partir de ahí, hace cosas que están bien, o calcula mal.

image.thumb.png.5a77e304b28eed7aa260168fb4e42ce8.png

En el ejemplo 1 lo hace bien por definición. Rango mal ordenado (debería ser ZA) y devuelve #N/D.

En el ejemplo 2 lo hace bien por definición. Rango ordenado ZA y devuelve la pos, correcta.

En el ejemplo 3 aunque piensa que el rango esta bien ordenado (ZA) el resto de números no lo esta, y devuelve una pos. errónea.

En el ejemplo 4 cuatro vuelve a pensar que el rango esta bien ordenado (ZA) y como va contra def, arroja error #N/A

 

  • 1 month later...

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.