Lo que estas pidiendo es un algoritmo carnívoro como el que se usa para resolver como dar el cambio de 3 moneda, ve la imagen, como no solo dices que los datos los sacas de una tabla dinámica lo único que tienes que hacer es copiar dicha tabla a una hoja nueva y pegarla como valor en la celda A1 como ves en la imagen y la macro compara el valor máximo y el mínimo de ser iguales a 1.86 los copiara a la columna F, de no ser así buscara el valor próximo más cercano y en caso de que el valor sobrepase 1.86 o la diferencia de restar 1.86 al valor máximo sea menor al valor mínimo descartara ese alor y lo enviara a la celda F, en ambos casos los valores movidos no serán tomados en cuenta para la siguiente búsqueda, y cuando quede un solo valor en los datos la macro terminara quedándote lo que ves en la imagen, otra manera de hacerlo es a través de la simulación de montecarlo solo que lleva más códigoy esta es la macro
Option Base 1
Sub ejecuta()
Range("f:z").Clear
f = Range("a1").CurrentRegion.Rows.Count - 1
For i = 1 To f
analizar_datos
Next i
End Sub
Sub analizar_datos()
filas = Range("a1").CurrentRegion.Rows.Count - 1
If filas = 0 Then End
Dim funcion As WorksheetFunction
Set funcion = WorksheetFunction
Set datos = Range("a2").Resize(filas, 3)
With datos
.Columns(3) = 2
If filas = 1 Then GoTo quita:
.Sort key1:=Range(.Columns(2).Address), order1:=xlDescending
promedio = funcion.Average(.Columns(2))
minimo = funcion.Min(.Columns(2))
maximo = funcion.Max(.Columns(2))
producto = .Cells(1, 1)
volumen = .Cells(1, 2)
vtotal = volumen + minimo
ReDim matriz(1, 5)
If vtotal <= 1.86 Then
vdif = 1.86 - volumen
If vdif > maximo Then vdif = maximo
indice = funcion.Match(vdif, .Columns(2), -1)
If indice = 1 Then indice = indice + 1
atras:
producto2 = .Cells(indice, 1)
volumen2 = .Cells(indice, 2)
vtotal = volumen2 + volumen
If vtotal > 1.86 Then indice = indice + 1: GoTo atras
matriz(1, 1) = producto
matriz(1, 2) = producto2
matriz(1, 3) = volumen
matriz(1, 4) = volumen2
matriz(1, 5) = vtotal
filas2 = .Columns(6).CurrentRegion.Rows.Count
.Cells(filas2 + 1, 6).Resize(1, 5) = matriz
.Cells(1, 3) = "X"
.Cells(indice, 3) = "X"
Else
quita:
.Rows(1).Copy
fil = .Columns(13).CurrentRegion.Rows.Count
.Cells(fil + 1, 13).Resize(1, 2).PasteSpecial xlValues
.Cells(1, 3) = "X"
End If
.Sort key1:=Range(.Columns(3).Address), order1:=xlAscending
cuenta = funcion.CountIf(.Columns(3), "X")
indice = funcion.Match("X", .Columns(3), 0)
.Rows(indice).Resize(cuenta, 3).Clear
End With
End Sub