Saltar al contenido

Recommended Posts

publicado

Hola mis amigos, como se encuentran,

Antes que nada, gracias por tomarte el tiempo de leer mi situación.

Tengo una tabla en donde se surte mercancía, el detalle esta:  Como son varios pedidos entonces, es donde se me complica un poco, a veces el cliente me pide cierta cantidad de mercancía, como no es el único, entonces quiero ver la posibilidad de mejorar este proceso, me gustaría ver si hay la posibilidad de combinar estas dos opciones, en donde si mi stock de acuerdo al pedido no cumple, entonces que surte a ciertos clientes, y la otra opción sería si de mi stock no cumple entonces que me distribuye en partes iguales la mercancía.

Adjunto un archivo de ejemplo para mejor apreciación.

De antemano, muchas gracias.

SURTIDO DE MERCANCIAS.xlsx

  • 1 month later...
publicado
En 17/4/2025 at 11:17 , JSDJSD dijo:

Podrías compartir tu solucion

@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

Conéctate para comentar

Podrás dejar un comentario después de conectarte



Conéctate ahora
  • 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

    • @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 
    • Podrías compartir tu solucion
    • Alguien me apoya a cerrar este tema,  ya lo solucioné 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.