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
J'ai besoin de vos lumières
Merci d'avance à toute personne qui prendra le temps de m'aider.
Cordialement
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 IfEnfin 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 SubMerci 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"