Signaler

MAJ fichier Vlookup [Résolu]

Posez votre question Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - Dernière réponse le 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...
Afficher la suite 
Utile
+0
moins plus
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
--
mrjenkins 480Messages postés jeudi 22 novembre 2007Date d'inscription 2 décembre 2016 Dernière intervention - 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.
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 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 ?
Répondre
mrjenkins 480Messages postés jeudi 22 novembre 2007Date d'inscription 2 décembre 2016 Dernière intervention - 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.
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 1 déc. 2016 à 09:28
Okk j'y vois plus claire. Le fait de déclarer la variable avant de mettre en place ma boucle for avec "Ligne" faisait qu'il ne reconnaissait pas les coordonnées.

D'accord, il aurait donc fallu que je rajoute ça
.End(xlUp).Row
à la fin de dernlig non ?

D'accord je prends bonne note du conseil. Merci d'avoir répondu, c'est important pour moi de savoir quelles sont mes erreurs.
Répondre
mrjenkins 480Messages postés jeudi 22 novembre 2007Date d'inscription 2 décembre 2016 Dernière intervention - 1 déc. 2016 à 09:31
Pas de souci =)

Oui en ajoutant ça, ça aurait fonctionné.
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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 ?
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 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).
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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_m 14196Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 10:53
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é
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 11:38
Oui c'est normal, puisque le fichier recap, ne recense que les chariots pour lesquels le statut est "en cours" et le site de production est "Chaponnay".

Le fichier comportant l'onglet "gestion" est le fichier recap. Le fichier source, c'est l'autre dans lequel on retrouve tous les chariots avec en statut "Arrêté" ou "En cours" et en site de production "Corbas" ou "Chaponnay".
Répondre
michel_m 14196Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 11:47
Donc, il n'est pas nécessaire de supprimer les "arr^t" comme cela existe dans source par ex: ligne 7 et 8 </ital>
alors pourquoi dans ton post:
la ligne du fichier recap, lorsque le statut du matériel passe à "Arrêté" dans le fichier source.
</ital>
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 12:15
Si justement puisque le statut d'un chariot peut passer de "En cours" à "Arrêté" dans le temps. Arrêt de la location, revente du matériel.

Du coup la macro, doit copier la ligne dans le fichier recap lorsquele matériel est "en cours" dans le fichier source, donc dispo pour exploitation. De la même manière, elle doit supprimer la ligne du chariot dans le fichier recap lorsque son statut passe à "Arrêté" dans le fichier source puisque plus dispo pour exploitattion.
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 12:35
J'ai tenté ça pour la suppressions de ligne:

 Sub testrecherchevcritères2()

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 ' déclare le nombre de ligne de "mabase"
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 IsError(Application.VLookup(mabase.Cells(ligne1, 1).Value, mabase2, 2, False) = "Employé") Then
mabase.Rows(ligne1).EntireRow.Delete
End If
Next
End With
End Sub


Ca ne fonctionne pas, mais ça ne renvoie aucune erreur ...
En revanche si je remplace la partie en gras par :

 For ligne1 = 2 To mabase.Rows.Count
If (Application.VLookup(mabase.Cells(ligne1, 1).Value, mabase2, 2, False).Value = "Licencié") Then
mabase.Rows(ligne1).EntireRow.Delete
End If
Next


Ca ne fonctionne toujours pas mais en plus j'ai une erreur 424.

Enfin si j'essai ça:

Sub condition2seule()
Dim mabase As Range
Dim mabase2 As Range
Dim LR As Long

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

For LR = 2 To mabase.Rows.Count
If (Application.VLookup(mabase.Cells(LR, 1), mabase2, 2, False) = "Licencié ") Then
mabase.Rows(LR).EntireRow.Delete
End If
Next

End Sub


ca ne fonctionne pas mais je n'ai pas d'erreur, sans utiliser "Iserror".

Pourquoi cela ne fonctionne pas ?
Répondre
Ajouter un commentaire
Utile
+0
moins plus
" 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

Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 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...
Répondre
michel_m 14196Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 2 décembre 2016 Dernière intervention - 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
Répondre
Tarpin-perlinpinpin 22Messages postés jeudi 10 novembre 2016Date d'inscription 2 décembre 2016 Dernière intervention - 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
Répondre
michel_m 14196Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 2 décembre 2016 Dernière intervention - 2 déc. 2016 à 16:46
T'as raison, Brenda
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !