MAJ fichier Vlookup

Résolu/Fermé
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016 - 30 nov. 2016 à 11:56
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 2 déc. 2016 à 16:46
Bonjour,

J'essaie de trouver un moyen de mettre à jour un fichier recap à partir d'un fichier source.

Dans un premier temps, considérons que les deux fichiers ont exactement la même structure (nb et ordonnancement des colonnes). Je voudrais passer par une rechercheV.

La macro doit effectuer une recherche des identifiants du fichier source dans le fichier recap. Lorsque la rechercheV ne renvoie aucun résultat, alors, je copie la ligne (de l'identifiant en question) du fichier source et la colle après la dernière ligne non vide du fichier recap.

J'ai essayé de créer un code en utilisant la fonction vlookup, mais ça ne marche pas. la macro renvoie l'erreur d'éxécution 1004.

Voici le code:

Option Explicit

Sub testrecherchev()

Dim mabase As Range 'déclare la base du fichier recap
Dim mabase2 As Range ' déclare la base du fichier source
Dim ligne As Long 'déclare le nombre de ligne variable de "mabase2"
Dim Dernlig As Long
Dim F As Variant

Set mabase = Workbooks("MAJ_recap").Worksheets("Feuil1").Range("A1").CurrentRegion
Set mabase2 = Workbooks("MAJ_source").Worksheets("Feuil1").Range("A1").CurrentRegion

With ThisWorkbook.Worksheets("Feuil1")

F = Application.VLookup(mabase2.Cells(ligne, 1).Value, Range("mabase"), 1, False)
Dernlig = Workbooks("MAJ_recap").Worksheets("Feuil1").Range("A" & Rows.Count) + 1

For ligne = 2 To mabase2.Rows.Count

If IsError(F) Then

mabase2.Rows(ligne).Copy Destination:=Dernlig


End If

Next
End With
End Sub


Le déboggeur indique systématiquement la ligne "F=..."

Je pense qu'il y a également un soucis avec Dernlig pour lequel il m'a renvoyé une fois l'erreur 424 "qualificateur incorrect".

J'ai constaté en parcourant divers forums que beaucoup de gens avaient des problèmes avec cette fonction en VBA, concernant la déclaration des variables mais dans mon cas je ne vois pas ce qui cloche...

Je sais qu'il y a d'autres façons de faire pour la MAJ que de passer par Vlookup mais dans un premier temps, j'aimerais comprendre pourquoi ça plante...

Je précise que les deux classeurs sont ouverts pour faire les tests.

D'avance merci pour vos lumières...

A voir également:

4 réponses

mrjenkins Messages postés 580 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
30 nov. 2016 à 12:00
Salut,

je ne connais pas la source du problème, mais voila comment moi, j'utilise le vlookup en VBA.
En fait j'ai créé une fonction SafeVlookup, qui, en cas d'erreur fait autre chose que de planter la macro =)


Function SafeVlookup(lookup_value, table_array, _
col_index, range_lookup, error_value) As Variant
On Error Resume Next
Err.Clear
return_value = Application.WorksheetFunction.VLookup(lookup_value, _
table_array, col_index, range_lookup)
If Err <> 0 Then
return_value = error_value
End If

SafeVlookup = return_value
On Error GoTo 0
End Function



Dans mon cas, j'ai juste ajouté le paramètre error_value qui me renvoie une valeur par défaut en cas de plantage.
Dans ton cas, tu peux juste insérer ici le code pour copier la ligne.

Bon courage
--
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
30 nov. 2016 à 12:08
Bonjour mrjenkins,

Merci de ta réponse. C'est intéressant, je vais tester ça cette après midi et je te dirais ce qu'il en est.
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
30 nov. 2016 à 16:32
Je me suis penché dessus, mais j'avoue ne pas comprendre comment l'intégrer à ma macro. C'est la première fois que je me sers d'une fonction personnelle.

Je comprends bien qu'elle remplace à elle seul ma ligne "F=..." et également ma conséquence then grâce à error value.

Mais qu'en est il du test logique ? Puisque dans mon cas, c'est précisément lorsqu'il y a erreur qu'il se passe quelque chose. Si la formule trouve une correspondance dans le second fichier, il ne doit rien se passer. Avec, cette fonction, il se passe quelque chose à tous les coups, vrai ou faux ...

je ne sais pas si je suis très clair dans mes explications ^^
0
mrjenkins Messages postés 580 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
1 déc. 2016 à 08:09
Salut,

j'ai un peu plus cherché du coup, c'est vrai que le besoin est pas le même.
Voici ce que j'ai sorti et qui semble fonctionner :


Option Explicit

Sub testrecherchev()

Dim mabase As Range 'déclare la base du fichier recap
Dim mabase2 As Range ' déclare la base du fichier source
Dim ligne As Long 'déclare le nombre de ligne variable de "mabase2"
Dim Dernlig As Long
Dim F As Variant

Set mabase = Workbooks("MAJ_recap.xlsm").Worksheets("Feuil1").Range("A1").CurrentRegion
Set mabase2 = Workbooks("MAJ_source.xlsx").Worksheets("Feuil1").Range("A1").CurrentRegion

With ThisWorkbook.Worksheets("Feuil1")
Dernlig = .Range("A1").End(xlDown).Row + 1
For ligne = 2 To mabase2.Rows.Count
If IsError(Application.VLookup(mabase2.Cells(ligne, 1).Value, mabase, 1, False)) Then
mabase2.Rows(ligne).EntireRow.Copy Destination:=.Rows(Dernlig).EntireRow
Dernlig = Dernlig + 1
End If
Next
End With
End Sub


Si tu as des remarques/questions, hésite pas.
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
1 déc. 2016 à 08:52
Bonjour,

je viens de tester ça, ça fonctionne parfaitement....

Merci beaucoup de ton aide ;)

Histoire d'être un peu moins bête qu'avant de poser la question:

Sais-tu ce qui n'allait pas dans la mienne ?

-déclarer la formule sous un nom de variable ?

ou Est-ce un problème de structure dans l'écriture ?
0
mrjenkins Messages postés 580 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
1 déc. 2016 à 08:58
Alors,

oui : la formule dans une variable ne fonctionnait pas. La ligne plantait car la variable ligne n'était pas initialisé. Le Vlookup ne pouvait pas fonctionner.

Dernlign plantait car Rows.Count renvoyait le nombre de lignes total du fichier. Tu essayais donc de sélectionner une ligne qui n'existe pas (celle après la dernière... ^^)

Dernlig = Dernlig + 1 : penser à incrémenter la variable pour ne pas écraser la mise à jour s'il y a plusieurs données à mettre dans recap.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 1/12/2016 à 09:01
Bonjour

Si j'ai compris ton pb, si la valeur dans la colonne "A" de ta source n'est pas dans la colonne "A" de ta recap tu ajoutes en fin de liste la nouvelle valeur avec ses données inhérentes ?
si oui, combien de colonnes ?

considère t on que les 2 classeurs sont ouverts au lancement de ta macro ?
Combien de lignes utilisées actuellement ?
 Michel
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
1 déc. 2016 à 09:54
Bonjour Michel,

Content de vous revoir.

Oui c'est exactement ça sur le principe de fonctionnement.

Pour le nombre de colonne, sur les vraies fichiers de mise en prod, ils varient.

En faite, le fichier "source"(fichier administratif), comporte en plus des informations qui m'intéressent, des informations qui ne doivent pas se retrouver dans le fichier recap (données financières). De ce fait, je vais déclarer "mabase2" sans passer par
range ("a1").currentregion 
mais plutôt par quelque chose comme
range("A:X(colonnes)".xldown.rows.count


Au total, j'utilise les 10 premières colonnes du fichier "source", pour les coller dans le fichier "recap" pas plus.

Non, seul le classeur recap le sera. la macro comportera une instruction
workbook.open(filename:=...)
pour ouvrir le fichier source puis le refermera à la fin de la procédure.

Toutes les lignes ne devront pas être copiés, seuls celles répondant à un certain critère devront l'être... Condition "And" supplémentaire.

Enfin, et c'est certainement, la partie la plus compliqué: l'ordonnancement des colonnes dans les deux fichiers ne sera pas le même. Et pour cause, les administratifs n'ont pas besoin d'avoir les mêmes informations mise en avant que les logisticiens.

Pour le nombre de ligne à l'heure actuelle, Il diffère d'un fichier à l'autre, le fichier "source" servant également d'archive pour du matériel que nous n'avons plus, il y a 74 lignes. Dans le fichier "recap", seulement 30. Dans tous les cas, ces fichiers ne comporteront jamais plus de 500 lignes au total (ou à part dans un siècle, mais d'ici là, il y aura des moyens bien plus efficaces de gérer les données).
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 1/12/2016 à 10:51
Toutes les lignes ne devront pas être copiés, seuls celles répondant à un certain critère devront l'être... Condition "And" supplémentaire.

Enfin, et c'est certainement, la partie la plus compliqué: l'ordonnancement des colonnes dans les deux fichiers ne sera pas le même. Et pour cause, les administratifs n'ont pas besoin d'avoir les mêmes informations mise en avant que les logisticiens.


t'es bien gentil mais tu changes ta question initiale

donc soit précis:
Condition "And" supplémentaire. ne veut rien dire
l'ordonnancement des colonnes dans les deux fichiers ne sera pas le même
très flou ordre source -ordre recap ?

lorsque tu traites un problème en info: tu décris présicément de ce que tu veux au final (quelle condition pour agir, colonnes à traiter et dans quel ordre , etc) et en suite tu raffines par blocs de + en + précis)

pour l'instant, ce que je venais d'étudier n'a servi à rien sinon de perdre du temps
petite indication vlookup n'est pas la solution dans ce cas
peut ^tre
Mettre les classeurs sans données confidentielles en pièce jointe sur « mon-partage.fr »
et faire un clic droit-coller le raccourci dans votre message



 Michel
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
1 déc. 2016 à 16:58
Michel,

Dans un premier temps, j'essaie de décomposer le problème en petite étape et de demander seulement sur les points ou je coince vraiment. Voila pourquoi je ne décris pas tout.

Par exemple, pour la copie de ligne selon critère, c'est fait, j'ai une solution fonctionnelle.

Concernant l'ordonnancement des colonnes: je récupère l'intégralité des 10 premières colonnes du fichier source et je les colle dans le fichier recap. Simplement dans la première question, j'ai demandé à ce que la ligne soit collée. En réalité, la colonne 2 du fichier source se retrouvera peu être en 4ième position du fichier recap....

Description complète du problème:

1) Mise à jour d'un fichier récap à partir d'un fichier source. la macro copie la ligne du fichier source dans le fichier recap selon certaines conditions:

- la ligne n'est pas déjà présente dans le fichier recap
- le statut du matériel est "En cours"
- le site du matériel est "Chaponnay"

2) La macro supprime la ligne du fichier recap, lorsque le statut du matériel passe à "Arrêté" dans le fichier source.


Actuellement, j'en suis là, grâce à la macro de mrjenkins quelque peu modifiée:

Sub testrecherchevcritères()

Dim mabase As Range 'déclare la base du fichier recap
Dim mabase2 As Range ' déclare la base du fichier source
Dim ligne As Long 'déclare le nombre de ligne variable de "mabase2"
Dim ligne1 As Long
Dim Dernlig As Long
Dim F As Variant

Set mabase = Workbooks("Gestion_des_engins_de_manutention_(recap).xlsm").Worksheets("Gestion").Range("A1").CurrentRegion
Set mabase2 = Workbooks("Liste_chariots_elevateurs_(source).xlsx").Worksheets("Recap").Range("A6:J65536")

With ThisWorkbook.Worksheets("Gestion")
Dernlig = .Range("A1").End(xlDown).Row + 1
For ligne = 2 To mabase2.Rows.Count
If IsError(Application.VLookup(mabase2.Cells(ligne, 4).Value, mabase, 1, False)) And mabase2.Cells(ligne, 1).Value = "En cours" And mabase2.Cells(ligne, 2).Value = "Chaponnay" Then
mabase2.Rows(ligne).EntireRow.Copy Destination:=.Rows(Dernlig).EntireRow
Dernlig = Dernlig + 1

End If
Next
End With

End Sub


Cette macro répond à la problèmatique 1.

J'ai tenté ça pour la problèmatique 2:

Sub testrecherchevcritères1()

Dim mabase As Range 'déclare la base du fichier recap
Dim mabase2 As Range ' déclare la base du fichier source
Dim ligne As Long 'déclare le nombre de ligne variable de "mabase2"
Dim ligne1 As Long
Dim Dernlig As Long
Dim F As Variant

Set mabase = Workbooks("MAJ_recap.xlsm").Worksheets("Feuil3").Range("A1").CurrentRegion
Set mabase2 = Workbooks("MAJ_source.xlsx").Worksheets("Feuil3").Range("A1").CurrentRegion

With ThisWorkbook.Worksheets("Feuil3")
Dernlig = .Range("A1").End(xlDown).Row + 1
For ligne = 2 To mabase2.Rows.Count
If IsError(Application.VLookup(mabase2.Cells(ligne, 1).Value, mabase, 1, False)) And mabase2.Cells(ligne, 2).Value = "Employé" And mabase2.Cells(ligne, 4).Value = "Chaponnay" Then
mabase2.Rows(ligne).EntireRow.Copy Destination:=.Rows(Dernlig).EntireRow
Dernlig = Dernlig + 1

End If
Next


For ligne1 = 2 To mabase.Rows.Count
If (Application.VLookup(mabase.Cells(ligne, 1).Value, mabase2, 2, False).Value = "Arrêt") Then
mabase.Rows(ligne).EntireRow.Delete
End If
Next
End With
End Sub


Ca plante une nouvelle fois sur la ligne en gras. Je ne suis même que la boucle soit correcte...

les coordonnées du second code (nom de fichier et déclaration des bases) ne sont pas à jour, j'ai effectué les test sur deux autres fichiers...


Je vais vous transmettre les deux fichiers "officiels", ce sera certainement plus claire

https://mon-partage.fr/f/eBjRxkq9/ > fichier récap

https://mon-partage.fr/f/Uy1Z9IsO/ > fichier source


Merci de votre aide. De mon côté je vais essayer de comprendre pourquoi le second code ne fonctionne pas...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
1 déc. 2016 à 17:23
Ok, merci c'est clair devrait marcher


je propose une solution demain
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
2 déc. 2016 à 09:13
Bonjour,
C'est parti mais sois patient car j'ai pas de trucs à faire
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
2 déc. 2016 à 09:35
Bonjour,

Aucun problème c'est déjà bien sympa de m'aider ...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
Modifié par michel_m le 2/12/2016 à 11:39
Dans ta feuille gestion il n'y a pas de chariots en statut "arrêt" répertoriés dans la source et que des "champonnay"...
un peu comme si les statuts arr^t de la source et les lieux autre que champonnay avait déjà été supprimé...
normal ?
Merci de répondre rapidement car je suis bloqué
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 2/12/2016 à 13:54
" Licencié" et "employé" c'est nouveau ?
:-(
si jeux tester la destruction d'une ligne "arr^t" il faudrait que je change un statut...
:-(
quel est l'implication de "corbas" dans ton système ?
:-(
j'ai testé en passant un chariot en "arret" et ca marche avec mon code

 Michel
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
2 déc. 2016 à 14:19
"Licencié" et "Employé" correspondent simplement aux valeurs de mes petits fichiers tests...Ils correspondent bien à "Arrêté" et "En cours" dans les fichiers que je vous ai transmis.

Corbas est un autre site de production. On ne s'en soucis pas. De toute façon, si je devais réaliser un fichier pour Corbas, je pourrais réutiliser exactement le même code, en changeant simplement "Chaponnay" par "Corbas".

D'accord, merci pour votre travail et tant mieux si au moins votre code est fonctionnel.... (le miens c'est pas gagné)

Mais comme ça, à vu d'œil, sauriez vous ce qui fait planter mon code ?
J'ai retourné le problème dans tous les sens, rien ne fonctionne...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
2 déc. 2016 à 14:57
"Licencié" et "Employé" correspondent simplement aux valeurs de mes petits fichiers tests

BRAVO, quel sérieux!

Mais comme ça, à vu d'œil, sauriez vous ce qui fait planter mon code ?

je m'en tape

voci le code en cours où j'en étais rendu avant ton délire post 20 et compte de ta dernière farce avec licencié, mais c'est moi qui démissionne
:-(((

Option Explicit
'-----------------------------------------------
Sub Mettreajour_svt_criteres()
Dim Fich As String
Dim T_arret, Nbre As Integer, Lig As Integer, Cptr As Integer, Ref As Variant
Dim Derlig As Integer, T_source, Dico As Object

Application.ScreenUpdating = False
'recherche source (emplacement indifférent)
Fich = Application.GetOpenFilename("*(.xlsx),*.xlsx")
Workbooks.Open (Fich)

With ActiveWorkbook.Sheets("recap")
'mémorisation des statuts "arr^ts"
Nbre = Application.CountIf(.Columns("A"), "Arrêt")
ReDim T_arret(1 To Nbre)
Lig = 6
For Cptr = 1 To Nbre
Lig = .Columns("A").Find(what:="Arrêt", after:=Cells(Lig, "A")).Row
T_arret(Cptr) = Cells(Lig, "D") 'mémorisation chariot
Next
' mémorisation des colonnes A à j
Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
T_source = .Range("A7:J" & Derlig)
ActiveWorkbook.Close SaveChanges:=False
End With

With ThisWorkbook.Sheets("Gestion")
' destruction des statuts "arret"
For Cptr = 1 To UBound(T_arret)
If Application.CountIf(.Columns("A"), T_arret(Cptr)) = 1 Then
Lig = .Columns("A").Find(what:=T_arret(Cptr), after:=.Range("A1")).Row
.Rows(Lig).Delete
End If
Next
'NON TESTE
'repèrage duo chariot & site
Set Dico = CreateObject("scripting.dictionary")
Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
For Lig = 2 To Derlig
Ref = .Cells(Lig, 1) & " " & .Cells(Lig, "K")
If Not Dico.exists(Ref) Then: Dico.Add Ref, ""
Next
For Cptr = 1 To UBound(T_source)
Ref = T_source(Cptr, 4) & " " & T_source(Cptr, 2) 'duo chariot site dans source
'si ce duo n'esxiste pas dans recap, affectation d'une nouvell ligneaprès la derniere
If Not .exists.Dico(Ref) Then Derlig = Derlig + 1
'recopie des données du nouveau chariot dans l'ordre de la feuille récap recap
.Cells(Derlig, "A") = T_source(Cptr, 4)
.Cells(Derlig, "B") = T_source(Cptr, 7)

Next
End With
End Sub

Bonne continuation
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
2 déc. 2016 à 16:02
Je reste courtois et je vous remercie pour vos efforts.

Je viens pas sur un forum pour me faire insulter, simplement pour demander de l'aide.

BRAVO, quel sérieux!


je vous ai précisé que j'avais réalisé des test sur d'autre fichiers et pas sur les fichiers offciels, que les critères ne soient pas les mêmes mots ne change rien à la logique globale.

voci le code en cours où j'en étais rendu avant ton délire post 20 et compte de ta dernière farce avec licencié, mais c'est moi qui démissionne


Pour mon délire post 20, je voudrais vous y voir sur un domaine de compétence qui n'est pas le vôtre, les rôles seraient sûrement inversés.

Bonne continuation
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
Modifié par michel_m le 2/12/2016 à 16:46
T'as raison, Brenda
0