Recherche à partir de bases de données

Bonjour à tous,

Je vous demande votre aide concernant une tâche qui me faciliterai beaucoup la vie. J’ai des informations concernant des frigos ( hauteur, largeur, profondeur etc….) et je dois les mettre en relation avec des informations de conditionnement ( hauteur intérieur, largeur intérieur etc..) l’objectif étant que dès que je reçois une commande de frigo je peux en entrant les valeurs relatives au frigo avoir une proposition de conditionnement adéquat…. Que faire ?

En vous remerciant d’avance .

dnanga.

28frigo.xlsx (10.09 Ko)

Bonjour,

Ci-joint une proposition à tester, en VBA.

Principe (bouton violet) :

  • pour chaque frigo, pour chaque emballage, on regarde si ça rentre (hauteur, largeur, profondeur)
  • si un frigo tient dans plusieurs emballages, on retient l'emballage ayant le plus petit volume.

Bonne journée

Bouben

24frigo-v0-1.xlsm (17.79 Ko)

Bonjour Bouben,

merci pour ta réponse rapide !

c'est exactement ce que je cherchais cependant cela m'aiderais beaucoup si tu pouvais me détailler comment tu est arrivé à ce résultat histoire que je comprenne le processus et puisse le refaire dans d'autres cas

Merci !

Le code VBA est derrière le bouton violet.

  • on parcourt toutes les références (colonne C)
  • pour chaque référence, on parcourt tous les emballages (colonne H)
  • on teste si hauteur < hauteur, largeur < largeur, profondeur < profondeur
  • si c'est le cas, on calcule le volume de l'emballage (H*L*P), et on stocke le volume (dVolumeMin) et la référence (sRef)
  • si on trouve un autre emballage qui va, on teste si le volume est inférieur au volume trouvé précédemment, si c'est le cas, on stocke ce nouveau volume et cette nouvelle référence.
  • et on écrit la référence de l'emballage en face (colonne G)

Bouben

d'accord,

mais comment faire pour que maintenant pour que quand je rentre les données d'une nouvelle référence on me suggère tout de suite l'emballage idéal ?

dnanga.

En ajoutant une nouvelle ligne de référence (C, D, E, F) et en cliquant sur le bouton, l'emballage sera affiché en colonne G.

Tout marche très bien !!!

Je vous remercie.

Cependant ne comprenant pas très bien comment vous avez codé pouvez-vous m’expliquer comment vous avez codé ? car j’ai eu accès au code derrière le bouton et je ne comprends strictement rien:/

Dnanga.

tout est expliqué plus haut, que dire de plus

bouben a écrit :

Le code VBA est derrière le bouton violet.

- on parcourt toutes les références (colonne C)

Bonjour Dnanga,

Sans aller jusqu'à décrire tout le code de bouben, voici quelques explications :

1) La 1ère ligne Option Explicit est pour forcer la déclaration des variables, c'est-à-dire que la compilation

bloquera si elle « rencontre » une variable utilisée et qui n'a pas été déclarée avant explicitement.

2) Ce qui suit est pour créer la Sub MAJ() : le nom MAJ signifie Mise À Jour, mais tu peux l'appeler

autrement si tu préfères ; tout ce qu'il y a entre ces 2 lignes sont les instructions de la sub ;

remarque : sub est l'abréviation de subroutine : mot anglais signifiant sous-programme.

Public Sub MAJ()
End Sub

3) Les 7 premières lignes de la sub, qui commencent toutes par Dim, servent à déclarer des variables ;

un travail invisible sera exécuté : réserver de la place en mémoire pour le contenu des variables,

selon leur type.

4) L'instruction suivante sert à mettre dans iDerLig le n° de la dernière ligne utilisée, selon la colonne C.

iDerLig = Range("C" & Rows.Count).End(xlUp).Row

Tu peux donc décrypter toi-même l'instruction qui suit ; ... eh oui, cette fois, c'est selon la colonne H.

5) Ensuite, il y a 2 boucles For .. Next ; plusieurs tests If .. Then ; un If .. Then .. Else .. End If ;

les autres instructions sont simples à comprendre ➯ je ne détaille pas plus : si besoin,

regarde les Cours VBA de ce site, ou fais une recherche Google de ton choix.

Cordialement

Bonjour dnanga

Une autre méthode (légèrement plus "pédagogique")

Dim tabFrigo()
Dim tabKrton()
Dim tabEmbal()

Sub Emballer()
Dim cptFrigo
Dim tpsDebut

    tpsDebut = Timer

    tabFrigo = Range(Cells(3, 3), Cells(Cells(Rows.Count, 3).End(xlUp).Row, 6))
    tabKrton = Range(Cells(3, 8), Cells(Cells(Rows.Count, 8).End(xlUp).Row, 11))
    ReDim tabEmbal(1 To UBound(tabFrigo, 1), 1 To 1)

    For cptFrigo = 1 To UBound(tabFrigo, 1)
        tabEmbal(cptFrigo, 1) = BonCarton(cptFrigo)
    Next

    Cells(3, 7).Resize(UBound(tabEmbal, 1), 1) = tabEmbal

    MsgBox Timer - tpsDebut

End Sub

Function BonCarton(quelFrigo)
Dim cptKrton
Dim trvKrton As Boolean

    trvKrton = False
    cptKrton = 1
    While Not (cptKrton > UBound(tabKrton, 1)) And Not trvKrton
        If _
            (DimHaut(tabFrigo, quelFrigo) < DimHaut(tabKrton, cptKrton)) And _
            (DimLarg(tabFrigo, quelFrigo) < DimLarg(tabKrton, cptKrton)) And _
            (DimProf(tabFrigo, quelFrigo) < DimProf(tabKrton, cptKrton)) _
        Then
            trvKrton = True
        Else
            cptKrton = cptKrton + 1
        End If
    Wend

    If trvKrton Then
        BonCarton = tabKrton(cptKrton, 1)
    Else
        BonCarton = "Aucun"
    End If

End Function

Function DimHaut(quoi, lequel)
    DimHaut = quoi(lequel, 2)
End Function

Function DimLarg(quoi, lequel)
    DimLarg = quoi(lequel, 3)
End Function

Function DimProf(quoi, lequel)
    DimProf = quoi(lequel, 4)
End Function

@bouben

et légèrement plus rapide

MAJ = 5 sec.

Emabller = 0.5 sec

@dhany

Tu peux expliquer stp

Bonjour (..)

Dans la logistique il faut que ça débite

@bouben

Un test avec l'arrivée d'un semi-remorque de 500 frigos pour le même potentiel de cartons

MAJ = 338 sec (soit 5 min 38 sec)

Emballer = 0.6 sec

Bonjour NCC 1701,

Ah ça, y'a aucun doute ! ton code VBA avec utilisation de tableaux est ultra-rapide !!!

C'est en même temps plus technique, et dnanga risquera d'avoir du mal à te suivre !

mais as-tu remarqué que les résultats de ta sub ne sont pas les mêmes qu'avant ?

Méthode 1 : E5, E1, E5, E10, aucun, E5, E3, aucun, E6, E5, E5

Méthode 2 : E5, E1, Aucun, E5, Aucun, E5, E3, Aucun, E5, E5, E5

alors à part l'initiale de Aucun qui est maintenant en majuscule,

quelle méthode retourne les meilleurs résultats ?

Cordialement

(..)

dhany a écrit :

Ah ça, y'a aucun doute ! ton code VBA avec utilisation de tableaux est ultra-rapide !!!

dhany a écrit :

C'est en même temps plus technique, et dnanga risquera d'avoir du mal à te suivre !

plus technique certes, mais je mets un point d'honneur à utiliser des variables "intuitives" et je trouve mon code relativement facile à lire même pour un novice.

Concernant

dhany a écrit :

mais as-tu remarqué que les résultats de ta sub ne sont pas les mêmes qu'avant ?

oui j'ai vu, je vais vérifier ça !

(..)

Vérifications faites, l'erreur est dans mon code

Je vais corriger ça avant que Dnanga s'en aperçoive, je compte sur toi pour garder cela entre nous

(..)

Vérifications faites...

capture 20171031 001

à droite ma méthode !

Tout compte fait pour le frigo 188x55x65 le carton qui convient est bien le mien (si nous considérons la taille des cartons hors-tout, cependant si il s'agit de la taille utile j'ai tort)

Concernant le frigo 160x40x67(en violet) là j'ai tort (pour ma défense je dirais plutôt que je n'optimise pas l'utilisation des cartons au mieux adapté - et ça en logistique j'avoue c'est pas bien)

Mais attendons de voir ce qu'en pense dnanga

(..)

Re Vérification faite en optimisant l'utilisation des cartons le résultat est plus proche de celui de bouben

capture 20171031 002

Reste à vérifier les dimensions "utile" / "hors-tout" des cartons

Réponse pour ton avant-dernier message :

a) Entendu, je garde ce que tu sais entre nous : « motus et bouche cousue », comme disent les 2 policiers Dupont et Dupond.

mais t'as vu : j'ai l'œil, hein, pour avoir bien détecté les différences de résultat.

b) J'ai beaucoup aimé ta comparaison des 2 méthodes, avec tes commentaires bien détaillés.


Réponse pour ton dernier message :

Idem b) ci-dessus ; et bravo pour ta méthodologie et ta persévérance ! alors bonne chance pour la suite :

la vérification des dimensions "utile" / "hors-tout" des cartons ; je te laisse travailler sur ça : rdi2:

(..)

@dhany

dhany a écrit :

a) Entendu, je garde ce que tu sais entre nous : « motus et bouche cousue », comme disent les 2 policiers Dupont et Dupond. mais t'as vu : j'ai l'œil, hein, pour avoir bien détecté les différences de résultat.

Merci
dhany a écrit :

b) J'ai beaucoup aimé ta comparaison des 2 méthodes, avec tes commentaires bien détaillés.

Merci
dhany a écrit :

Idem b) ci-dessus ; et bravo pour ta méthodologie et ta persévérance !

Merci Normal !

Attendons la réaction de dnanga ...

@NCC 1701 @dhany

merci de m'avoir apporté votre aide j'y vois en effet un peu plus claire.

je n'ai malgrès tout pas réussi à reproduire l'opération à plus grande échelle puis je vous donner le grand tableau que j'ai et que je n'arrive pas a programmer ?

Oui, bien sûr, tu peux joindre ton fichier Excel avec ton grand tableau, mais sans données confidentielles ;

comme la logistique n'est pas mon rayon, je laisse à NCC 1701 ou bouben le soin de t'aider davantage.

Bonjour

dhany a écrit :

Oui, bien sûr, tu peux joindre ton fichier Excel avec ton grand tableau, mais sans données confidentielles.Comme la logistique n'est pas mon rayon, je laisse le soin à NCC 1701 ou bouben de t'aider davantage.

que d'eloges
dnanga a écrit :

je n'ai malgrès tout pas réussi à reproduire l'opération à plus grande échelle puis je vous donner le grand tableau que j'ai et que je n'arrive pas a programmer

Of Course (Evidemment) même en MP si tu n'arrives pas à anonymiser ton fichier...
Rechercher des sujets similaires à "recherche partir bases donnees"