Microsoft 365 VBA - Instruction d'un feuillet Base de donnée à un autre

Heim

XLDnaute Nouveau
Bonjour,

Je débute en VBA, mais je m'y passionne au vu des possibilités. J'aimerai mettre en application des tableurs pour mon travail.
Voilà ce que je cherche à faire:

J'ai 3 feuillet:
"Copie GS"
"Résultats"
"Base de Donnée"

Je dois extraire des données plus ou moins longues (50 à 200 lignes) d'un logiciel que je copie colle sur une premier feuillet Excel nommé "Copie GS", je souhaite les comparer les références avec le feuillet "Base de donnée" pour ensuite copier la ligne de la "Base de donnée" dans "Résultat".

L'instruction
Regarde ligne par ligne les références Colonne A feuillet "Copie GS", les comparer à la colonne A feuillet "Base de donnée" afin de retrouver la même référence.
Dès que la correspondance est faite, ordre de copier la ligne entière de "Base de donnée" et la coller dans le feuillet résultat les une à la suite des autres.
Si il ne trouve pas de référence correspondante, qu'il copie la ligne du feuillet "Copie GS" à la place. (ça me permettra de voir que la référence n'est pas dans la base de donnée, et je pourrait ensuite la rajouter.)

But:
Pour donner du contexte, c'est pour faire des interventions de maintenance régulière dans l'industrie. J'ai un nombre de pièces à changer tous les 5 ans sur des machines mais d'autre pièces ne sont pas à changer, ou alors selon état.
Dans la base de donné je donne l'instruction pièce par pièce selon la référence, et je peux modifier les ordres au cours du temps.
Quand je colle ma nomenclature dans le feuillet "Copie GS", et que j'active la macro, je souhaite avoir dans le feuillet résultat ma référence et l'action de maintenance à effectuer sur celle-ci.

J'ai essayé plusieurs truc mais je ne trouve pas/ connais pas les instructions à écrire dans mon tableau VBA.

Merci d'avance pour votre aide ;)
 

Heim

XLDnaute Nouveau
J'imaginais une boucle
Tant que valeur A7 de mon feuillet "Copie GS" n'est pas égale à la valeur A2 "Base de donnée", lire la suivante dans base de donnée.
Si plus aucune valeur marquée, alors copier ligne 7 "Copie GS" dans ligne 2 "Résultat"
Si A7 = Ax alors copier ligne x dans ligne 2 "Résultat"

Aussi avec une boucle pour copier la valeur dans "Résultat" seulement sur une ligne vide.

Je sais pas si mon résonnement est bon. Puis je galère encore bien à savoir quoi écrire pour les commandes. Et c'est pas toujours évident de trouver l'info.

Merci d'avance
 

Heim

XLDnaute Nouveau
Salut,
Alors j'ai essayé de comprendre ce que tu as fait, mais je n'arrive pas tout à piger.
TC, LB et LR sont des tableaux, comme on ne les voies pas j'imagine que ce sont des tableaux momentané afin de pouvoir faire la correspondance, c'est ça? Je comprend pas PLB et PLR.
En tout cas c'est pratiquement tout nickel. Y'a juste 2 choses:

-Je souhaiterai vraiment pouvoir savoir quel référence n'est pas dans la base de donnée. Du coup, si la OC ne trouve aucune correspondance avec OB, alors j'aimerai que ce soit la ligne de OC qui soit copiée. Comme ça, du premier coup d'œil, je me rendrai compte dans le feuillet résultat que l'instruction de maintenance n'est pas définie pour cette référence.

-L'autre chose c'est que quand j'efface les données affichées du tableau résultat, et que je recommence l'action, les nouvelles valeurs ne s'affiches pas au début: (voir image suivante)

1639986722165.png


Merci beaucoup pour ton aide. Ton code VBA va m'être d'une aide précieuse pour mon apprentissage
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Heim, bonsoir le forum,

En pièce jointe la version 02.
Pour le second problème, il ne faut pas effacer mais supprimer les lignes inutiles (non vides) pour que le tableau commence toujours à la premier ligne.
 

Pièces jointes

  • Heim_EP_v02.xlsm
    37.9 KB · Affichages: 6

Heim

XLDnaute Nouveau
Salut Robert,

Merci, le complément est parfait.
J'essai tant bien que mal de comprendre ton code afin de pouvoir apporter des modifications si nécessaire. Je ne comprend pas la différence entre la ligne
TEST = True
PLB.Rows(J).Copy PLR.Cells(PLR.Rows.Count, 1)
et
If TEST = False Then
PLR(PLR.Rows.Count, 1) = TC(I, 1)

Pourquoi sont elles différentes si le but est de copier si "vrai" la ligne du tableau TB ou si "Faux" la ligne du tableau TC?
Le tableur va évoluer et il se peut qu'a un moment je ne veuille plus copier la ligne entière mais juste une des cellule de cette ligne.

Aussi j'ai remarqué un petit truc, c'est que si il y a un doublon dans le tableau de copie, l'algorithme ne va me faire un lien avec le tableau de base de donnée qu'une seul fois. Le doublon sera compté comme "sans instruction" (en plus il ne copie même pas la désignation qui porte comme nom sa référence)

1640162500684.png

1640162505392.png


Que du détail, j'aimerai juste arriver à bien comprendre ton code afin d'arriver à me débrouiller avec.
C'est pas simple y'a beaucoup trop d'infos sur internet et faire le trie est vachement compliqué.

Quoi qu'il arrive tu est génial, merci énormément pour ton aide, j'aurai jamais pu écrire ça seul.
 
Dernière édition:

Heim

XLDnaute Nouveau
J'ai fini par réussir à faire mon tableau nickel!
Leur seul problème que je rencontre c'est qu'il faut bien que je fasse attention au forma de ma cellule. Mes cellules de "Copie GS" sont en forma texte et celle de "Base de donnée" sont en format nombre. Et ça ne fonctionne pas dans la reconnaissance.

Merci infiniment
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Heim, bonsoir le forum,

J'ai peu de disponibilité en ce moment désolé.
Dans le premier code dès qu'on retrouvait la ligne on la copiait alors que dans le second il faut parcourir toutes les lignes. Si elle existe on la tague avec TEST = True. À la fin si TEST est Faux c'est qu'elle n'existe pas et alors dans ce cas on copie... :

If TEST = False Then
PLR(PLR.Rows.Count, 1) = TC(I, 1)
On est donc obliger de réinitialiser la variable TEST pour chaque nouvelle ligne de la boucle 1 si la condition est remplie :
 

Heim

XLDnaute Nouveau
Bonsoir,
Je suis désolé, j'étais persuadé de t'avoir répondu. Le tableau marche parfaitement, je te remercie énormément pour ton aide. Je me garde bien tous ça au chaud pour me faire des exemples de fonctionnement de tableau VBA.

Une dernière chose, je souhaite supprimer les lignes de mon tableau de façon automatique.
J'ai trouvé un code qui fonctionne pour le tableau de ma première feuille "Copie GS":

Public Sub Reset_data()
With ActiveSheet.ListObjects("Tableau3")
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
End With
End Sub
mais dès que je veux l'améliorer pour supprimer les lignes de ma feuil "Copie GS" et ma feuil "Résultat", ça ne fonctionne pas
Public Sub Reset_data()

Public Sub Reset_data()
With ActiveSheet.ListObjects("Tableau3")
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
End With

With Worksheet("Résultat").ListObjects("Tableau2")
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
End With

End Sub

où est mon erreur?

Merci
 

Phil69970

XLDnaute Barbatruc
Bonjour @Heim, Robert

Si j'ai compris ta demande
*Le nom du tableau est à adapter
VB:
If Range("Tableau1").ListObject.DataBodyRange Is Nothing Then
    'Tableau vide je sors par exemple
    Exit Sub
Else
    'Tableau remplit je le vide
    Range("Tableau1").ListObject.DataBodyRange.Delete
End If

*Merci de ton retour

@Phil69970
 

Heim

XLDnaute Nouveau
Voici l'excel,
En gros j'utilise le tableau3 de la feuille "Copie GS" pour coller une liste de pièces d'une machine pour maintenance. Quand je cliquer sur "convertir" le code va chercher les correspondances dans le tableau1 de la feuille "Base de donnée", et colle la ligne dans le tableau 2 de la feuille "Résultat" avec l'action de maintenance à effectuer sur la machine. Si elle ne trouve pas, elle copie seulement la ligne sans l'action. Ça me permet de voir la référence et aller l'ajouter dans la base de donnée pour le future.

C'est grâce à Robert que tout fonctionne. Merci encore.

Là maintenant ce que je cherche, c'est supprimer la totalité des lignes du tableau de la feuille "Copie GS" et "Résultat" afin de recommencer avec une autre liste pour une autre machine (il faut donc que toutes les lignes soit supprimées). Le problème c'est qui faut toujours qu'il reste au moins une ligne vide du tableau afin que le code "Convertir" fonctionne, sinon j'ai un message d'erreur.

Je voulais donc faire un nouveau code qui me supprime en 1 clique toutes les lignes de mes 2 tableaux.

Merci d'avance :)
 

Pièces jointes

  • Test.xlsm
    86 KB · Affichages: 5

Phil69970

XLDnaute Barbatruc
Re

Ce code supprime les lignes du tableau 2 et 3

VB:
Public Sub Reset_data()
If Range("Tableau3").ListObject.DataBodyRange Is Nothing Then
    'Tableau vide je sors par exemple
    Exit Sub
Else
    'Tableau remplit je le vide
    Range("Tableau3").ListObject.DataBodyRange.Delete
End If

If Range("Tableau2").ListObject.DataBodyRange Is Nothing Then
    'Tableau vide je sors par exemple
    Exit Sub
Else
    'Tableau remplit je le vide
    Range("Tableau2").ListObject.DataBodyRange.Delete
End If
End Sub

@Phil69970
 

Discussions similaires

Réponses
14
Affichages
501
Réponses
5
Affichages
438

Statistiques des forums

Discussions
315 095
Messages
2 116 162
Membres
112 674
dernier inscrit
AKD