MACRO ! Coller des données précises dans des cellules vides à partir d'une feuille

Ouss92

XLDnaute Nouveau
Bonsoir,

Après plusieurs tours dans les différents forums sur internet, je n'arrive pas à trouver la solution à un outil que je suis entrain de développer sous excel 2003.
Tout d'abord, je suis un débutant sur excel, et surtout en VBA puisque je suis dans un poste où à vrai dire, ce language est fréquemment utilisé.
Je vous explique alors le problème que j'ai:
J'ai un fichier excel d'une trentaine de colonnes et de 800 lignes, extrait d'une base de données que j'ai sur sharepoint, ce fichier contient des entrées (ID, project name,start date...) que chaque contributeur remplit. Sauf que sur sharepoint, nous avons un système de ligne mère, ligne fille (chacun avec ID) qui nous permet d'associer chaque besoin à notre ligne mère et lui affecter le même "ID Parent". Un peu plus clairement, chaque contributeur rentre une seule fois les informations générales de son projet et afin de le mettre à jour, il associe chaque besoin à cet ID parent sans besoin de rentrer les infos générales à chaque fois.

Ce qu'on m'a demandé, c'est qu'à partir de cet extract, je puisse activer une macro qui me permettra de remplir les cellules vides laissés dans chaque ligne fille en allant directement chercher les informations dans la ligne mère grâce à l'Id parent.

Dans un sens un peu plus logique :
SI ID ligne mère= ID ligne fille, dans ce cas, copier les infos de la ligne mère dans chaque ligne fille associée au même ID ligne mère.

Je vous joints aussi un petit extrait de mon extract avec quelques éclaircissements au cas oû ce n'est pas encore lisible. J'avoue que ça fait bien 3 jours que je suis dessus , j'ai essayé quelques formules mais je n'arrive pas à avoir les conditions que je veux exactement !

Est- ce que quelqu'un peut m'aider s'il vous plait ?

N'hésitez pas à me demander plus d'informations si vous en avez besoin.

Me conseillez-vous d'utiliser des macros ou juste des formules matricielles, qui sont un peu plus compliqués !

Merci d'avance pour vos propositions.
 

Pièces jointes

  • Test1.xls
    37.5 KB · Affichages: 49
  • Test1.xls
    37.5 KB · Affichages: 50
  • Test1.xls
    37.5 KB · Affichages: 47

camarchepas

XLDnaute Barbatruc
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Bonjour,

Voici une solution possible via vba,

J'ai détaillé un peu et utilisé quelques variables intermédiaires pas forcément nécessaires au fonctionnement, mais cela reste plus clair dans la compréhension (du moins j'espère).

Je n'ai recopié que le libellé , il faudra peut être en faire de même pour l'ensemble ou portion de ligne.

Je te joint également le fichier avec cette macro implantée en tant que module.




Code:
Option Explicit

Sub Complete()

Dim Lecture As String, Contenu As String
Dim LigneMax As Long, Ligne As Long
Dim Trouve As Range

'Mise en référence de la feuille(Icic ce sont les .range qui seront associés à cette référence)
With Sheets("Extract")
'Dernière ligne contenant de l'information
 LigneMax = .Range("A" & Rows.Count).End(xlUp).Row
'Première ligne à traiter
 Ligne = 2
'Boucle de traitement
 Do
  'Test si la cellule est vide
   If .Range("C" & Ligne) = "" Then
    'Mise en mémoire de l'id mère à chercher
     Lecture = .Range("B" & Ligne)
    'Recherche de l'id mère
     Set Trouve = .Range("A:A").Find(Lecture, lookat:=xlWhole)
    'Objet recherché non trouvée ?
     If Not Trouve Is Nothing Then
       'Mémorise contenu
        Contenu = .Range("C" & Trouve.Row)
       'Report contenu dans cellule vide
        .Range("C" & Ligne) = Contenu
       Else
       'Si objet non trouvé
        MsgBox "Ligne mère n° " & Lecture & " non trouvée"
     End If
   End If
  'Incrémentation de la ligne à analyser
   Ligne = Ligne + 1
 'Sortie de la boucle si ligne à analyser supérieure à ligne maxi
 Loop Until Ligne > LigneMax
'Fin de référencement
End With
End Sub
 

Pièces jointes

  • Complete.xls
    47.5 KB · Affichages: 112

Ouss92

XLDnaute Nouveau
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Merci infiniment "camarchepas" pour ta réponse aussi rapide.

La macro me retourne exactement les informations que je voulais, le seul soucis qui me reste , c'est pouvoir étaler la même fonction pour qu'il puisse remplir toute la ligne avec les mêmes informations de la ligne mère, maais je pense que dejà la grosse partie a été faite grâce à toi !!

Tu as une idée d'une fonction qui me permettra de recopier toute la ligne ?

Merci encore une fois.
 

camarchepas

XLDnaute Barbatruc
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Voici donc pour toute la ligne jusqu'a M à priori .

On change le type de variable de contenu en variant afin de stocker toute la ligne d'un coup

une légére modif d'écriture sur les ranges et hop....

JE te laisse remplacer la macro dans le classeur.

Code:
Option Explicit

Sub Complete()

Dim Lecture As String
Dim LigneMax As Long, Ligne As Long
Dim Trouve As Range
Dim Contenu As Variant
'Mise en référence de la feuille(Ici ce sont les .range qui seront associés à cette référence)
With Sheets("Extract")
'Dernière ligne contenant de l'information
 LigneMax = .Range("A" & Rows.Count).End(xlUp).Row
'Première ligne à traiter
 Ligne = 2
'Boucle de traitement
 Do
  'Test si la cellule est vide
   If .Range("C" & Ligne) = "" Then
    'Mise en mémoire de l'id mère à chercher
     Lecture = .Range("B" & Ligne)
    'Recherche de l'id mère
     Set Trouve = .Range("A:A").Find(Lecture, lookat:=xlWhole)
    'Objet recherché non trouvée ?
     If Not Trouve Is Nothing Then
       'Mémorise contenu
        Contenu = .Range("C" & Trouve.Row & ":M" & Trouve.Row)
       'Report contenu dans cellule vide
        .Range("C" & Ligne & ":M" & Ligne) = Contenu
       Else
       'Si objet non trouvé
        MsgBox "Ligne mère n° " & Lecture & " non trouvée"
     End If
   End If
  'Incrémentation de la ligne à analyser
   Ligne = Ligne + 1
 'Sortie de la boucle si ligne à analyser supérieure à ligne maxi
 Loop Until Ligne > LigneMax
'Fin de référencement
End With
End Sub
 

Ouss92

XLDnaute Nouveau
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Encore une petite question, Le fichier se met à jour à chaque fois du coup y'a des lignes qui s'y ajouteront avec le temps.

Y-au t-il une fonction qui permettra d'assurer l'exécution de la macro jusqu'à la 65 536 ème ligne ? la fonction lastRow par exemple ?
 

Ouss92

XLDnaute Nouveau
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Camarchepas,

J'ai une autre petite question , j'ai envi que la macro, ne touche pas à la colonne F quand il y'a quelque chose inscrit dessus et qu'il recopie le même texte que sur la ligne mère lorsque cette cellule est vide. Est ce qu'il y'a une condition spéciale à rajouter ?

Merci d'avance pour ton aide.
 

camarchepas

XLDnaute Barbatruc
Re : MACRO ! Coller des données précises dans des cellules vides à partir d'une feuil

Bonjour,

Donc si j'ai bien compris :

lorsque dans la ligne cible, la colonne est différente de vide , l'on ne touche pas à cette colonne

Code:
Option Explicit

Sub Complete()

Dim Lecture As String
Dim LigneMax As Long, Ligne As Long
Dim Trouve As Range
Dim Contenu As Variant
Dim Mémoire as variant  
'Mise en référence de la feuille(Ici ce sont les .range qui seront associés à cette référence)
With Sheets("Extract")
'Dernière ligne contenant de l'information
 LigneMax = .Range("A" & Rows.Count).End(xlUp).Row
'Première ligne à traiter
 Ligne = 2
'Boucle de traitement
 Do
  'Test si la cellule est vide
   If .Range("C" & Ligne) = "" Then
    'Mise en mémoire de l'id mère à chercher
     Lecture = .Range("B" & Ligne)
    'Recherche de l'id mère
     Set Trouve = .Range("A:A").Find(Lecture, lookat:=xlWhole)
    'Objet recherché non trouvée ?
     If Not Trouve Is Nothing Then
         'Mémorise contenu
          Contenu = .Range("C" & Trouve.Row & ":M" & Trouve.Row)

          if  .Range("F" & Ligne)="" then
            'Report contenu dans cellule vide
            .Range("C" & Ligne & ":M" & Ligne) = Contenu
           else
             Mémoire =.Range("F" & Ligne)
            .Range("C" & Ligne & ":M" & Ligne) = Contenu
            .Range("F" & Ligne)=Mémoire
         end if
       Else
       'Si objet non trouvé
        MsgBox "Ligne mère n° " & Lecture & " non trouvée"
     End If
   End If
  'Incrémentation de la ligne à analyser
   Ligne = Ligne + 1
 'Sortie de la boucle si ligne à analyser supérieure à ligne maxi
 Loop Until Ligne > LigneMax
'Fin de référencement
End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 178
Messages
2 085 982
Membres
103 079
dernier inscrit
sle