Macro copier ds 1 cellule 2 données séparées

Résolu
Bonjour,
tout d'abord merci pour la personne qui pourra m'aider.
voilà mon "problème":
je voudrais une macro qui me permettrait de copier dans une cellule, 2 données dans 2 cellules adjacentes.
je m'explique

disons que sur un classeur j'ai en A1 : nom et en B1 : prénom
je voudrais que A1+B1 soient collés ensemble (l'un au bout de l'autre) dans une cellule d'un autre classeur en A3 (par exemple).
il s'agit d'une liste de noms qui va de A1 à A38 sur le 1er classeur
et de A6 à A45 sur le second classeur

avec excel se serait concatener mais en macro, je cale.

merci d'avance

16 réponses

  1. Bonsoir,

    Essaie ce code :

    Sub concatener() 
    Dim rng As Range 
    Dim cel As Range 
    Dim copie As Range 
      Set copie = Worksheets("copie").Range("A1")      '1ère cellule destination 
      Set rng = Worksheets("données").Range("A1")      '1ère cellule prénoms 
      With rng 
        Set rng = .Resize(.End(xlDown).Row - .Row + 1) 'Liste des prénoms 
      End With 
      For Each cel In rng.Cells 
       copie.Value = StrConv(cel.Value, vbProperCase) & " " & _
                     StrConv(cel.Offset(0, 1).Value, vbUpperCase)
       Set copie = copie.Offset(1) 
      Next 
    End Sub

    Cordialement
    Patrice
    Nicolas dit toujours : « C'est facile quand on connait la réponse ! »
    1
    1. Bonjour,

      Il y a une petite erreur dans ton adaptation du code ci-dessus mais je ne pense pas que ce soit la cause de l'erreur :
      Remplacer :

      Set copie = Worksheets("appelundi8").Range("A6:A37") '1ère cellule destination
      Set rng = Worksheets("listeappel").Range("B4:B39") '1ère cellule noms 

      par :

        Set copie = Worksheets("appelundi8").Range("A6") '1ère cellule destination
        Set rng = Worksheets("listeappel").Range("B4") '1ère cellule noms

      Je travaille avec excel 2003, ton problème vient peut-être de la saisie sous 2007, remplace ces deux lignes :

      copie.Value = StrConv(cel.Value, vbUpperCase) & " " & _
      StrConv(cel.Offset(0, 1).Value, vbProperCase) 

      par celle-ci :

      copie.Value = StrConv(cel.Value, vbUpperCase) & " " & StrConv(cel.Offset(0, 1).Value, vbProperCase) 

      Tiens moi au courant
      1
      1. Bien en fin de compte j'ai réussi à résoudre le problème. En fait je n'avais pas (oubli ou inattention de ma part) exécuter la macro. je l'avais choisi par association avec un bouton, mais je ne l'avais pas activer. Maintenant aucun problème.
        Merci encore pour votre aide. C'est important pour moi, maintenant mon travail prend un sens plus pratique.
        cordialement, Maguy
        0
    2. Contributeur
      Bonjour,

      les 2 classeurs doivent être ouverts
      classeur source "classeur1.xls" feuille "feuil1") à adapter chez toi

      macro dans classeur cible (feuille où on restitue active, cad sur l'écran)

      Option Base 1  
      Sub concatener()  
      Dim identite  
      Dim cptr As Byte  
      
      ReDim identite(38)  
      
      With Workbooks("classeur1.xls").Sheets(1)  
          For cptr = 1 To 38  
              identite(cptr) = .Cells(cptr, 1) & " " & .Cells(cptr, 2)  
          Next  
      End With  
      
      With ActiveSheet  
          Range("A6:A45") = identite  
      End With  
      
      End Sub  
      --


      :-x
      0
      1. Tout d'abord merci d'avoir répondu !
        pourrais-je avoir quelques explications sur la macro de façon a pouvoir l'adpater ni nécessaire.
        en attendant, j'essaye et je vous tiens au courant des résultats.
        merci encore

        maguy
        0
        1. re Bonjour

          erreur de ma part : les deux feuilles appartiennent au même classeur.
          pardon
          Maguy

          je joins un fichier pour exemple : http://www.cijoint.fr/cjlink.php?file=cj201009/cijYs1nw7P.xlsm
          0
          1. Bonjour,

            j'ai donc changer le code avec les informations que j'ai mis + haut et ça ne fonctionne pas.
            quelqu'un peut-il m'aider ? merci d'avance

            code changer

            Sub concatener()
            Dim identite
            Dim cptr As Byte

            ReDim identite(38)

            With ThisWorkbook.Sheets("données")
            For cptr = 1 To 38
            identite(cptr) = .Cells(cptr, 1) & " " & .Cells(cptr, 2)
            Next
            End With

            With ActiveSheet
            Range("A1:A45") = identite
            End With

            End Sub
            0
            1. Contributeur
              Je n'ai pas Excel 2007comme beaucoup de monde ici...donc la prochaine fois, sauvegarde au format excel 97-2003 , Tu auras + de chances d'avoir des réponses

              avec la visionneuse microsoft, on voit qu'il y a pas que le nombre de classeurs qui change et dans la feuille "copie" les prénoms et noms ne concordent pas...

              change les 3 dernières lignes

              With sheets("copie") 
              .Range("A1:A45") = identite 
              End With


              il faut mettre un point devant range quand tu utilises with - end with

              c'est équivalent à
              sheets("copie").Range("A1:A45")=identite
              0
          2. Bonjour,

            d'accord, je met le fichier en excel 97 2003 en espérant avoir d'autres idées
            merci en tout cas
            Maguy

            http://www.cijoint.fr/cjlink.php?file=cj201009/cij5S40sNJ.xls
            0
            1. Bonjour,

              si une macro n'est pas indispensable tu peux utiliser la fonction concatener

              dans la feuille copie en A1 tu écris:

              =CONCATENER(données!A1;" ";données!B1)

              puis tu dupliques vers le bas

              bon courage
              0
              1. Bonjour

                et merci pour cette idée, mais vu l'étendue de mon travail une macro est plus facile et plus utile.
                je retiens néanmoins votre idée
                merci encore
                0
            2. Bonjour,

              tout d'abord merci Patrice, le code fonctionne à merveille !
              Sauf que (je me suis trompée), il faudrait que le nom soit en majuscules et le prénom avec la 1ère lettre en majuscule seulement.
              Si j'essaie ce code en inversant, le copiage me met le prénom en majuscules.

              pourriez-vous encore me donner un petit coup de main ?
              avec tous mes remerciements
              Maguy
              0
              1. Bonjour et merci

                le code fonctionne très bien sauf (et c'est de ma faute), il faudrait :
                que le nom soit en majuscule et le prénom avec la 1ère lettre en majuscule.
                du style : RATEAU Pierre

                en essayant avec votre code, c'est le prénom qui est en majuscules.

                Merci de votre aide encore une fois
                Maguy
                0
                1. Bonsoir,

                  Dans ton exemple du 5 sept à 19h19, la première colonne (A) contient le prénom et la seconde (B) contient le nom ce qui donne Marcel RATEAU !

                  Il semblerait que maintenant tu mettes le nom en colonne A et le prénom en colonne B, cela donnerait effectivement Rateau MARCEL !

                  Dans ce cas il suffit de remplacer :

                     copie.Value = StrConv(cel.Value, vbProperCase) & " " & _
                                   StrConv(cel.Offset(0, 1).Value, vbUpperCase)
                  

                  Par

                     copie.Value = StrConv(cel.Value, vbUpperCase) & " " & _
                                   StrConv(cel.Offset(0, 1).Value, vbProperCase)


                  Sinon il suffit de remettre le prénom en premier et le nom en second !

                  Cordialement
                  Patrice

                  PS : Sois plus précise dans tes prochaines demandes, il a fallu deviner que tu voulais des majuscules !
                  0
                  1. Bonjour,
                    il ne fallait pas deviner puisque j'avais effectivement fait cette erreur.
                    votre réponse était en adéquation avec ma demande (du moment).
                    Merci de votre aide..............par ailleurs personne n'est parfait et une erreur est possible.
                    Maguy
                    0
                2. Re bonjour

                  j'ai de nouveau un petit problème avec le code
                  un message me dit " erreur de compilation projet ou bibliothèque introuvable"

                  cela "coince" ou c'est en gras!

                  Dim rng As Range
                  Dim cel As Range
                  Dim copie As Range
                  Set copie = Worksheets("appelundi8").Range("A6:A37") '1ère cellule destination
                  Set rng = Worksheets("listeappel").Range("B4:B39") '1ère cellule noms
                  With rng
                  Set rng = .Resize(.End(xlDown).Row - .Row + 1) 'Liste des prénoms
                  End With
                  For Each cel In rng.Cells
                  copie.Value = StrConv(cel.Value, vbUpperCase) & " " & _
                  StrConv(cel.Offset(0, 1).Value, vbProperCase)
                  Set copie = copie.Offset(1)
                  Next

                  Patrice, pouvez -vous m'aider encore !
                  si vous avez besoin d'autres renseignements dites-le moi
                  merci d'avance
                  Maguy
                  0
                  1. Bonjour,

                    j'ai encore un petit souci ...........de taille !
                    en effet en rentrant le code que Patrice m'a proposer, et qui fonctionne parfaitement, j'ai constater que mon fichier avait grossi dans des proportions "hallucinantes".

                    je suis passée de quelques centaines d'octets à plus de 5Mo.
                    n'y aurait-il pas un code moins gourmand en ressources ?
                    ou bien est-ce tout à fait normal ?

                    merci de me renseigner
                    Maguy
                    0
                    1. Bonjour Maguy,

                      Cela ne vient pas du code, je viens de vérifier, ce code occupe à peine plus de 3 ko supplémentaires

                      Je te propose de repartir sur un fichier propre :
                      - ouvre un nouveau fichier
                      - copie les informations et formules de ton fichier (seulement la zone utilisée) sur la nouvelle feuille.
                      - copie aussi le code
                      - enregistre ce fichier

                      Sinon peux-tu mettre une copie sur http://cijoint.fr/

                      Cordialement
                      Patrice
                      0
                      1. bonjour,
                        merci tout d'abord, mais ce qui m'inquiète un peu c'est que dans mon application j'ai beaucoup de liens et je risque de compliquer la chose !
                        voir de ne plus avoir le dynamisme et l'intéractivité que j'ai déjà
                        Maguy
                        0
                      2. Re

                        En tous cas cela ne vient pas du code.

                        Peut-être as tu étendu des formules sur la totalité d'une colonne au lieu de limiter au strict nécessaire, ou alors tu as inséré des images, ...
                        Pour le confirmer, il te suffit de sauvegarder le code dans un fichier .txt (bloc note), de l'effacer du fichier Excel et d'enregistrer pour voir la taille sans le code.

                        patrice
                        0
                      3. Bonjour,......encore moi
                        l'idée que le code s'applique à toute la colonne de copiage est une idée qui pourrait être la bonne.
                        mais si je change les cellules, j'obtiens qqchose de très bizarre
                        Dim rng As Range
                        Dim cel As Range
                        Dim copie As Range
                        Set copie = Worksheets("appelundi8").Range("A6:A40") '1ère cellule destination
                        Set rng = Worksheets("listeappel").Range("B4:B38") '1ère cellule noms
                        With rng
                        Set rng = .Resize(.End(xlDown).Row - .Row + 1) 'Liste des prénoms
                        End With
                        For Each cel In rng.Cells
                        copie.Value = StrConv(cel.Value, vbUpperCase) & " " & StrConv(cel.Offset(0, 1).Value, vbProperCase)
                        Set copie = copie.Offset(1)
                        Next

                        pour la 1ère liste, qd je rentre cela, les 2 premiers noms rentrent bien mais le 3e est répéter jusqu'à la ligne A40. Or si il n'y a pas de noms il ne devrait rien y avoir.
                        Qu'ai-je encore oublié de vous donner comme infos ; cela vient peut-être de là. j'ai peut-être oublié de vous le préciser ??????,
                        Maguy
                        0
                    2. Re,

                      Je pense que tu as mal compris, dans mon poste du 7 sep 2010 à 14:37
                      je t'ai dis que copie et rng doivent être des cellules uniques (pas A6:A40 mais A6, pas B4:B38 mais B4)

                      Quand je parle d'« étendre des formules sur la totalité d'une colonne au lieu de limiter au strict nécessaire » c'est sur la feuille de calcul, pas dans la macro !

                      Comme je te l'ai dis précédemment : cela ne vient pas du code (de la macro)

                      Cordialement
                      0
                      1. Bonjour Patrice, j'avais compris ce que vous m'avez dit, mais comme ce n'est pas une formule excel que l'on peut copier sur des cellules choisie, je ne comprend pas comment "étendre des formules sur la totalité d'une colonne au lieu de limiter au strict nécessaire ». C'est dans la macro que l'on détermine les cellules concernées ? je suis surement incompétente, mais je ne comprend pas du tout ce que vous voulez dire !
                        Expliquez moi sur mon exemple donné à quoi vous faites allusion.
                        Pardon et merci encore
                        http://www.cijoint.fr/cjlink.php?file=cj201009/cijVg3XmGt.xls
                        0
                    3. Bonsoir maguy,

                      J'essayais de répondre à «je suis passée de quelques centaines d'octets à plus de 5Mo.»

                      Le fichier que tu mets en exemple ne reflète en rien le problème, il fait à peine 43 ko (macro comprise).

                      J'ai donc mis 2500 noms et les prénoms correspondants (les personnes ont en général 2 à 3 prénoms) sur la feuille «données».

                      J'ai effacé les données de la feuille «copie» et j'ai enregistré le fichier : il fait 219 ko
                      Après avoir exécuté la macro et enregistré le fichier : la taille passe à 318 ko

                      Cela me semble cohérent puisque cette macro dédouble les informations de la feuille «données» vers la feuille «copie».

                      Je ne comprends pas pourquoi ton fichier passe de quelques dix millièmes de Mo à 5 Mo. Sa taille serait multipliée par 50 000 !!!.
                      Il est possible que lors des essais de mise au point de la macro tu aies multiplié la taille du fichier en copiant des données un peu partout.

                      Fait comme moi : repart à zéro à partir de ton fichier exemple.

                      Cordialement
                      Patrice
                      0
                      1. Bonjour, je reviens pour vous remercier de vos conseils qui m'ont permis de réaliser les améliorations dans mon applications. J'ai tout repris à 0, et maintenant tout est rentré dans l'ordre. Je ne sais pas ce qui c'est passé???????????? mais ça MARCHE
                        merci encore
                        Maguy
                        0
                      2. De rien, avec plaisir
                        0