Partage
  • Partager sur Facebook
  • Partager sur Twitter

Automatiser un copié collé

Sujet résolu
    19 janvier 2021 à 15:43:39

    Bonjour, Je ne connais pas du tout la syntaxe VBA du coup j'ai besoin d'aide.

    J'ai un tableau avec des valeurs que je dois copié puis collé dans une autre feuille mais disposé de manière différentes (voir capture d'écran)

    Je vois à peu près la logique du code qu'il faudrait que je fasse mais comme je n'ai jamais fait de code en VBA j'ai beaucoup de mal avec la syntaxe.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2021 à 19:14:47

      Enregistre la macro des opérations que tu fais, ça devrait donner une bonne base pour commencer.

      Pour enregistrer la macro, aller dans l'onglet Développeur, puis bouton "enregistrer une macro"; faire les manipulations, et une fois fini, cliquer à nouveau sur le bouton "arrêter l'enregistrement" et regarder ensuite le code généré automatiquement; qu'il faudra peut-être adapter ensuite

      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2021 à 20:02:03

        umfred a écrit:

        Enregistre la macro des opérations que tu fais, ça devrait donner une bonne base pour commencer.

        Pour enregistrer la macro, aller dans l'onglet Développeur, puis bouton "enregistrer une macro"; faire les manipulations, et une fois fini, cliquer à nouveau sur le bouton "arrêter l'enregistrement" et regarder ensuite le code généré automatiquement; qu'il faudra peut-être adapter ensuite


        Oui c'est ce que j'ai fait, le problème est que ça fonctionne uniquement sur la première ligne, il faudrait que je rajoute une boucle et que le nom des cellules ne soit pas "en dur" car si les valeurs sont dans d'autres cellules que celles enregistré ça ne fonctionne pas.

        Voici le code :

        Sub Macro6()
        '
        ' Macro6 Macro
        '
        
        '
            Range("B1:D1").Select
            Selection.Copy
            Range("G1").Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=True
            Range("A1").Select
            Application.CutCopyMode = False
            Selection.Copy
            Range("F1").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Selection.AutoFill Destination:=Range("F1:F3"), Type:=xlFillDefault
            Range("F1:F3").Select
            Range("B2:D2").Select
            Selection.Copy
            Range("G4").Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=True
            Range("A2").Select
            Application.CutCopyMode = False
            Selection.Copy
            Range("F4").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Selection.AutoFill Destination:=Range("F4:F6"), Type:=xlFillDefault
            Range("F4:F6").Select
        End Sub
        

        Mais comme je l'ai mis plus haut, je ne connais vraiment pas la syntaxe du coup c'est compliqué pour moi de faire les modifications

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2021 à 12:33:15

          La problématique c'est de définir à la fois la sélection de départ et la cellule d'arrivée.
          Si on ne les connais pas à l'avance ou on ne peut pas les déterminer d'une certaine façon avant l'appel à la macro, il faudra décomposer la macro en 2 partie

          1-une macro qui fait la copie, mais bon, ça reviendrai à le faire directement avec un ctrl+c, donc on peut sans doute s'en passer

          2-une macro qui fait l'opération de collage dans la cellule sélectionnée et la mise en forme qui suit.

          Dans ce cas là, la cellule sélectionnée sera accessible via Selection et il faudra donc la ligne dans la macro:

          Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                  False, Transpose:=True


          Nota: dans ta macro enregistré, je pense qu'il n'y a pas uniquement l'opération de transposition (les opérations dans la colonne F par exemple).
          Quand tu enregistres une macro, l'idéal est de ne faire que l'opération recherchée pour ne pas être polluer par le reste.

          Après, peut-être qu'il ne faut pas passer par un copier-coller mais en récupérant les données des lignes pour les remettre ailleurs
          ma proposition :

          -1 macro "recupere" qui stocke les données dans une collection: procédure: sélectionner le tableau à copier et lancer la macro "recupere" via le menu macro

          -1 macro "colle" qui colle le contenu de la collection comme tu le souhaite; procédure sélectionner la cellule en haut à gauche de là où tu veux coller les éléments et lancer la macro "colle" via le menu macro

          Dim mesdonnees As Collection
          
          Sub recupere()
              Dim ligne As Range
              Dim cellule As Range
              Dim i As Integer
              Dim chaine As String
              
              Set mesdonnees = New Collection
              'on parcours chaque ligne de la sélection
              For Each ligne In Selection.Rows
                  'Debug.Print "ligne:" & ligne.Row
                  'Debug.Print "colonne:" & ligne.Column
                  'Debug.Print "nb colonnes:" & ligne.Columns.Count
                  chaine = ""
                  'on génére une chaine des élémens de chaque ligne séparés par un point virgule
                  For i = ligne.Column To ligne.Columns.Count
                      chaine = chaine & Cells(ligne.Row, i).Value & ";"
                  Next i
                  mesdonnees.Add chaine
              Next ligne
          End Sub
          
          Sub colle()
              Dim i As Integer, j As Integer
              Dim tableau
              Dim r As Range
              Set r = Cells(Selection.Row, Selection.Column)
              Debug.Print r.Address
              If Not (mesdonnees Is Nothing) Then
                  For i = 1 To mesdonnees.Count
                      'Debug.Print mesdonnees(1)
                      tableau = Split(mesdonnees(i), ";")
                      
                      For j = 1 To UBound(tableau) - 1
                          r.Offset(j - 1, 0).Value = tableau(0)
                          r.Offset(j - 1, 1).Value = tableau(j)
                      Next j
                      Debug.Print r.Address
                      Set r = r.Offset(j - 1, 0)
                      Debug.Print r.Address
                  Next i
              End If
          
          End Sub
          



          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2021 à 16:16:36

            umfred a écrit:

            La problématique c'est de définir à la fois la sélection de départ et la cellule d'arrivée.
            Si on ne les connais pas à l'avance ou on ne peut pas les déterminer d'une certaine façon avant l'appel à la macro, il faudra décomposer la macro en 2 partie

            1-une macro qui fait la copie, mais bon, ça reviendrai à le faire directement avec un ctrl+c, donc on peut sans doute s'en passer

            2-une macro qui fait l'opération de collage dans la cellule sélectionnée et la mise en forme qui suit.

            Dans ce cas là, la cellule sélectionnée sera accessible via Selection et il faudra donc la ligne dans la macro:

            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                    False, Transpose:=True


            Nota: dans ta macro enregistré, je pense qu'il n'y a pas uniquement l'opération de transposition (les opérations dans la colonne F par exemple).
            Quand tu enregistres une macro, l'idéal est de ne faire que l'opération recherchée pour ne pas être polluer par le reste.

            Après, peut-être qu'il ne faut pas passer par un copier-coller mais en récupérant les données des lignes pour les remettre ailleurs
            ma proposition :

            -1 macro "recupere" qui stocke les données dans une collection: procédure: sélectionner le tableau à copier et lancer la macro "recupere" via le menu macro

            -1 macro "colle" qui colle le contenu de la collection comme tu le souhaite; procédure sélectionner la cellule en haut à gauche de là où tu veux coller les éléments et lancer la macro "colle" via le menu macro

            Dim mesdonnees As Collection
            
            Sub recupere()
                Dim ligne As Range
                Dim cellule As Range
                Dim i As Integer
                Dim chaine As String
                
                Set mesdonnees = New Collection
                'on parcours chaque ligne de la sélection
                For Each ligne In Selection.Rows
                    'Debug.Print "ligne:" & ligne.Row
                    'Debug.Print "colonne:" & ligne.Column
                    'Debug.Print "nb colonnes:" & ligne.Columns.Count
                    chaine = ""
                    'on génére une chaine des élémens de chaque ligne séparés par un point virgule
                    For i = ligne.Column To ligne.Columns.Count
                        chaine = chaine & Cells(ligne.Row, i).Value & ";"
                    Next i
                    mesdonnees.Add chaine
                Next ligne
            End Sub
            
            Sub colle()
                Dim i As Integer, j As Integer
                Dim tableau
                Dim r As Range
                Set r = Cells(Selection.Row, Selection.Column)
                Debug.Print r.Address
                If Not (mesdonnees Is Nothing) Then
                    For i = 1 To mesdonnees.Count
                        'Debug.Print mesdonnees(1)
                        tableau = Split(mesdonnees(i), ";")
                        
                        For j = 1 To UBound(tableau) - 1
                            r.Offset(j - 1, 0).Value = tableau(0)
                            r.Offset(j - 1, 1).Value = tableau(j)
                        Next j
                        Debug.Print r.Address
                        Set r = r.Offset(j - 1, 0)
                        Debug.Print r.Address
                    Next i
                End If
            
            End Sub
            


            Je ne me doutais pas qu'il fallait un code aussi long pour une tache aussi simple mais c'est exactement ce qu'il me fallait 1000 merci !



            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2021 à 17:08:28

              ce n'est pas forcément très long, je déclare toutes mes variables ce qui prend quelques lignes, et j'ai laissé quelques éléments de debug  (tous les debug.print); mais le code est utilisable quelque soit la plage sélectionnée (il faut que les cellules soient au moins dans le même classeur, je n'ai pas testé un copie/colle entre 2 classeurs)

              en version copier/coller avec le presse papier, ça aurait peut-être juste donné pour la transposition (à tester)

              sub alt_recupere()
                  Selection.Copy
              end sub
              
              sub alt_colle()
                  Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                      False, Transpose:=True
              end sub

              il resterai la partie de la 1ère colonne du résultat à faire

              • Partager sur Facebook
              • Partager sur Twitter

              Automatiser un copié collé

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown