Necesito juntar campos que cumplan un criterio

Estimados haber si alguien me puede ayudar, tengo una tabla dinámica en excel con varios productos donde cada uno tiene un volumen y me gustaría ver si alguien tiene las habilidades para crear un script o un macro donde este me junte los productos que cumplen con un criterio Volumen Max sin que se repitan.

Producto VOLUMEN MT3
00001 0,89
00002 0,91
00003 1,08
00004 0,45
00005 1,17
00008 0,35
00009 0,49
00010 1,60
00011 1,36
00012 1,28
00014 1,01
00015 1,54
00016 0,35
00017 1,33
00018 1,17
00019 0,43
00020 1,10
00023 0,35
00024 1,36
00025 0,35
00026 0,35
00027 1,36
00028 0,45
00029 1,14
00030 0,35
00031 0,89
00032 1,12
00046 0,35
00052 0,54
00053 0,43
00058 0,26
00060 0,35

Volumen Máximo 1,86

Ejemplo producto 00001 y 00002 deberían ir juntos ya que cumplen y suman 1,8,

En el script ya no debería considerar estos 2 productos para los demás por que ya están juntos

1 Respuesta

Respuesta

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

hola copie la macro tal cual y copie la tabla como valor a una hoja nueva en celda a1 y el resultado es tal como lo muestra la imagen. el primer valor que arroja esta correcto pero solo deja uno solo.

cual seria el problema?

Este es el archivo de la macro descárgalo

https://1drv.ms/x/s!Aqt18sdMf2xXiSAv0NGKljzyrfe0

Estimado me funciono de maravilla eres un genio,

Sin ser una molestia te podría pedir otro favor si no es muy complicado, quisiera que el macro agrupara más de 2 productos máximo 4 si se puede, por ejemplo el producto 60 se puede agrupar con los de la ultima fila

Lo que pides implica cambiar la programación he estado haciendo varios modelos de simulación con números aleatorios para 10,000 cargas y en todos los casos no da para 4 productos lo mucho son 3, ya que quedan 1 o 5 productos máximo que forman una carga optimizada de 3 productos, lo que estos modelos me hicieron ver es que hay un problema cuando la diferencia de carga es menor que la carga mínima por ejemplo si tienen un volumen 1 de 1.85 y la resta es de 1.86-1.85 =. 01 y la carga más pequeña del listado es de .35 entonces esta carga se enviara a la lista 2 y no a lista 1, no se cuantos datos generas en un día normal de trabajo o si tienes un ejemplo de cuantos datos que se pueden poner en la lista 1 para optimizar la carga con 4 productos, si lo tienes súbelo para verlo mientras le haré unos arreglos a la macro para que cuando se presenten cargas iguales a 1.86 las envíe a la lista 1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas