Macro pour copier cellules aléatoires

Caledonia66 Messages postés 20 Statut Membre -  
Caledonia66 Messages postés 20 Statut Membre -
Bonjour
Etant débutant en programmation sous excel, j'aurais besoin d'aide pour une macro.
Voila le problème :
Dans le tableau d'origine sur la ligne 1 , j'ai une colonne dont la cellule indique
"maison "et je cherche à copier les cellules placées sous la cellule "maison" et les coller dans le tableau de destination .le problème est que la cellule "maison" n'est pas toujours sur la même colonne.
Merci par avance .
Cordialement

10 réponses

  1. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

    Voici une macro pour rechercher l'en-tête "maison" sur la ligne 1 de la feuille1 puis copier les données de la colonne correspondante dans la colonne A de la feuille 2.
    Sub ChercheMaison()
    Dim DerCol As Integer, Col As Integer
    Dim C As Range
    Dim DerLig As Long
    With Worksheets("Feuil1")
    DerCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    Set C = .Range(.Cells(1, 1), .Cells(1, DerCol)).Find("maison", , xlValues, xlWhole)
    If Not C Is Nothing Then
    DerLig = .Cells(Rows.Count, C.Column).End(xlUp).Row
    C.Resize(DerLig).Copy Worksheets("Feuil2").Range("A1")
    End If
    End With
    End Sub

    A+
    0
  2. Caledonia66 Messages postés 20 Statut Membre
     
    Bonjour
    Merci de votre réponse ,mais je n'arrive pas à l'adapter à ma macro :

    Workbooks.Open Filename:=ThisWorkbook.Path & "\1.xlsx"
    Windows("1.xlsx").Activate
    Range("AL2:AL16").Select
    Range("AL16").Activate
    Selection.Copy
    Windows("2.xls").Activate
    Range("C5").Select
    ActiveSheet.Paste

    Le problème c'est que le contenu le fichier d'ou j'extrai les données : 1.xlsx
    change au fur et a mesure des exports et les données qui sont ici dans les cellules AL2 à AL16 peuvent se retrouver dans la colonne AM dans le fichier suivant. bref ce qui est constant c'est l'entête de colonne :" maison".
    si tu peux m'aider merci par avance
    0
  3. Gyrus Messages postés 3360 Statut Membre 526
     
    Il manque à savoir :
    - la macro se trouve-t-elle dans le classeur 2.xls ?
    - quel est le nom de la feuille où sont copiées les données de 1.xlsx ?
    - quel est le nom de la feuille où sont collées dans 2.xlsx ?

    A+
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      Bonjour
      _La macro se trouve dans le classeur 2.xls
      _la feuille de 1.xlsx est feuil1
      _la feuille de 2.xlsxest feuil1
      Merci par avance de votre aide
      0
  4. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

    Essaie comme cela
    Sub ChercheMaison()
    Dim DerCol As Integer, Col As Integer
    Dim C As Range
    Dim DerLig As Long
    Application.ScreenUpdating = False
    Workbooks.Open Filename:=ThisWorkbook.Path & "\1.xlsx"
    With ActiveWorkbook.Worksheets("Feuil1")
    DerCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    Set C = .Range(.Cells(1, 1), .Cells(1, DerCol)).Find("maison", , xlValues, xlWhole)
    If Not C Is Nothing Then
    DerLig = .Cells(Rows.Count, C.Column).End(xlUp).Row
    C.Resize(DerLig).Copy ThisWorkbook.Worksheets("Feuil1").Range("C5")
    End If
    End With
    ActiveWorkbook.Close
    End Sub

    A+
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      Impec ça marche super bien . merci beaucoup
      Par contre je voudrai affiner en ne copiant pas la 1 ere cellule de la colonne (l'entete),
      j'ai essayer mais je n'y arrive pas .
      Merci par avance
      0
    2. Caledonia66 Messages postés 20 Statut Membre
       
      J'ai oublier de te dire dans la copie je ne souhaite pas copier la mise en forme ,juste les données , merci par avance.
      A+
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Gyrus Messages postés 3360 Statut Membre 526
     
    Remplace cette ligne :
    C.Resize(DerLig).Copy ThisWorkbook.Worksheets("Feuil1").Range("C5")

    par celles-ci :
    C.Offset(1).Resize(Derlig - 1).Copy
    ThisWorkbook.Worksheets("Feuil1").Range("C5").Resize(Derlig - 1).PasteSpecial Paste:=xlPasteValues
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      Merci beaucoup
      c'est super ! ça marche impec !!!
      A+
      0
    2. Caledonia66 Messages postés 20 Statut Membre
       
      j'ai encore une question , je voudrait copier juste l'entête d'une autre colonne (qui est aussi toujours sur la ligne 1 mais pas au même endroit et le coller dans la cellule A1
      0
  7. Gyrus Messages postés 3360 Statut Membre 526
     
    Tu as déjà tous les éléments de réponse avec le code précédent.

    Par contre, ton explication est incomplète.
    Si tu souhaites copier l'en-tête, j'en déduis que tu ne connais pas son libellé. Quel est alors l'élément qui te permet de chercher la colonne correspondante ?

    Si tu ne parviens pas à te débrouiller, reviens demander des éclaircissements.

    A+
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      Non il s'agit de copier depuis le même classeur et la même feuille ou je cherche "maison"
      mais là je cherche à copier que la 1re cellule sous l'entête "toit" et le copier dans le même tableau ou je colle les données sous" maison " le problème c'est que l'entête "toit n'est pas toujours sur la même colonne et que pour "toi" je ne veux copier qu'une cellule.
      J'espère que tu as compris car je me rend compte que sont peut être dur a comprendre.
      Lorsque j'adapte ton code précédent çà me copie toute la colonne .
      A+
      0
  8. Gyrus Messages postés 3360 Statut Membre 526
     
    Pour la copie, tu dois appliquer la ligne de code suivante :
    C.Offset(1).Copy

    C est la cellule où se trouve l'en-tête recherchée ("toit").
    Offset(1) représente un décalage d'une ligne.
    C.offset(1) est donc la première cellule sous l'en-tête.

    Et pour le collage :
    ThisWorkbook.Worksheets("Feuil1").Range("C5").End(xldown).offset(1).PasteSpecial Paste:=xlPasteValues


    A+
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      OK
      Merci beaucoup.
      En plus tes explications sont au top.
      Bref merci
      0
    2. Caledonia66 Messages postés 20 Statut Membre
       
      Bonjour
      Je n'arrive pas à faire fonctionner le code :
      j'ai remplacer par A1 ce qui donne :
      A1.Offset(1).Copy
      mais la ça ne marche pas idem si je remplace C par toit.
      par contre comment ça marche si toit n'est pas toujours sur la même colonne.
      A+
      0
    3. Gyrus Messages postés 3360 Statut Membre 526 > Caledonia66 Messages postés 20 Statut Membre
       
      Bonjour,

      Oula ! oula ! ça part en vrille ...
      "C" est une variable de type Range qui représente une cellule.
      Le lien entre C et la cellule qui contient la valeur "maison" est réalisé avec l'instruction
      Set C =( <Plage de recherche>).Find("maison",.....)
      Le lien entre C et la cellule qui contient la valeur "toit" doit être réalisé avec le même type d'instruction
      Set C =( <Plage de recherche>).Find("toit",.....)

      Pour me permettre de t'aider efficacement, il est souhaitable que tu joignes un fichier à ton message. Pour cela, tu peux utiliser https://www.cjoint.com/
      Ensuite, reviens coller ici le lien donné par le site.

      Et si tu as besoin de plus de précisions sur l'utilisation de cjoint.com : https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers#q=cjoint&cur=2&url=%2F

      A+
      0
    4. Caledonia66 Messages postés 20 Statut Membre
       
      Me revoilà
      J'étais en réunion....
      En fait ce que je voudrai pour la deuxième partie de mon message c'est faire comme avec ton 1er code mais en ne copiant qu'une seule cellule sous l'entête de la colonne .
      en recherchant par l'entête et la colonne d'où vient la copie peux bouger.
      Merci par avance
      0
    5. Caledonia66 Messages postés 20 Statut Membre
       
      c'est bon avec tes dernières explications , j'ai réussi à l'adapter et à le metre en place .
      Tout fonctionne super.
      Merci pour ton aide et ta patience.
      A+
      0
  9. Caledonia66 Messages postés 20 Statut Membre
     
    Bonjour
    en fait j'ai mis le fichier en lecture seul (avec mot de passe ),mais je n'arrive pas à supprimer la fenêtre d'information au lancement du fichier qui nous propose de mettre le mot de passe si on veut passer en mode modification.
    j'ai essayer avec :

    Private Sub Workbook_Open()
    Application.DisplayAlerts = False
    End Sub

    Je l'ai mis dans workbook Open

    Mais ça ne marche pas , si tu as une solution merci
    0
  10. Gyrus Messages postés 3360 Statut Membre 526
     
    Tu as enregistré le fichier avec l'option lecture seule avec mot de passe pour la modification.
    Cela signifie que tu veux garder la possibilité de passer en mode modification.
    Si l'application ne te proposait plus de passer dans ce mode, comment ferais-tu ?

    As-tu regardé le principe du fichier modèle ?

    A+
    0
  11. Caledonia66 Messages postés 20 Statut Membre
     
    Non je n'ai pas encore regardé le principe du fichier modèle , mais je pensais que l'on pouvait juste supprimer la fenêtre au lancement du fichier et qu'on avait la possibilité par la suite , d'aller dans le menu et passer en mode modif (en mettant le mot de passe).le but étant de ne plus avoir cette fenêtre au démarrage.
    A+
    0
    1. Caledonia66 Messages postés 20 Statut Membre
       
      Je viens d'essayé avec le fichier modèle ,mais les macros ne fonctionnent plus.
      A+
      0
    2. Gyrus Messages postés 3360 Statut Membre 526 > Caledonia66 Messages postés 20 Statut Membre
       
      Tu as bien enregistré ton fichier comme Modèle Excel (prenant en charge les macros) (*.xltm) ?

      A+
      0
    3. Caledonia66 Messages postés 20 Statut Membre > Gyrus Messages postés 3360 Statut Membre
       
      Oui
      A+
      0
    4. Caledonia66 Messages postés 20 Statut Membre > Gyrus Messages postés 3360 Statut Membre
       
      J'ai trouvé ça et ça fonctionne si on enregistre la macro en mode création:
      ça bloque l'enregistrement.
      Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      ThisWorkbook.Saved = True
      ThisWorkbook.Close
      End Sub

      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      ThisWorkbook.Saved = True
      ThisWorkbook.Close
      End Sub

      En tout cas , merci pour tout.
      A+
      0
    5. Caledonia66 Messages postés 20 Statut Membre > Gyrus Messages postés 3360 Statut Membre
       
      Bonjour Gyrus
      Mon fichier à évolué et
      1_je souhaiterait copier uniquement la cellule sous l'entête de la colonne (ne pas copier toute les valeurs sous l'entête) voici ton code qui copie toute les valeurs :

      With ActiveWorkbook.Worksheets("Feuil1")
      DerCol = .Cells(1, Columns.Count).End(xlToLeft).Column
      Set C = .Range(.Cells(1, 1), .Cells(1, DerCol)).Find("maison", , xlValues, xlWhole)
      If Not C Is Nothing Then
      DerLig = .Cells(Rows.Count, C.Column).End(xlUp).Row
      C.Offset(1).Resize(DerLig - 1).Copy
      ThisWorkbook.Worksheets("Feuil1").Range("A5").Resize(DerLig - 1).PasteSpecial Paste:=xlPasteValues
      End If
      End With
      2_En plus je souhaiterai ajouter la fonction ne pas copier les lignes vide lorsque l'on copie toutes les valeurs sous l'entête.

      Merci par avance de ton aide
      0