Code vba comparer F1 et F2 et copier/coller en F2

Regueiro

XLDnaute Impliqué
Bonsoir le Forum
Dans mon code ci-dessous que j'ai repris sur le site de Boisgontier.
Je compare entre les 2 feuilles et copie dans la feuille2
J'aimerais l'adapter pour copier/coller les données sur 3 colonnes.
Mais je bloque.
Code:
Sub MajTph()
Set f1 = Sheets("0.Récap")
Set f2 = Sheets("0.Prix Unitaires")
Set d1 = CreateObject("Scripting.Dictionary")
For Each C In f2.[E8:G36]
    If C.Text <> "" Then
        d1(C.Text) = ""
    End If
Next C
Set d2 = CreateObject("Scripting.Dictionary")
For Each C In f1.[E8:G36]
    If C.Text <> "" Then
        If Not d1.exists(C.Text) Then
            d2(C.Text) = ""
        End If
    End If
Next C
If d2.Count > 0 Then
    f2.[E8].End(xlUp).Offset(1).Resize(d2.Count, 1) = Application.Transpose(d2.Keys) 'Ok marche mais transpose
 End If
End Sub
Merci de votre Aide.
A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Bonsoir le Forum
Je crois que j'ai trouver le code qu'il me faut.
Code :
Code:
Sub majModifAjout()
Application.ScreenUpdating = False
  Set S1 = Sheets("0.Récap")
  Set S2 = Sheets("0.Prix Unitaires")
  For Each C In Range(S1.[E8], S1.[E99].End(xlUp))
    p = Application.Match(C, S2.[E8:E36], 0)
    If Not IsError(p) Then
      S2.Cells(2 + p, 3) = C.Offset(0, 2)
    Else
      S2.[E37].End(xlUp).Offset(1, 0) = C
      S2.[E37].End(xlUp).Offset(0, 1) = C.Offset(0, 1)
      S2.[E37].End(xlUp).Offset(0, 2) = C.Offset(0, 2)
      'F2.[E65000].End(xlUp).Resize(1, 3).Interior.ColorIndex = 4
    End If
  Next C
Application.ScreenUpdating = True
End Sub
J'ai encore quelques problèmes :
Les données doivent se copier de E36:E8.
Actuellement elle se copie en E6 parceque en E5 il y des données
Peux t'on indiquer une plage ??

Serait-il possible de mettre ce code dans une procédure évévementielle, comme dans mon post précédent.
Merci de votre Aide.
 

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Bonjour,
il est possible que je n'aie pas compris ta demande mais ce code ne me semble pas indiqué : si tu veux recopier dans la feuille 0.prix unitaires toutes les lignes qui ne figurent pas déjà dans la feuille 0.recap, il faut que le code compare la totalité de chaque ligne présente dans 0 recap à chaque ligne de 0. prix unitaire.
Est-ce vraiment ce que ton code fait ?
Je ne l'ai pas étudié en détail mais à toi de me répondre. Si c'est le cas alors ça va mais tu dois en être sûr.
A+
 

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
En effet c'est ce que le code fait
Non. Le code ne compare que le code et pas l'ensemble de la ligne.
Si tu as en feuille 0.recap
1.004.012 Essais1 h
et en feuille0.prix unitaire
1.004.012 Essais1 n
, ce n'est pas la même ligne et pourtant comme c'est le même code, ta macro la considère comme un doublon.
Moi, j'avais compris que par doublon tu entendais une ligne identique mais là je ne sais plus ce que tu veux.
Il faut que tu sois plus précis.

De plus tu as une fonction Conso_3D qui est déclenchée lors du fonctionnement de ta macro.
Lance ta macro en pas à pas et vérifie par toi-même.
Si tu veux empêcher son déclenchement, il faut utiliser Application.Calculation = xlCalculationManual en début de code et Application.Calculation = xlCalculationAutomatic en fin de code pour revenir au mode de calcul initial.
A+

Edit : ton fichier plante lors de l'ouverture car il ne trouve pas l'USF (normal) : nettoie ton fichier exemple STP.
 
Dernière édition:

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Bonsoir le Forum.
Bonsoir David84
Concernant ton dernier post tu as entièrement raison.
Le code doit comparer les colonnes E8 à G36.
Les données sur 0.Récap sont directement rappattrier grâce à la Conso3D.
Si je change une donnée dans les Feuilles ART.....
Celle-ci sont directement corrigéesdans 0.Récap et 0.Prix Unitaires.

Mon but est de pouvoir gérer tout mes prix unitaires depuis 0. Prix Unitaires.
Ansi si je modifie un prix, il est automatiquement corriger sur toutes les Feuilles ART....

Fait un essai depuis 0.Récap
Bouton rouge copie dans 0.Prix Unitaires.
La première fois tout ce copie Ok.
Si tu appuie une 2ème fois des données viennent se coller en colonne C ??
La macro est assez lente chez moi.

J'ai désactiver la macro dans la Feuille 0.Prix Unitaires.
En effet les 2 macros ne doivent pas être compatible. ??
J'aimerais que la macro en 0.Récap soit évenemnetielle.

Je te joins mon fichier ainsi que celui de J. Boisgontier.
Merci.
A+
 

Pièces jointes

  • Prog Devis V35 sans USF.xlsm
    236.8 KB · Affichages: 63
  • Copie de MajBD.xls
    42 KB · Affichages: 73
  • Prog Devis V35 sans USF.xlsm
    236.8 KB · Affichages: 60
  • Prog Devis V35 sans USF.xlsm
    236.8 KB · Affichages: 61

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
tu m'as à nouveau placé un fichier avec des API alors que je t'avais demandé de les enlever (relis mes messages et tu verras).
Concernant la macro de JB je t'ai déjà dit que ce n'était pas la bonne solution et t'avais indiqué laquelle utiliser pour la retravailler.
Visiblement on a du mal à se comprendre...alors reprenons tranquillement.
Concernant ta fonction, le fait qu'elle se déclenche au cours du déclenchement de la macro est logique mais tu dois faire en sorte qu'elle ne se déclenche pas et je t'ai expliqué comment faire. Elle se déclenchera ensuite normalement.
Concernant le code de JB que je t'avais indiqué et qu'il te fallait regarder et adapter à ton cas, je t'ai fait le gros du travail :
Code:
Sub BD1_BD2()
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Set f1 = Sheets("0.Récap")
  Set f2 = Sheets("0.Prix Unitaires")
  a = f1.Range("E8:G36")
  DerLig = f2.Range("E" & f2.Rows.Count).End(xlUp).Row
  b = f2.Range("E8:G" & DerLig)
  Set mondico1 = CreateObject("Scripting.Dictionary")
  For I = 1 To UBound(b)
    For j = 1 To UBound(b, 2): temp = temp & b(I, j): Next j
    mondico1(temp) = ""
    temp = ""
  Next I
  ligne = 1
  Dim c
  ReDim c(1 To UBound(a), 1 To UBound(a, 2))
  For I = 1 To UBound(a)
        If a(I, 2) <> "" Then
            temp = ""
            For K = 1 To UBound(a, 2): temp = temp & a(I, K): Next K
            If Not mondico1.Exists(temp) Then
                For K = 1 To UBound(a, 2): c(ligne, K) = a(I, K): Next K
                ligne = ligne + 1
            End If
        End If
  Next I
  f2.Range("E" & DerLig + 1).Resize(ligne - 1, UBound(a, 2)) = c
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub

S'il y a des choses que tu ne comprends pas dans cette macro, indique-moi les passages qui te posent problème.
S'il y a des choses qui ne vont pas, indique-moi lesquelles et ce que tu as tenté de faire de ton côté pour y remédier.
Pour son déclenchement sur un évènement on verra cela plus tard une fois qu'elle sera au point.
A toi maintenant d'avancer de ton côté.
A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
Merci de ton Aide.
Voilà le fichier sans APÏ et avec ton nouveau code.
Ca marche très bien.
J'ai juste rajouter un x en blanc en E6 et E7 de la feuille 0.Prix Unit..
Pour dire que c'est E8 la dernière ligne vide.
Par contre si je modifie une donnée dans ART.123
Par exemple je modifie 1.989.023 - Loulou12 - hh par GG
Celle-ci ne se modifie pas dans 0.Prix Unitaires.
Elle vient ce coller sur la dernière ligne.

La macro évenementielle sur 0.Prix Unitaires ne fonctionne plus ?
Merci
A+
 

Pièces jointes

  • Prog Devis V35 sans USF.xlsm
    223.3 KB · Affichages: 170
  • Prog Devis V35 sans USF.xlsm
    223.3 KB · Affichages: 151
  • Prog Devis V35 sans USF.xlsm
    223.3 KB · Affichages: 117

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
Par contre si je modifie une donnée dans ART.123
Par exemple je modifie 1.989.023 - Loulou12 - hh par GG
Celle-ci ne se modifie pas dans 0.Prix Unitaires.
La macro que je t'ai faite répond à ta demande initiale : copier dans 0.prix unitaire les données présentes dans la feuille Recap et absentes dans 0.prix unitaire. Elle ne fait rien de plus.
Elle vient ce coller sur la dernière ligne.
Normal : ce n'est plus la même ligne puisque tu l'as modifiée dans ART123, elle est donc modifiée dans 0recap et lorsque tu lances ta macro elle est donc interprétée comme une nouvelle ligne : logique et c'est ce que tu avais demandé.
La macro évenementielle sur 0.Prix Unitaires ne fonctionne plus ?
C'est quoi cette macro évènementielle ? Quel est son nom ? Qu'est-elle sensée faire ?

Mets toi au clair avec ces histoires de macro qui doivent être déclenchées par un évènement : fait des recherches en ce sens pour comprendre la différence entre une macro :
- placée dans un module de feuille
- placée dans ThisWorkbook
- placée dans un module classique
- les différents types d'évènements existants te permettant de déclencher une macro.

A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Bonjour Le Forum
Salut David84
Je vois que tu es très matinal.

Résumons :
1. Si je fais un changement dans un article existant :
Cet article ne doit pas être rajouter mais modifier les données.

2. Si je rajoute en cours un nouvel art.
ex : 1.801 - Ouvrier maçon - H
Celui-si va se copier dans le dernière cellule vide en Col E de 0. Prix Unitaires
Ok le code marche je crois.

3. La macro évenement qui est dans la feuille 0.Prix unitaires
Etant donné que ce nouvel article vient se coller à la fin.
La macro le trie pour le ranger dans l'ordre.
Ainsi si j'ai déjà introduit des prix unitaires en colonne H de 0. Prix Unitaires
Ceux-ci seront toujours liées avec le bon article.

Voilà les explications.
Je te joins encore une fois un fichier de Boigontier comme exemple sur cette
macro que j'aimerais mettre dans la Feuil 0. Prix unitaires.

Merci
A+
 

Pièces jointes

  • TriDynamique.xls
    46 KB · Affichages: 64

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re

Désolé mais je ne te suis plus là, tu es en train de me noyer sous les informations qui me semblent contradictoires :
Résumons :
1. Si je fais un changement dans un article existant :
Cet article ne doit pas être rajouter mais modifier les données.
Dans quelle feuille fais-tu le changement ?
Dans quelle feuille cet article doit être modifié et non rajouté ?

Si tu parles des feuilles 0.recap et prix unitaire, cela va à l'encontre de ce que tu m'as dit : si tu modifies un article et que tu lances ensuite la macro, la ligne n'est pas considérée comme un doublon et c'est normal qu'elle soit rajoutée. C'est ce que je t'avais expliqué au message 20 et tu m'as répondu au message 21 que mon analyse était bonne.

Alors qu'est-ce que tu veux exactement concernant ces 2 feuilles ?
Quels sont les critères qui te font dire qu'une ligne est un doublon ?
Est-ce le code ? Est-ce le code et la désignation ? Est-ce le code, la désignation et l'Un ?

Je te joins encore une fois un fichier de Boigontier comme exemple sur cette
macro que j'aimerais mettre dans la Feuil 0. Prix unitaires.
Je me permets un conseil : faire du VBA ce n'est pas compiler des codes glanés ici ou là, c'est avant tout bien penser son projet et ensuite chercher les outils qui vont te permettre de le mener à bien.
Or ton fichier est truffé de code et de formules qui pris séparément font le travail mais qui ont du mal à cohabiter.
Et comme je ne vais pas m'amuser à reprendre tout ton fichier cela devient compliqué de t'aider efficacement.

Tu m'indique cette macro mais dans quel but ? Trier les données de la feuille prix unitaire ?
Si c'est le cas, fais-le de ton côté et dis-moi où tu bloques plutôt que de m'envoyer la macro.
A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re.
1. Je fais un changement dans une des Feuilles ART.......
Je modifier par exemple texte en colonne F, jamais en colonne E
Le texte est modifier dans la Feuill 0. Récap par la Conso3D
Après ce même texte est copier dans la Feuil 0. Prix unitaires
Je gère les prix unitaires sur la Feuil 0.Prix Unitaires en colonne H
Au départ je voulais gérer mes prix unitaires dans la Feiul 0. Récap
Mais à cause de Conso3D et des formules matricielles je n'arrive pas
Donc sur un autre Forum on m'a conseillé de copier / Coller les Données
de la Feuil 0.Récap dans 0.Prix Unitaires.
Voilà le pourquoi.
Concernant la macro événementielle de la Feuil 0. Prix Unitaires.
Tu peux voir le code et l'activer.
Elle fait exactement comme sur le fichier de Boisgontier ( Tridynamique )
Je l'ai désactiver sur mon fichier actuellement parceque elle plante
avec ton nouveau code ?? je ne sais pa pourquoi.
En espérant avoir le plus clair possible.
A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
Voilà sur ce fichier uniquement la Feuil 0. Récap
Si tu vas en E16 un tu rajoutes 1.111.100 David84 H
Tu verras que cette ligne va ce dépacler au bon endroit.
Sans modifier les autres qui on déjà les prix unitaires.
 

Pièces jointes

  • Classeur1.xlsm
    28.1 KB · Affichages: 75
  • Classeur1.xlsm
    28.1 KB · Affichages: 76
  • Classeur1.xlsm
    28.1 KB · Affichages: 76

david84

XLDnaute Barbatruc
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
Avant tout pense à répondre aux questions que je te pose parce que sinon je ne suis pas plus avancé.
Concernant ton problème, j'ai testé sur ton dernier fichier et sur ceux regroupant toutes les feuilles : ta macro fonctionne correctement sur prix unitaire. Par contre sur la feuille recap elle ne fonctionne pas car elle entre en conflit avec la fonction Conso 3D. D'où la remarque de mon précédent message :
faire du VBA ce n'est pas compiler des codes glanés ici ou là, c'est avant tout bien penser son projet et ensuite chercher les outils qui vont te permettre de le mener à bien.
Or ton fichier est truffé de code et de formules qui pris séparément font le travail mais qui ont du mal à cohabiter.
Et comme je ne vais pas m'amuser à reprendre tout ton fichier cela devient compliqué de t'aider efficacement.
Mais là la seule solution que je voie est de remplacer cette fonction par un code VBA qui fait le même travail : ceci dit, même si je la comprends, je ne vois pas son intérêt : que cherches-tu précisément à faire en utilisant cette fonction ?
A+
 

Regueiro

XLDnaute Impliqué
Re : Code vba comparer F1 et F2 et copier/coller en F2

Re
Résumé de ce que je souhaite faire avec mon programme :
Feuille 0. Récap :
Dans les cellules : E8:E43, Formule matricielle =conso3D("E19:E100";nf)
Cette macro consolide les colonnes E19:E100 de nf
nf = =DECALER('0.Récap'!$T$9;;;NB.SI('0.Récap'!$T$9:$T$44;"><"&""))
Dans la colonne T "onglet choisis", ce sont les feuilles selectionnées que je veux consolider.
Choix en fonction de la croix que je mets en colonne R "choix"
Ensuite en Colonne F8:F36 =
=SI($E36=0;"";RECHERCHEV($E36;INDIRECT(INDEX(nf;EQUIV(VRAI;(NB.SI(INDIRECT(nf&"!E19:E100");$E36)>0);0))&"!E9:J100");2;0))
Recherche la Désignation en fonction du code en E
Ensuite en Colonne : G8:G36 = =SI($E9=0;"";RECHERCHEV($E9;INDIRECT(INDEX(nf;EQUIV(VRAI;(NB.SI(INDIRECT(nf&"!E19:E100");$E9)>0);0))&"!E9:J100");3;0))
Recherche Un = Unité en focntion du code en E
Ensuite en colonne : H8:H36 =
=SI($E18=0;"";SOMMEPROD(SOMME.SI(INDIRECT("'"&nf&"'!E19:E100");$E18;INDIRECT("'"&nf&"'!N19:N100"))))
Recherche Quant : Total de toutes les quantités et somme de celle-ci
Ensuite en colone I8:I36 = =SI($E9=0;"";RECHERCHEV($E9;INDIRECT(INDEX(nf;EQUIV(VRAI;(NB.SI(INDIRECT(nf&"!E19:E100");$E9)>0);0))&"!E9:J100");4;0))
Recherche le prix unitaire en fonction du code en E
Ensuite toutes les données de cette feuille son triées selon la Sub Tri du module1 ( Quick Sort )
Cette sub tri est appellé dans la Sub Conso3D (module1) ainsi :
Call Tri(b, 1, mondico.Count)
Voilà ce que j'ai comme code sur cette feuille

Ensuite ce que je cherche à faire depuis quelque temps :mad:
Je veux gérer les prix unitaires en colonne I
Et cela je ne peux pas le faire sur cette feuille.

C'est pourquoi, je veux copier toutes les données de cette feuille
Uniquement de E8:G36
Dans la Feuille 0. Prix unitaires
A chaque changement dans cette feuille les copier coller dans la Feuille 0.Prix Unitaires

Feuille 0.Prix Unitaires
J'aimerais que les données que je reçois de la feuille O.Récap
Viennent se coller en E8:G36
Chaque nouvelles données se range dans la dernière cellule vide de E.
Cette fameuse fonction de tri, me permets de trier mes données dans l'ordre Alpha.

Exemple :
Admettons que j'ai dans cette feuille :
1.101.001 - Maçon - H - 35.00 ( ici je saisis le prix unitaire en colonne H )
3.101.001 - Grue - H - 500.00

Maintenant si dans je rajoute une nouvel article.
Celui-ci est saisi sur une des Feuilles en noires de type ART....
Par exemple :
2.101.001 - Isolation - m2 - .... ( pas de prix unitaires dans ces feuilles )
Puisque que je veux gérer les prix unitaires dans ma Feuille 0.Prix unitaires
De toute façon la colonne H sera verrouiller sans possibilité d'accès
dans cette colonne H, j'ai la formule suivante :
=SI(E30="";"";RECHERCHEV(E30;'0.Prix Unitaires'!$E$8:$I$35;4;VRAI))

Ce nouvel article vient se coller dans la Feuille 0.Récap
et dans la feuille 0.Prix unitaires
l'article 2.101.001 doit venir se coller entre les 2 articles déjà présent dans la Feuille 0.Prix unitaires.
Une collée, je saisi mon prix unitaire admettons 28.00 en Colonne H
Ainsi de tout les articles 2.101.001 sur toutes les feuilles ART...
Pour autant que l'article soit présent auront le prix unitaires de 28.00

Voilà mon souhait.
J'espère avoir été le plus clair possible sur la compréhension de mon fichier.
Pour information dans l'onglet 0.AIDE j'ai essayé de créer une aide pour l'utilisation de mon fichier.

Merci pour ton aide si tu as compris mon souhait.
A+
 

Discussions similaires

Réponses
1
Affichages
170

Statistiques des forums

Discussions
312 308
Messages
2 087 104
Membres
103 469
dernier inscrit
Thibz