Aide VBA - gestion de données entre deux fichiers

Bonjour à tous,

Je suis débutant en VBA, vraiment novice. Je me suis servis de tout ce que j'ai pu trouvé sur ce site pour pondre les quelques lignes de code que j'ai fait .... Et malgré ça, ça ne fonctionne pas ^^

Contexte:

Bon, je travaille dans l'industrie et tous les jours nous recevons des données différentes de nos clients. Nous faisons passer ces données dans une moulinette excel afin de réaliser certaines planifications spécifiques et on génère manuellement des fichiers que nous intégrons dans certaines de nos machines. J'aimerai bien automatisé cette tache avec une macro VBA.

Cahier des charges:

Dans le fichier que je vous joint en exemple, j'ai créé dans la colonne A un marqueur unique selon plusieurs critères afin de pouvoir faire "FACILEMENT" une comparaison.

Les données sont déjà trier dans le bonne ordre en amont.

Tant que les données contenue en cellule A est égale à la cellule A+1 alors on créer un seul nouveau fichier (nommé à la valeur de A) et on vient copier les données dedans (ligne entière). Dès que A change de valeur, on créer un nouveau fichier et on vient remplir les données suivantes et ainsi de suite jusqu’au moment ou nous avons balayé entièrement toute la colonne A. La taille du tableau est très variable selon les jours ( parfois 150 lignes et d'autre fois jusqu'à 3000 lignes).

Dans le fichier nommé "Exemple.xlsm", vous trouverez un exemple du style de données que je traite (fichier minimisé) et le code VBA que j'ai commencé à faire.

Code déjà fait:

décla de variable

Comptage de ligne

Création tableau

Redimensionnement tableau

Remplissage du tableau avec valeur contenue dans la feuille excel

Détection du client par un saisie utilisateur

Création fichier excel vide

ET c'est la que les problèmes commence, je n'arrive pas à copier les lignes du tableau répondant au critère dans le nouveau fichier. Vous verrez dans mon code que j'essaie sur un cas précis, j'avais essayé de faire toute de suite la boucle mais comme ça marche déjà pas avec un seul cas ....

Est ce que ma description est assez claire ? Avez vous besoin d'autres informations ?

Avant de vous demander de l'aide j'ai quasiment passer une semaine à essayer diverses méthodes trouver sur internet, je me suis martelé le cerveau a essayé de piger la bonne logique à adopter mais la, je tourne en rond

J'ai besoin de vos lumières

Merci d'avance à toute personne qui prendra le temps de m'aider.

Cordialement

24exemple.xlsm (57.64 Ko)

Bonjour et

Si on exprime les choses autrement (pour essayer de comprendre): tu veux filtrer ton tableau sur chaque marqueur différent en colonne A et les répartir dans autant de fichiers distincts ? Jusque-là, je suis dans le bon ?

  • Si non, reprends tes explications en donnant des exemples de cas concrets
  • Si oui, quel est le rapport avec le "client" renseigné dans ton InputBox ? Quels seront les fichiers destinés à Titi ? Tous ?

Bonjour U.Milité,

Merci pour ton feedback et effectivement en reprenant mes explications, je me rends compte que je suis resté enfermé dans mon truc technique.

Tu as très bien résumé en bon français ce que je cherche à faire.

Je cherche à faire une macro qui viendra filtrer sur les différents marqueurs en colonne A et répartir les données dans autant de fichier distinct.

Le marqueur "unique" est une concaténation des informations contenue dans les colonnes suivante à savoir :

date & flux & point déchargement & code du profil

Chaque jours les données changent et donc les marqueurs changent aussi. Je ne peux pas définir dans la macro des marqueur de filtre en dur.

J'aimerai que la macro final puisse s’adapter tout seul au changement de valeur des marqueurs.

Concernant la notion de client, j'ai pas encore le niveau technique en VBA mais j'ai plein d'idée pour faire un fichier de gestion complet.

A terme, j'aimerai qu'en fonction du client, les fichiers générés se rangent automatiquement dans différents répertoire réseau de l'entreprise. Mais c'est pas le plus important pour moi. Si déjà j'arrive à aller au bout de la macro pour générer les fichiers en auto plutôt qu'en manuelle, c'est environ une heure de travail quotidien gagner.

Voici avec détails ce que j'ai réussi à faire jusque maintenant (j'ai suivi pas mal de choses différentes sur internet, j'ai donc très certainement fait des choses qui ne servent à rien).

  • Déclaration des diverses variables
    création d'un tableau
    Redimensionnement du tableau
    Remplissage du tableau par les valeurs de la feuille excel
Sub Traitement_Worklist()

    'Déclarations des variables
    Dim numero_ligne As Integer
    Dim nb_lignes As Integer
    Dim nom_client As String
    Dim derniere_ligne As Integer
    Dim new_workbook As Workbook

    'La variable reçoit la valeur entrée dans l'InputBox
    nom_client = InputBox("Pour quel client ?", "Information", "Titi ou Toto")
    'Fonction NBVAL, permet de trouver le nombre de ligne non vide dans la colone A
    nb_lignes = WorksheetFunction.CountA(Range("A:A"))
    'Permet de trouver le numéro de la dernière ligne
    derniere_ligne = Sheets("Worklist_design").Range("A1").End(xlDown).Row

    'Définition du tableau VBA
    Dim TabWorklist()

    'Redimensionnement du tableau en fonction du nombre de ligne contenue dans le fichier excel
    ReDim TabWorklist(derniere_ligne - 2, 9)

    'Enregistrement des valeurs du fichier excel dans le tableau VBA
    For i = 0 To derniere_ligne - 2
        TabWorklist(i, 0) = Range("A" & i + 2)
        TabWorklist(i, 1) = Range("B" & i + 2)
        TabWorklist(i, 2) = Range("C" & i + 2)
        TabWorklist(i, 3) = Range("D" & i + 2)
        TabWorklist(i, 4) = Range("E" & i + 2)
        TabWorklist(i, 5) = Range("F" & i + 2)
        TabWorklist(i, 6) = Range("G" & i + 2)
        TabWorklist(i, 7) = Range("H" & i + 2)
        TabWorklist(i, 8) = Range("I" & i + 2)
        TabWorklist(i, 9) = Range("J" & i + 2)

    Next
  • Début de création de critère selon le client ( comme expliqué au dessus, c'est du plus mais pas primordiale)
    Copie des données pour les coller dans l'autre fichier excel ( ça ne fonctionne pas...)
Application.DisplayAlerts = False

    If nom_client = "Titi" Then
        'Création nouveau fichier excel pour remplir avec des données Client Titi
        Set new_workbook = Workbooks.Add
        ChDir "C:\Users\Robin_C\Desktop\STAM\Worklist\Titi"
        ActiveWorkbook.SaveAs Filename:= _
            "C:\Users\Robin_C\Desktop\STAM\Worklist\Titi\Titi.xlsx", FileFormat:= _
            xlOpenXMLWorkbook, CreateBackup:=False

        'Selection du fichier excel source
        Workbooks("Exemple.xlsm").Activate
        Sheets("Worklist_design").Select

       'Traitement des données, si le marqueur de la colone A est égale à la cellule suivante
       'Alors on copie les données de la ligne puis on les collent dans le nouveau fichier
        If Sheets("Worklist_design").Range("A1").Value = Sheets("Worklist_design").Range("A2").Value Then
            Range("A1:J1").Copy _
            Destination:=Workbooks("Titi.xls").Sheets("Feuil1").Range("A1")
            Selection.Paste
        End If

Enfin la macro dans sa globalité :

Sub Traitement_Worklist()

    'Déclarations des variables
    Dim numero_ligne As Integer
    Dim nb_lignes As Integer
    Dim nom_client As String
    Dim derniere_ligne As Integer
    Dim new_workbook As Workbook

    'La variable reçoit la valeur entrée dans l'InputBox
    nom_client = InputBox("Pour quel client ?", "Information", "Titi ou Toto")
    'Fonction NBVAL, permet de trouver le nombre de ligne non vide dans la colone A
    nb_lignes = WorksheetFunction.CountA(Range("A:A"))
    'Permet de trouver le numéro de la dernière ligne
    derniere_ligne = Sheets("Worklist_design").Range("A1").End(xlDown).Row

    'Définition du tableau VBA
    Dim TabWorklist()

    'Redimensionnement du tableau en fonction du nombre de ligne contenue dans le fichier excel
    ReDim TabWorklist(derniere_ligne - 2, 9)

    'Enregistrement des valeurs du fichier excel dans le tableau VBA
    For i = 0 To derniere_ligne - 2
        TabWorklist(i, 0) = Range("A" & i + 2)
        TabWorklist(i, 1) = Range("B" & i + 2)
        TabWorklist(i, 2) = Range("C" & i + 2)
        TabWorklist(i, 3) = Range("D" & i + 2)
        TabWorklist(i, 4) = Range("E" & i + 2)
        TabWorklist(i, 5) = Range("F" & i + 2)
        TabWorklist(i, 6) = Range("G" & i + 2)
        TabWorklist(i, 7) = Range("H" & i + 2)
        TabWorklist(i, 8) = Range("I" & i + 2)
        TabWorklist(i, 9) = Range("J" & i + 2)

    Next

     Application.DisplayAlerts = False

    If nom_client = "Titi" Then
        'Création nouveau fichier excel pour remplir avec des données Client Titi
        Set new_workbook = Workbooks.Add
        ChDir "C:\Users\Robin_C\Desktop\STAM\Worklist\Titi"
        ActiveWorkbook.SaveAs Filename:= _
            "C:\Users\Robin_C\Desktop\STAM\Worklist\Titi\Titi.xlsx", FileFormat:= _
            xlOpenXMLWorkbook, CreateBackup:=False

        'Selection du fichier excel source
        Workbooks("Exemple.xlsm").Activate
        Sheets("Worklist_design").Select

       'Traitement des données, si le marqueur de la colone A est égale à la cellule suivante
       'Alors on copie les données de la ligne puis on les collent dans le nouveau fichier
        If Sheets("Worklist_design").Range("A1").Value = Sheets("Worklist_design").Range("A2").Value Then
            Range("A1:J1").Copy _
            Destination:=Workbooks("Titi.xls").Sheets("Feuil1").Range("A1")
            Selection.Paste
        End If

    'Else
        'Création nouveau fichier excel pour remplir avec des données Client Toto
        'Set new_workbook = Workbooks.Add
        'ChDir "C:\Users\Robin_C\Desktop\STAM\Worklist\Toto"
        'ActiveWorkbook.SaveAs Filename:= _
        '    "C:\Users\Robin_C\Desktop\STAM\Worklist\Toto\Toto.xlsx", FileFormat:= _
        '    xlOpenXMLWorkbook, CreateBackup:=False

    End If

    Application.DisplayAlerts = True

End Sub

Merci d'avance pour vos conseils à un petit néophyte ultra motivé

Cordialement,

Bonjour,

Une solution par macro, dans le fichier joint:

  • le chemin d'accès devra être adapté
  • le dossier "client" sera renseigné dans ce chemin d'accès et devra exister avant le lancement de la macro
  • un objet "dictionary" est utilisé pour créer une liste sans doublons des marqueurs en colonne A
  • un filtre automatique permet ensuite, pour chaque clé de ce "dictionary", d'extraire les enregistrements vers autant de nouveaux documents que de clés

Vois déjà si ça correspond à tes attentes (en version "minimaliste" )

Rechercher des sujets similaires à "aide vba gestion donnees entre deux fichiers"