Macro pour ramener éléments d'un fichier selon conditions

Résolu/Fermé
Playa2 - 31 janv. 2013 à 09:23
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 - 15 févr. 2013 à 20:55
Bonjour,

Je recherche une solution (macro) afin de ramener différants éléments d'n fichier source (actualisé quatidiennement) vers un autre fichier selon plusieures conditions.

Afin d'être plus claire, je joins les deux fichiers (source et destination) ci-dessous.

Les besoins sont les suivants :

1/si n° COMPTE de DESTINATION existe dans SOURCE et libellé GN = Matière ou autres charges externes ramener "résultat cumulé" dans colonne 1

2/si n° COMPTE de DESTINATION existe dans SOURCE et libellé GN =tous les autres, ramener "résultat cumulé" dans colonne 2

3/si n° COMPTE de TAB n'existe pas dans SOURCE => insérer ligne dans TBD est ramener N°compte et résultas cumulés dans colonne correspondante

http://cjoint.com/?3AFjt2mBF2Z
http://cjoint.com/?3AFjuC3q4ny

J'ai bien tenté les recherchev mais popur les conditions si ça se complique !!!

D'avance merci à ceux qui voudront bien s'intéresser à mon problème ; je me tire les cheveux depuis deux jours et ne trouve pas la solution...
A voir également:

56 réponses

Hello,

J'ai résolu le problème de nom de bouton !!!
A présent j'ai un nouveau message d'erreur :
erreur exe "13" Incompatibilité de type et la ligne surlignée :
If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then

Cdlt.
0
la code est "essai" soit ActiveSheet.Shapes.Range(Array("essai")).Delete

D'avance merci pour votre aide.
0
Par ailleurs, je me suis aperçue que dans le nouveau fichier (récupération des lignes dont les colonnes 1 et 2 sont vides) de reprend pas la ligne des intitulés de colonnes...

Serait-il possible d'y remédier ???

D'avance merci.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
12 févr. 2013 à 16:24
Bonjour,
Oui c'est une petite erreur de ma part une mauvaise valeur.
Merci de remplacer 2 par 14 dans la ligne ....
Doit- être :
For c = nbli To 14 Step -1


0
OK merci, on a bien passé ce cap mais maintenant j'ai le même problème sur la ligne suivante à savoir erreur d'exe "13" Incompatibilité de type et la ligne surlignée :
If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then

Je suis désolée mais comme je ne comprends pas la macro, je n'arrive pas a régler les problèmes par moi-même !!!

De plus, avec le fichier source que nous avons partagé, votre macro s'applique parfaitement => je ne comprends pas pour quelles raisons elle pose problème sur une autre fichier...

Cdlt.
0
Dans cette ligne If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then : c=193 (soit numéro de la dernière ligne du tab destination).
Si destination venait à comporter plus de lignes, la macro prendrait-elle en compte les lignes de 193 à 200 par exemple ???

D'avance merci.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
12 févr. 2013 à 17:59
Bonjour,
Le nombre de ligne est toujours calculé selon les lignes du fichier à traiter par ce code:
nbli = .Cells(Columns(1).Cells.Count, 1).End(xlUp).Row

Salutations.
Le Pingou
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
12 févr. 2013 à 17:53
Bonjour,
Je vous l'ai déjà mentionné avec ceci :
Note: J'ai vu votre dernier message et si vous modifier le code je n'ai aucune chance de vous aider sans avoir la procédure complète (donc une copie de la procédure que vous avez modifier.. !)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Voici la macro à ce jour :

Sub EP()

Dim wbdes As Object, wbsou As Object
Dim cel As Variant
Set wbdes = Workbooks("resultats destination")
Set wbsou = Workbooks("source ep")
shde = ActiveSheet.Name
' **** traitement cas 1 et 2 (GN = "matières" OU "autres charges externes" montant en colonne [AF] si non [AG]
gnma = Columns("AD").Column: gnsn = Columns("AE").Column
mcgnma = 0: mcgnsn = 0
Application.ScreenUpdating = False
With wbdes.Sheets(shde)
nbli = .Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
For Each cel In .Range("A14:A" & nbli)
nbcpt = WorksheetFunction.CountIf(wbsou.Sheets(1).Range("A:A"), cel.Value)
If nbcpt > 0 Then
Set result = wbsou.Sheets(1).Range("A:A").Find(What:=cel.Value, LookIn:=xlValues)
If nbcpt = 1 Then
If result.Offset(0, 5) = "Matières" Or result.Offset(0, 5) = "Autres charges externes" Then
' MsgBox "le code GN: " & result.Offset(0, 5)
Cells(cel.Row, gnma) = result.Offset(0, 16).Value
Else
' MsgBox "le code GN: " & result.Offset(0, 5)
Cells(cel.Row, gnsn) = result.Offset(0, 16).Value
End If
Else
For c = 1 To nbcpt
If result.Offset(0, 5) = "Matières" Or result.Offset(0, 5) = "Autres charges externes" Then
' MsgBox "le code GN: " & result.Offset(0, 5)
mcgnma = mcgnma + result.Offset(0, 16).Value
Else
' MsgBox "le code GN: " & result.Offset(0, 5)
mcgnsn = mcgnsn + result.Offset(0, 16).Value
End If
Set result = wbsou.Sheets(1).Range("A:A").FindNext(after:=result)
Next c
Cells(cel.Row, gnma) = mcgnma: Cells(cel.Row, gnsn) = mcgnsn
mcgnma = 0: mcgnsn = 0
End If
End If
Next cel
End With
Application.ScreenUpdating = True
' **** traitement cas 3, nouveau classeur avec données n°compte non présent dans destination
repertoire = wbdes.Path
wbdes.Sheets(shde).Copy
If Val(Application.Version) < 12 Then
ActiveWorkbook.SaveAs Filename:=repertoire & "\nouveau_desti.xls"
Else
ActiveWorkbook.SaveAs Filename:=repertoire & "\nouveau_desti.xls", _
FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
End If
ActiveSheet.Shapes.Range(Array("essai")).Delete
Application.ScreenUpdating = False
Set wbdes = ActiveWorkbook
With wbdes.Sheets(1)
nbli = .Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
For c = nbli To 14 Step -1
If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then .Rows(c).Delete
End If
Next c
End With
MsgBox "Le traitement du cas 3 est terminé, nouveau classeur créé."
Application.ScreenUpdating = True
Set wbdes = Nothing
Set wbsou = Nothing
Set result = Nothing
End Sub

En gras la ligne sur laquelle la macro bloque avec le message d'erreur d'exe "13" Incompatibilité

D'avance merci.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
13 févr. 2013 à 10:28
Bonjour,
Dans cette boucle :
For c = nbli To 14 Step -1
If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then  .Rows(c).Delete
End If
Next c

Disposition correcte :
For c = nbli To 14 Step -1
    If .Cells(c, gnma) <> "" Or .Cells(c, gnsn) <> "" Then
        .Rows(c).Delete
    End If
Next c


0
Bonjour et merci pour cette réponse,

La donne a changé car j'ai du créer deux autres macros qui se lancent avant la votre ; du coup des montants viennent s'afficher sur des n° compte "avenir" ce qui ne devrait pas être le cas.

Je pense qu'une modification de votre macro doit être apportée mais je n'ai auncune idée de la façon de procéder.

Je vous joins donc les différentes sources pour les 3 macros (boutons 1 - 2 -3 en haut à gauche) ainsi que le fichier destination final (j'ai tenté d'oter le maximum d'info pour ne pas trop alourdir le fichier tout en laissant les éléments dont vous pouvez avoir besoin).

http://cjoint.com/?3BnlyzoexRf
http://cjoint.com/?3BnlzkeiJMy
http://cjoint.com/?3BnlzOd8vxK
http://cjoint.com/?3BnlA42ZBgF

Je suis désolée de ce contretemps et vous remercie une fois de plus du temps que vous voudrez bien me consacrer.

Cdlt.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
Modifié par Le Pingou le 13/02/2013 à 17:06
Bonjour,
Je vais regarder ce qu'il est possible de faire. A première il y a des opérations à double et inutile et un nombre de module qui non rien à faire là. En plus une à deux procédures qui doivent être transformé car issu de l'enregistreur de macro donc mauvais lors d'une répétition des codes.


Salutations.
Le Pingou
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
13 févr. 2013 à 17:41
Bonjour,
Dans un premier temps j'ai besoin de comprendre à quoi sert ceci : La donne a changé car j'ai du créer deux autres macros qui se lancent avant la votre ?


0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
13 févr. 2013 à 22:29
Bonjour,
En étudiant votre feuille [TRAVAIL] du classeur [resultats_destination] je me pose de sérieuses questions.
Pourquoi utilisez 2 macros pour insérer des fonctions [RECHERCHEV()] alors qu'il suffit de le créer une seul fois dans la feuille et c'est tout.
La seul qui se justifie et celle qui traite les colonnes [AD:AE] pour pouvoir obtenir le cumul des [Résultat cumulé] selon besoin.

J'ai essayé de lancer la procédure 1, 2 puis 3 et aucunes fonctionne tout simplement parce ce que les noms des classeurs utiliser dans vos procédure ne corresponde aux fichiers que vous avez mis à disposition (exemple : [resultats_destination] différent de [resultats destination].
Dans mon exemple du début j'avais obligé de passer par un formulaire de saisi des noms des classeurs pour éviter ces problèmes de la sorte que la procédure travail toujours avec les bonnes références.

0
Bonjour Le Pingou,

Je vais tenté de répondre à vos différentes questions en étant la plus claire possible :

1/ La donne a changé : en fait je vous ai informé de ce fait uniquement pour que vous ayez tous les éléments - la 1ère macro ramenant des numeros de comptes tels que Avenir que vous n'aviez pas jusqu'alors,

2/ Il est vrai que les recherchev auraient pu être traités en une seule macro mais la demande était d'avoir une macro par source différente,

3/ En ce qui concerne le nom des fichiers qui ne correspondent pas et qui empêchent les macros de fonctionner => je ne comprends pas car je n'ai aucun problème sur mon poste.

Espérant avoir répondu au mieux,

Cdlt.

P.S : A ce stade, le plus important pour moi est d'arriver à cumuler les montants dans les bonnes colonnes et que le montant total des 2 colonnes (réalisé 2012) correspondent au total de la source.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
14 févr. 2013 à 11:24
Bonjour,
Précision :
1/ la 1ère macro ramenant des numeros de comptes tels que Avenir que vous n'aviez pas jusqu'alors,
Ma question était : pourquoi une macro alors qu'il suffit d'écrire directement la fonction sur la feuille et c'est tout ?

2/ Il est vrai que les recherchev auraient pu être traités en une seule macro mais la demande était d'avoir une macro par source différente,
Ma question était : pourquoi une macro alors qu'il suffit d'écrire directement la fonction sur la feuille et c'est tout ?

3/ En ce qui concerne le nom des fichiers qui ne correspondent pas et qui empêchent les macros de fonctionner => je ne comprends pas car je n'ai aucun problème sur mon poste.Lorsque le fichier transmis a pour nom : [source_gisor.xls] et que dans votre code [Sub GISORS()] vous avez la référence du classeur :[source gisor.xls] comme le nom est différent (manque le [_]), la fonction ne trouve pas le classeur ...tourne un certain temps ....sans aucun résultats.

En plus vous ne répondez pas à ceci : Dans mon exemple du début j'avais obligé de passer par un formulaire de saisi des noms des classeurs pour éviter ces problèmes de la sorte que la procédure travail toujours avec les bonnes références.
0
Hello,

Je vais vous répondre point par point :

1/ En effet, les recherchev ne nécessitent pas de macro, cependant la première opération consistant à un copier-coller du n° FOP sur lequel s'appuit les recherchev, et la demande d mon supérieurs étant de faire une macro ; j'ai donc bêtement répondu à l'attente.

2/CF. Réponse ci-dessus

3/ Peut-être le problème vient-il de cjoint.com car sur mon ordi les noms des fichiers et dans les macros sont les mêmes => que puis-je faire pour vous faciliter la tâche ???

4/Je n'ai malheureusement pas de réponse à vous donner ; je n'ai apporté, dans votre macro, que les modifications dont nous avions parler suite aux erreurs d'exe !!!

N'hésitez pas à me faire les demandes dont vous avez besoin afin de résoudre ces problèmes.

Cdlt.

P.S : un grand merci pour votre patience, j'ai bien conscience que je vous facilite pas la tâche !!!
0
Désolée, en effet votre macro initiale était différente de de celle renvoyée ; voici donc le fichier destination avec votre macro initiale :

http://cjoint.com/?3BomlxroSiN
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
14 févr. 2013 à 17:16
Bonjour,
Concernant le nom de classeur, après renseignement, il se trouve que les espaces dans un nom sont remplacées par le signe [_] pour des raisons de traitement.
Note : par principe il est toujours mieux d'avoir des chaine de caractère sans espace dans le but d'éviter des mauvaises interprétations lors de l'utilisation de fonction et /ou langage de programmation.
C'est mainteant clair pour moi.
Salutations.
Le Pingou
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
14 févr. 2013 à 23:00
Bonjour,
Une question de principe : est-ce que au départ la feuille [Travail] du classeur [resultat destination] doit être vide ....Oui / Non
Si Oui alors on le charge avec les valeurs du classeur [source gisor.xls] puis [source cp invest.xls] et en dernier avec les valeurs, selon N°compte du classeur [source ep.xls] ....est-ce correct ...Oui / Non

0
Bonjour,

Tout d'abord un grand merci pour votre aide ; en effet, à ce jour tout fonctionne parfaitement.

J'ai simplement dû faire une macro qui supprime les données ramenées d'EP à la fermeture de DESTINATION pour éviter que les montants se cumulent et donnent des résultats faux.

Je vais tout de même répondre à vos questions car il me semble que c'est le minimum :

Question 1 et 2 : oui et oui
Pour ce qui est de copier-coller à la place de recherv, je suis d'accord mais j'ai préféré la recherchev pour éviter un éventuel décallage...

Bonne soirée à vous et encore un grand merci, je n'y serais pas arrivée sans votre aide !!!
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
15 févr. 2013 à 17:59
Bonjour,
Merci, entre temps j'ai préparé une solution qui fait le tout en une seule fois.
Un petit détail à régler, dans la soirée ce sera prêt.
Au passage à quoi servent les fonction dans les colonne [I, M, W:AC, AI :AM] .... ?

0