Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tranfert de donnée d'un tableau vers un autre.

VBA Excel /Macro

    5 janvier 2021 à 14:38:22

    Bonjour, 

    Avant tout je vous souhaite une bonne année 2021.. Pleins de bonne chose et de réussite!.

    Je suis en train de travailler sur un projet, et je suis totalement bloqué car je suis débutant en VBA Excel.. Je ne sais pas par où commencer.

    En faite, j'ai deux tableaux de suivis de commande , et le but c'est que lorsque l'on remplit un tableau , on récupère chacune des données et on les ajoutent dans l'autre tableau à la suite, en ne récupérant uniquement les données nécessaires car les deux tableaux sont différents et ils ont uniquement certaines données en commun.  En gros ce que je veux , c'est que lorsque l'on ajoute une donnée dans le tableau elle vient directement dans l'autre aussi à la suite.. Cela permettrait en faite d'éviter de remplir deux fois les mêmes données, c'est une perte de temps.

    Merci de votre aide 

    Cordialement 

    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2021 à 15:16:56

      tes tableaux ce sont 2 fichiers excel différents ou 2 onglets d'un même fichier ?

      Est-ce qu'il peut y avoir plusieurs la même ligne dans chaque tableau ?

      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2021 à 16:03:26

        Oui ce sont deux fichiers Excel différents, il se peut qu'il y'est des lignes qui soient similaires, mais ce n'est pas très important, je pense il est pas nécessaire de prendre en compte cela.
        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2021 à 16:22:16

          peut-être en gérant l'événement Worksheet_Change(ByVal Target as Range) (https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.change ) et testant si la Target est dans une des colonnes à copier, et dans ce cas-là, rajouter la valeur dans le second tableau

          Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
              If Target.Column = 1 Then ' cellule modifié dans la colonne A ?
                  'on cherche la dernière ligne non vide de la colonne A du second fichier
                  ' si on cherche à ajouter à cette colonne A du 2ème fichier
                  DernLigne = Workbooks("Fichier2").worksheets("Nom de la feuille").Range("A" & Rows.Count).End(xlUp).Row
                  'on copie la valeur de la cellule 
                  Workbooks("Fichier2").worksheet("Nom de la feuille").cells(DernLigne+1,1) = Target.Value
              End If
              ' et on recommence pour les colonnes à copier
          End Sub


          ce code pourrait servir de base je pense

          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2021 à 16:33:38

            Merci énormément, tu as très bien compris ce que je voulais faire, ça va beaucoup m'aider pour avancer , je reviens vers toi si j'ai des problèmes. MERCI encore une fois

            • Partager sur Facebook
            • Partager sur Twitter
              15 janvier 2021 à 20:22:01

              Bonjour, j'ai un problème lorsque j'effectue le copier coller les données se collent toujours dans la colonne A alors que j'ai bien mis les colonnes correspondantes

              Merci par avance de votre aide

              Bien cordialement 

              -
              Edité par Titanium95 17 janvier 2021 à 15:13:59

              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2021 à 16:28:00

                un copier/coller du code en utilisant la balise d'insertion prévue (bouton </>) c'est mieux pour avoir l'ensemble du code ^^

                Mais sinon c'est normal  que ce soit dans la colonne A, tu indiques la Cellule de ligne DernLigne+1 et de colonne 1 (colonne 1 = colonne A)

                tu peux remplacer Cells(DernLigne+1,1) par range("AG" & DernLigne+1) ou par Cells(DernLigne+1, 33) (la colonne AG est la colonne 33)

                etc pour les autres.

                Astuces: tu peux utiliser le Select Case si tu as plusieurs cas au lieu de multiplier les If (ça ne change pas grand chose hormis que tous les tests ne sont pas réalisés)

                Select Case Target.Column
                    Case 1:
                        ..'code pour Target.Column =1
                    Case 5:
                        ..'code pour Target.Column =5
                    Case 9:
                        ..'code pour Target.Column =9
                    Case 17:
                        ..'code pour Target.Column =17
                End Select



                -
                Edité par umfred 18 janvier 2021 à 16:28:24

                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2021 à 14:05:09

                  Bonjour,

                  tout d'abord merci pour ta réponse, oui effectivement, j'ai pas mis la bonne colonne pour les autres données :D..

                  Mais j'ai découvert un problème, lorsque je rentre la première donné le tableau du second augmente de une ligne, ainsi lorsque je rentre les autres données, elles vont être décaler sur le second car il va considérer les cases vides comme dernière ligne (tu vois ce que je veux dire) , ainsi pour remédier à cela , j'ai mis pour la première donnée DernLigne + 1, et pour les autres j'ai mis DernLigne uniquement , mais de cette manière ça exige que la première donnée entrée par l'utilisateur soit celle inscrite au niveau du code.. J'espère que tu comprends ce que je veux dire :).

                  De plus, imaginons que l'utilisateur se trompe et qu'il veuille modifier la cellule , il va considérer ce changement comme si on voulait ajouter une autre donnée dans la colonne correspondante et s'ajouter à la suite de cette dernière, alors que on veut juste modifier la cellule en question 

                  J'espère que tu pourras m'éclairer 

                  Cordialement 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 janvier 2021 à 14:23:52

                    Pour déterminer la dernière ligne, dans le cas où il y des lignes vides ,  on peut changer le range en prenant la cellule A655365 (par exemple) et on remonte vers le haut:

                    DernLigne = Workbooks("Fichier2").worksheets("Nom de la feuille").Range("A65535").End(xlUp).Row


                    Dans le cas d'une modification de cellule, c'est plus compliqué en effet. Là, tout de suite, je n'ai pas d'idées de comment le faire de manière totalement sûr, à part que l'utilisateur supprime lui même la ligne dans le 2nd tableau avant ou après.

                    ou de faire une macro function de modification (qui empêcherait la macro worksheet_change le temps de faire la modification par elle même par exemple).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 janvier 2021 à 8:36:07

                      Bonjour, merci pour les réponses que tu as apportées, tu m'as beaucoup aidé.

                      Maintenant j'ai avancé dans le projet et je souhaite recherché dans une colonne si il y'a oui (en faite dans cette colonne il peu y avoir soit oui soit non), si c'est le cas alors on met en place le procédure de copiage (pour la ligne en question) sinon on fait rien. Est-ce que il y'a une méthode pour recherche dans une colonne ? J'ai vu sur internet : find; rechercheV ... Mais je me demande laquelle est la plus pertinente, j'aurais juste besoin de la première ligne de code , si Col="OUI" alors..PS: le tableau en question est amener à grandir, donc il faut que ça marche peu importe le nombre de ligne 

                      Cordialement 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 janvier 2021 à 10:59:28

                        je pense que Range.Find serait la plus pertinente

                        Dim Cellule as range
                        Set Cellule = range("D1:D65535").find("oui", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns)
                        if not (Cellule is Nothing) then
                        ...
                        end if

                        j'ai mis une valeur fixe (et grande) dans le range, mais si la colonne est forcément rempli (pas de ligne vide entre le début et la fin),  un Range( range("D1"), range("D1").End(xlDown) devrait faire l'affaire (D1 étant la première cellule remplie de la colonne à tester)

                        Nota: on peut préciser sur quoi se fait les ranges comme je l'ai fait précédemment (cf mes codes précédents) =>  [classeur].[feuille].range si besoin 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 janvier 2021 à 11:40:59

                          Merci beaucoup pour ta réponse apporté , j'ai essayé de mon côté et j'ai implémenter ça : 

                          Private Sub Worksheet_Change(ByVal Target As Excel.Range)
                             If Target.Column = "35" Then
                              RowSel = Target.Row
                              If WorksheetFunction.And(Target.Value = "Oui") Then
                                  DernLigne = Workbooks("Registre Gestion 2019").Worksheets("Facture").Range("A" & Rows.Count).End(xlUp).Row
                                  Cells(RowSel, 33) = Workbooks("Registre Gestion 2019").Worksheets("Facture").Cells(DernLigne, 1)
                                  Workbooks("Registre Gestion 2019").Worksheets("Facture").Cells(DernLigne, 5) = Cells(RowSel, 14)
                                  Workbooks("Registre Gestion 2019").Worksheets("Facture").Cells(DernLigne, 9) = Cells(RowSel, 32)
                                  Workbooks("Registre Gestion 2019").Worksheets("Facture").Cells(DernLigne, 15) = Cells(RowSel, 34)
                                  Workbooks("Registre Gestion 2019").Worksheets("Facture").Cells(DernLigne, 18) = Cells(RowSel, 19)
                              End If
                             End If
                          End Sub
                          
                          

                          Qu'en penses-tu ? :D


                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 janvier 2021 à 11:58:55

                            ta macro se déclenche quand tu changes la valeur d'une cellule de la feuille contenant ce code et fais les modifs si la valeur modifiée est dans la colonne AI (35) que vaut "Oui" (si c'est "OUI" ou "oui" pas sûr que ça fonctionne, je ferai un If LCase(Target.Value) = "oui" Then .... pour avoir toutes les possibilités de "oui",  "oUi", "OUi", etc


                            Après je ne vois pas l'utilité de l'utilisation de WorksheetFunction.And(). Si tu dois comparer plusieurs valeurs le And (ou Or) classique est suffisant, mais ici tu n'en as pas besoin. 

                            Target.Column renvoie un entier long, donc retire les guillemets autour de 35, sinon ça ne marchera pas (ah si ça marche en fait mais ce n'est pas trop logique (concordant) au niveau des types de variable)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 janvier 2021 à 12:33:44

                              Concernant le premier point, par rapport au "oui" dans le tableau et sur cette colonne le contenu est imposé , il doit sélectionner soit oui soit non. :D Sinon mon programme fait bien ce que je lui demande, après je pense qu'il reste à améliorer.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Tranfert de donnée d'un tableau vers un autre.

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              • Editeur
                              • Markdown