AIDE VBA - Suivi d'entreposage et d'expédition

Bonjour,

Je débute en VBA et travail sur un dossier depuis maintenant 1 mois dans le but d'améliorer/d'optimiser mon système de gestion de plateforme d'entreposage et de suivi d’expédition.

Après lecture de la section "COURS VBA" et différentes recherches sur ce forum ou d'autre j'ai essayé de me lancer dans la programmation.

Je vous expose mon problème :

Actuellement je dispose de 3 fichiers (un classeur BASE_DONNEE, un classeur HISTO_EXPED et un classeur INVENTAIRE) qui n’interagissent aucunement les uns avec les autres (format des fichiers imposé par le client, je ne peux modifier la forme).

Lorsque qu'un colis est prêt pour être expédié, je reçois une fiche de remplissage de l'atelier producteur. Cette fiche regroupe toutes les informations relatives au colis.

A la réception de la fiche, je renseigne (classeur BASE_DONNEE / Feuille "Accueil") le tableau avec les informations puis j'ajoute par macro les nouvelles lignes à la suite de la base de données.

Jusque là ça va, mais après je tourne en rond et ne progresse plus.

Je souhaiterais d'abord savoir et comprendre comment remplir les fichiers HISTO et INVENTAIRE selon la Base de Données (j'arrive à copier/coller une ligne entière mais j'ai du mal avec des cellules définies).

Si quelqu'un peut venir m'apporter son aide je l'en remercie grandement.

Cordialement,

Bonjour et bienvenue sur le forum

Tu écris :

Je souhaiterais d'abord savoir et comprendre comment remplir les fichiers HISTO et INVENTAIRE selon la Base de Données (j'arrive à copier/coller une ligne entière mais j'ai du mal avec des cellules définies).

Commençons simple, dans un même classeur.

Supposons que tu veuilles copier des données de la dernière ligne de la feuille d’accueil du fichier ‘’BASE DE DONNEES’’ et les coller sur la feuille BD du même fichier.

C’est-à-dire

• la cellule A15 que tu veux coller à la cellule B42 de la feuille BD

• et la plage B15 : D15 que tu veux coller à partir de la cellule D42 de la feuille BD

Les instructions seront, en reprenant les éléments de ta macro ‘’EXPORT_BD’’ :

For Iac = 14 To 18 ' Iac avec "For" délimite le champ d'action de la macro
    Range("A" & Iac).Copy Sheets("BD").Range("B" & Ibd)
    Range("B" & Iac & ":D" & Iac).Copy Sheets("BD").Range("D" & Ibd)
…..

OK ?

Bye !

Bonjour,

Merci gmb d'avoir traité rapidement ma demande, je suis désolé mais je n'ai pu étudier ta réponse qu'hier soir.

J'ai donc pu revoir mes macros suite à ta réponse (voir fichiers joints), mes copier/coller fonctionnent parfaitement entre les trois classeurs (il y a peut être des erreurs, des faiblesses dans l'écriture de mon code)

Donc si j'ai bien compris, pour chaque "Range", on renseigne : ("Colonne" & "Ligne") qui dans mon cas renvoi à la variable "Iac" pour localiser la ligne ?

Pour finaliser mon projet sur le système, je souhaiterais pousser encore l'optimisation des classeurs.

Principalement sur la communication des classeurs entre-eux.

Ma problématique est-la suivante :

Lorsque que je renseigne une date de chargement pour un colis dans le fichier "HISTO.xlsm", le colis ne peut plus figurer dans le fichier "INVENTAIRE.xlsm" car il n'est physiquement plus entreposé et en attente d'expédition.

Est-il possible en VBA de faire communiquer les fichiers entre-eux afin que :

- Si une date de chargement est renseignée dans le fichier "HISTO.xlsm", est-il possible de supprimer automatiquement dans le fichier "BASE_DONNEE.xlsm" le bâtiment défini pour le colis (colonne T) pour qu'ensuite par une macro "Actualisation inventaire", supprimer les lignes dans le fichier "INVENTAIRE.xlsm" des colis qui ne sont plus enregistrés dans un bâtiment dans le fichier "BASE_DONNEE.xlsm".

Je souhaiterais dans un premier temps savoir si le système que je souhaite créer est possible à mettre en place et si oui, si vous pouviez me guider ou orienter mes recherches ?

J'ai actuellement fait plusieurs tests, avec ou sans VBA mais avec des (=SI(HISTO.xlsm!$I2="";"";"Chargé"). Cependant à l'utilisation je m'aperçois que si je filtre sur le fichier "HISTO.xlsm" le chargé n'est plus associé au bon colis dans la Base de Donnée.

Je continu à travailler sur la question et essaye de proposer qqch dans la journée.

Vous remerciant par avance de traiter ma question.

Cordialement,

Bonjour

Tu écris :

Donc si j'ai bien compris, pour chaque "Range", on renseigne : ("Colonne" & "Ligne") qui dans mon cas renvoi à la variable "Iac" pour localiser la ligne ?

Attention aux guillemets.

Si par exemple tu veux copier la cellule qui se trouve en colonne A et à la ligne définie par la valeur de la variable ln, tu as 3 façons d’écrire l’instruction :

1 –

Range(‘’A’’ & ln).copy

2 –

Cells(ln & ‘’A’’).copy

3 –

Cells(ln,1).copy

Est-il possible en VBA de faire communiquer les fichiers entre-eux …..

Je pense en effet que cela est possible.

….Je souhaiterais dans un premier temps savoir si le système que je souhaite créer est possible à mettre en place et si oui, si vous pouviez me guider

Pour partir de l’exemple des fichiers que tu as joint :

• Il y a une seule date dans le tableau de la feuille HISTO du fichier HISTO à la ligne2. Elle correspond en colonne A de la même ligne à CAB initial qui a l’air de ressembler à une référence unique qui va nous permettre de retrouver les enregistrements correspondant sur les autres fichiers.

• On met cette valeur dans une variable Ex cab ( qui vaudra donc ‘’AAA1’’)

• On recherche dans la feuille ‘’BD’’ du fichier ‘’BASE_DONNEES’’ la ligne où se trouve cette valeur ‘’AAA1’’ en colonne A

• On repère sur cette ligne s’il s’agit d’un BAT_F ou d’un BAT_C en mettant dans une variable la valeur de la lettre qu’on trouve en colonne T.

• On peut alors supprimer cette ligne

• On va ensuite dans le fichier ‘’INVENTAIRE’’ à la feuille BAT_F ou BAT_C et on cherche à quelle ligne dans la colonne A se trouve ‘’AAA1’’’

• On supprime cette ligne

Voilà, si j’ai bien compris ce qu’il faut faire, comment on peut s’y prendre.

A ta disposition si tu as encore besoin.

Bye !

Bonjour Gmb,

Une nouvelle fois désolé pour le délai de réponse mais je n'ai encore pu me pencher sur la réponse qu'hier soir.

Merci pour ces précisions sur l'écriture des instructions.

Suite à ta réponse d'hier et des recherches que j'ai faites, j'essaye de rédiger les codes.

Le résultat n'est pas au rendez-vous actuellement et je tourne en rond.

Petit point sur ce que j'ai fait :

D'abord un premier bouton "Synchro_BD" sur le fichier "HISTO.xlsm" qui aurait pour but :

1 - D'identifier et enclencher la maccro pour chaque ligne ayant une date de chargement renseignée dans la colonne I du fichier

2 - D'identifier la référence des CAB colis (colonne A) associées aux dates de chargement (colonne I) et les enregistrer dans une variable

3 - De retrouver les valeur de CAB colis dans le fichier "BASE_DONNEE.xlsm" feuille "BD"

4 - De supprimer dans la feuille BD, le contenu de la cellule (colonne T) pour les CAB colis identifiés précédemment"HISTO" :

Sub SYNCHRO_BD()

Dim Ihi As Long, Ibd As Long
Dim HISTO As Workbook, BASE As Workbook
Dim HI As Worksheet, BD As Worksheet
Dim CAB As Range, CAB_2 As Range
' Je défini mes variables

Set HISTO = ThisWorkbook
Set HI = HISTO.Worksheet("HISTO")
Set BASE = Workbooks.Open("Chemin + BASE_DONEE.xlsm")
Set BD = BASE.Worksheet("BD")

CAB = HI.Range("A" & Ihi).Value
CAB_2 = BD.Range("A" & Ibd).Value
CAB = CAB_2

Dligne = HI.Range("A" & Rows.Count).End(xlUp).Row
'J'identifie la dernière ligne renseignée sur la feuille "HISTO"

For Ihi = 2 To Dligne
'Le périmètre de la macro s'applique à partir de la ligne 2 jusqu'à la dernière ligne non vide
        If HI.Range("I" & Ihi).Value <> 0 Then
        'Si sur la feuille "HISTO" la valeur de la ligne (définie par variable Ihi) en colonne I est différente de 0
            BD.Range("T" & CAB).CearContents
            ' Supprimer la valeur de la colonne "Bât C/F" (T) dans la feuille BD
        End If
Next
End Sub

J'ai commencé à écrire ceci mais je t'avoue que j'ai du mal à saisir le fonctionnement pour rechercher la valeur cible en colonne A et l'enregistrer dans une variable.

Si tu peux m'orienter sur ce point je t'en remercie.

A partir de ce point je pense m'orienter vers un second bouton "Synchro_INV" sur la feuille "BD" du fichier "BASE_DONNEE" qui aurait pour but :

1 - D'ouvrir le fichier "INVENTAIRE.xlsm"

2 - De retrouver les CAB Colis concernés par les modifications dans le fichier "INVENTAIRE.xlsm"

3 - Pour les CAB colis dans le fichier "BASE_DONNEE" feuille "BD" n'ayant pas de batiment renseigné (colonne T vide)

Si le CAB colis apparait dans le fichier "INVENTAIRE.xlsm" feuille "BAT_C" ou "BAT_F", on supprime la ligne

Si le CAB colis n'apparait pas on ne fait rien

Sub SYNCHRO_BD()

Dim Ihi As Long, Ibd As Long
Dim HISTO As Workbook, BASE As Workbook
Dim HI As Worksheet, BD As Worksheet
Dim CAB As Range, CAB_2 As Range
' Je défini mes variables

Set HISTO = ThisWorkbook
Set HI = HISTO.Worksheet("HISTO")
Set BASE = Workbooks.Open("Chemin + BASE_DONEE.xlsm")
Set BD = BASE.Worksheet("BD")

CAB = HI.Range("A" & Ihi).Value
CAB_2 = BD.Range("A" & Ibd).Value
CAB = CAB_2

Dligne = HI.Range("A" & Rows.Count).End(xlUp).Row
'J'identifie la dernière ligne renseignée sur la feuille "HISTO"

For Ihi = 2 To Dligne
'Le périmètre de la macro s'applique à partir de la ligne 2 jusqu'à la dernière ligne non vide
        If HI.Range("I" & Ihi).Value <> 0 Then
        'Si sur la feuille "HISTO" la valeur de la ligne (définie par variable Ihi) en colonne I est différente de 0
            BD.Range("T" & CAB).CearContents
            ' Supprimer la valeur de la colonne "Bât C/F" (T) dans la feuille BD
        End If
Next
End Sub

Peux-tu m'apporter ton aide pour poursuivre l'écriture des codes des deux boutons ou m'orienter sur les pistes à suivre pour réussir ?

Par avance merci de traiter ma demande,

PS : Je m'excuse par avance des aberrations ou énormités que j'ai pu écrire...

Cordialement,

Bonjour

Voici ton code corrigé pour la première partie.

Juste une question : y a -t-il une raison pour faire deux macros ?

A te relire.

Bye !

Sub SYNCHRO_BD()

    Dim Ihi As Long, Ibd As Long
    Dim HISTO As Workbook, BASE As Workbook
    Dim HI As Worksheet, BD As Worksheet
    Dim CAB 'As Range, CAB_2 As Range       'cette variable sera le contenu d'une cellule donc
                                            'de type String

    Dim cell                                'Variable supplémentaire pour gmb (cellule)

    ' Je défini mes variables                   <-- Mais les 4 lignes précédentes étaient aussi des
                                                'déclarations de variables...
    Set HISTO = ThisWorkbook
    'Set HI = HISTO.Worksheet("HISTO")          'Erreur de synthaxe : il manque un "s" à Worksheet
    Set HI = HISTO.Worksheets("HISTO")

    Dim chemin                                  'Tu vas avoir besoin de cette variable ; il te
                                                'faut la déclarer

    chemin = ThisWorkbook.Path & "\" '          'et la définir.

    'Set BASE = Workbooks.Open("Chemin + BASE_DONEE.xlsm")      'Erreur de synthaxe (et d'orthographe...)
    Set BASE = Workbooks.Open(chemin & "BASE_DONNEE.xlsm")

    'Set BD = BASE.Worksheet("BD")              'Erreur de synthaxe : il manque un "s" à Worksheet
    Set BD = BASE.Worksheets("BD")

    'CAB = HI.Range("A" & Ihi).Value         'Ihi n'a pas été défini, on va droit au bug

    'C'est à partir de là qu'il faut passer toutes les lignes de la feuille ''HISTO'' et, si on y trouve
    'une date dans la colonne I, de noter dans une variable la valeur de la colonne A sur cette ligne.

    For Ihi = 2 To HI.Range("A" & Rows.Count).End(xlUp).Row
        If HI.Range("I" & Ihi) <> "" Then
            CAB = HI.Range("A" & Ihi)
            Set cell = BD.Range("A2:A" & Range("A" & Rows.Count).Row).Find(CAB, lookat:=xlWhole)
            If Not cell Is Nothing Then
                BD.Range("T" & cell.Row).Value = "ok" 'quand tout sera au point, on changera "ok" par ""
            Else
                MsgBox "On ne retrouve pas " & CAB & " (" & HI.Range("I" & Ihi) & ") dans la feuille BD"
            End If
        End If
    Next Ihi

    BASE.Close False ' quand tout sera au ^point, on changera false par true

    'CAB_2 = BD.Range("A" & Ibd).Value
    'CAB = CAB_2

    'Dligne = HI.Range("A" & Rows.Count).End(xlUp).Row
    'J'identifie la dernière ligne renseignée sur la feuille "HISTO"

    'For Ihi = 2 To Dligne
    'Le périmètre de la macro s'applique à partir de la ligne 2 jusqu'à la dernière ligne non vide
            'If HI.Range("I" & Ihi).Value <> 0 Then
            'Si sur la feuille "HISTO" la valeur de la ligne (définie par variable Ihi) en colonne I est différente de 0
                'BD.Range("T" & CAB).CearContents
                ' Supprimer la valeur de la colonne "Bât C/F" (T) dans la feuille BD
            'End If
    'Next
End Sub

Bonjour Gmb,

Merci pour ces corrections je vais étudier le code cette après midi afin de comprendre tout ça

Concernant ta question, il n'est pas obligatoire de faire une seconde macro si tout peut être fait dans une seul.

Je m'étais orienté au départ vers deux macro, plus par confort et par simplicité de maintenance pour moi.

Mais si pour toi ce choix n'est pas judicieux je peux essayer de faire tout dans une seule macro.

Avec tes corrections, je vais essayer de proposer les deux façon à la fin du WE (avec 2 boutons et 1 seul).

Merci encore pour ton travail

Cordialement

Bonjour

Tu écris :

Mais si pour toi ce choix n'est pas judicieux je peux essayer de faire tout dans une seule macro.

Essaie !

Je t’envoie la solution , au cas où … :

26histo.zip (165.83 Ko)

Teste là et dis-moi si elle fait bien ce que tu veux.

Les 3 fichiers doivent être dans le même dossier.

Et la macro se lance à partir du bouton bleu du fichier ‘’HISTO’’

Bye !

Bonjour Gmb,

D'abord merci beaucoup pour ton travail j'ai pu étudier tout ça et mettre à jour mes fichiers.

Je me note dans un coin le système avec la variable "chemin" dans le cas où j'aurais des macros à faire pour des fichiers dans le même répertoire.

Pour mon projet final, les 3 fichiers (Base_donnee / Histo / Inventaire) ne seront jamais dans un même répertoire.

J'ai donc modifié les codes dans cet optique.

Pour ce qui est de la synchronisation, je ne serais pas le seul utilisateur de ces fichiers.

J'ai donc mis sur le fichier HISTO.xlsm, deux boutons :

  • Synchronisation totale - BASE_DONNEE.xlsm + INVENTAIRE.xlsm (basée sur la macro que tu as réalisé)
  • Synchronisation partielle - BASE_DONNE.xlsm (inspirée de ta macro et ajustée à mon besoin)

Un bouton est ajouté sur le fichier BASE_DONNEE, feuille "BD" afin de synchroniser le fichier INVENTAIRE.xlsm à partir du fichier BASE_DONNEE.xlsm.

Pour ma part, la macro générale me convient parfaitement.

N'étant pas le seul à intervenir sur ces fichiers, je verrais au fur et à mesure de l'utilisation, si je peux supprimer les boutons pour la synchronisation en "2 clic".

Encore merci pour ton travail, je vais poursuivre mon apprentissage du VBA.

Cordialement

Rechercher des sujets similaires à "aide vba suivi entreposage expedition"